Comunicación indirecta con ZeroC ICE: IceStorm#
En esta sesión vamos a utilizar el servicio de canales de eventos del middleware para realizar comunicaciones indirectas de uno a muchos.
En ICE existen varios mecanismos de comunicación indirecta:
Endpoints IP multicast, que utilizan las capacidades multicast de las redes IP para poder enviar una determinada invocación remota a varios sirvientes que se han suscrito previamente a ese endpoint multicast.
El servicio IceStorm, que permite la creación de diferentes canales de eventos (topics), a los cuáles los sirvientes pueden suscribirse para recibir las invocaciones.
En ambos casos la comunicación cuenta con una restricción: sólo pueden usarse comunicaciones de una sola dirección, por lo que no se permite que las invocaciones tengan valor de retorno o lancen posibles excepciones.
Ésto es así porque al tratarse de invocaciones remotas a métodos, si tuvieran valor de retorno o una excepción, ¿cómo debería manejar el cliente los diferentes valores o errores recibidos para obtener un único valor?
Mecanismo de funcionamiento de IceStorm#
Cuando un servicio quiere realizar invocaciones a través de IceStorm para que varios sirvientes puedan recibir la misma invocación, primero debe obtener una referencia a un topic.
En ICE, todo se representa a través de interfaces Slice y de métodos remotos,
por lo que desde el punto de vista de ese programa,
el topic será un proxy de tipo IceStorm.TopicPrx
.
El proxy al topic puede recuperarse si conocemos su versión “string”, como siempre,
pero lo más habitual es recuperar dicha referencia desde el propio servicio IceStorm,
a través de la interfaz IceStorm.TopicManager
.
El topic, entre otras operaciones, nos permite solicitar un publisher o subscribir un proxy al topic.
El publisher es un objeto de tipo
Ice.Object
que permite mandar invocaciones al topic. Dicho objeto puede ser convertido al tipo que necesitemos a través de llamadas auncheckedCast
.Los subscribers serán nuestros sirvientes, a los que subscribiremos al topic.
El programa que quiere realizar la invocación, realizará los siguientes pasos:
Recuperará el proxy al topic desde el topic manager.
Solicitará un objeto publiser al topic.
Realizará una conversión del publisher al tipo deseado con
uncheckedCast
.Comanzará a usar el proxy del publisher ya convertido, realizando las invocaciones que desee.
Los programas que quieran subscribirse a un topic, necesitarán hacer lo siguiente:
Recuperará el proxy al topic desde el topic manager.
Subscribirá el proxy del sirviente, previamente añadido al adaptador de objetos, al topic.