Publicador de eventos#

Para el primer ejemplo de uso de IceStorm, vamos a utilizar un viejo conocido: nuestro querido ejemplo de “Hello World”.

La interfaz Slice ya la conocemos muy bien:

module Example {
  interface Printer {
    void write(string message);
  };
};

Modificando el cliente#

Para este ejemplo, modificaremos el cliente que hemos utilizado anteriormente, añadiendo soporte para IceStorm.

Primero, debemos proporcionar al programa el proxy al servicio IceStorm/TopicManager. Como su propio nombre indica, ese servicio se encarga de la gestión de “topics”: creación, destrucción y recuperación del proxy a los mismos.

Para ello, añadiremos unas líneas como las siguientes:

topic_manager_str_prx = "IceStorm/TopicManager -t:tcp -h localhost -p 10000"
topic_manager = IceStorm.TopicManagerPrx.checkedCast(
    self.communicator().stringToProxy(topic_manager_str_prx),
)

Una vez hecho lo siguiente, podemos realizar operaciones de gestión sobre los topics, cómo haremos a continuación:

topic_name = "PrinterTopic"
try:
    topic = topic_manager.create(topic_name)
except IceStorm.TopicExists:
    topic = topic_manager.retrieve(topic_name)

Por último, antes de realizar invocaciones tenemos que recuperar un publisher del topic, con el fin de enviar nuestras invocaciones al mismo:

publisher = topic.getPublisher()
printer = Example.PrinterPrx.uncheckedCast(publisher)

A partir de este punto, ya estamos listos para utilizar el objeto printer. Cada invocación al mismo resultará en un mensaje enviado al topic, y si hay algún sirviente de la interfaz subscrito al mismo, recibirá las invocaciones que realicemos.

Ejemplo completo#

Para ejecutar el siguiente ejemplo no es necesario ningún fichero de configuración adicional.

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys

import Ice
import IceStorm

Ice.loadSlice('Printer.ice')
import Example


class Publisher(Ice.Application):
    def run(self, argv):
        topic_manager_str_prx = "IceStorm/TopicManager -t:tcp -h localhost -p 10000"
        topic_manager = IceStorm.TopicManagerPrx.checkedCast(
            self.communicator().stringToProxy(topic_manager_str_prx),
        )

        if not topic_manager:
            raise RuntimeError("Invalid TopicManager proxy")

        topic_name = "PrinterTopic"
        try:
            topic = topic_manager.create(topic_name)
        except IceStorm.TopicExists:
            topic = topic_manager.retrieve(topic_name)

        publisher = topic.getPublisher()
        printer = Example.PrinterPrx.uncheckedCast(publisher)

        if not printer:
            raise RuntimeError("Invalid publisher proxy")

        printer.write('Hello World!')

        return 0


sys.exit(Publisher().main(sys.argv))