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 a uncheckedCast.

  • Los subscribers serán nuestros sirvientes, a los que subscribiremos al topic.

El programa que quiere realizar la invocación, realizará los siguientes pasos:

  1. Recuperará el proxy al topic desde el topic manager.

  2. Solicitará un objeto publiser al topic.

  3. Realizará una conversión del publisher al tipo deseado con uncheckedCast.

  4. 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:

  1. Recuperará el proxy al topic desde el topic manager.

  2. Subscribirá el proxy del sirviente, previamente añadido al adaptador de objetos, al topic.