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))