分享

Icestorm from python

 LibraryOfKevin 2011-08-16

Icestorm是一个高效的用于ICE应用的发布/订阅服务,IceStorm有几个比较重要的概念:

2 消息:IceStorm的消息和普通的消息队列中间件中描述的消息有点区别,IceStorm 的消息是强类型的,由对某个Slice 操作的调用代表:操作名标识消息的类型,操作参数定义消息内容。要发布消息,可以按普通的方式调用某个IceStorm 代理上的操作。与此类似,订阅者会像收到常规的向上调用(upcall)一样收到消息。所以IceStorm 的消息递送使用的是“推”模式

2 主题:应用要通过订阅某个主题(topic)来表明自己有兴趣接收某些消息。IceStorm 服务器能够支持任意数量的主题,这些主题是动态创建的,通过唯一的名字来区分。每个主题都可以有多个发布者和订阅者。

2 持久模式:IceStorm 拥有一个数据库,里面维护的是关于其主题和链接的信息。但是,通过IceStorm 发送的消息不会被持久地存储,而是会在递送给主题目前的订阅者集之后,马上被丢弃。如果在把消息递送给某个订阅者的过程中发生错误, IceStorm 不会为该订阅者进行消息排队。

2 订阅者出错:因为IceStorm 消息是采用单向语义递送的, IceStorm 只能检测到连接或超时错误。如果在把消息递送给订阅者的过程中, IceStorm 遇到这样的错误,该订阅者就会立刻被解除与该消息对应的主题的订阅。当然用户在使用过程中也可以通过设定QOS参数来改善这个问题,比如重试次数(retryCount),但是对于ObjectNotExistException 或者NotRegisteredException之类的硬错误,Ice运行时不会重试,而是仍然直接解除订阅关系。

 


 

 service.py

 

  1. #!/bin/env python  
  2. #_*_encoding:gbk_*_  
  3.    
  4.   
  5. import os  
  6. import Ice  
  7. import IceStorm  
  8. import sys  
  9.    
  10. Ice.loadSlice('Hello.ice')  
  11.    
  12. import Demo  
  13.    
  14. #创建通讯器  
  15. ic=Ice.initialize()  
  16.    
  17. #创建适配器  
  18. adapter=ic.stringToProxy('DemoIceStorm/TopicManager:default -p 20000')  
  19.    
  20. #得到主题管理  
  21. manager=IceStorm.TopicManagerPrx.checkedCast(adapter)  
  22.    
  23. #主题消息  
  24. topicName = "msg"  
  25.    
  26. #得到所有消息  
  27. allmsg=manager.retrieveAll()  
  28.    
  29. #如果不存在,创建消息主题  
  30. if not topicName in allmsg:  
  31.  topic=manager.create(topicName)  
  32. else:  
  33.  topic=manager.retrieve(topicName)  
  34.    
  35. #得到发布适配器  
  36. publisher = topic.getPublisher()  
  37.    
  38. #由普通适配器变成发送消息适配器  
  39. msg = Demo.HelloPrx.uncheckedCast(publisher)  
  40. msg.sayHello("hello %s" %(' '.join(sys.argv)))  
  41.    
  42. if ic:  
  43.  ic.destroy()  

client.py

  1. #!/bin/env python  
  2. #_*_encoding:gbk_*_  
  3.   
  4.   
  5. import os  
  6. import Ice  
  7. import IceStorm  
  8. import sys  
  9.   
  10. Ice.loadSlice('Hello.ice')  
  11.   
  12. import Demo  
  13.   
  14. #创建处理类开始  
  15. class HelloI(Demo.Hello):  
  16.  def sayHello(self, msg, current=None):  
  17.   print "Hello World!",msg  
  18.       
  19.  def shutdown(self, current=None):  
  20.   current.adapter.getCommunicator().shutdown()  
  21.           
  22.            
  23.   
  24. #创建通讯器  
  25. ic=Ice.initialize()  
  26.   
  27. #创建适配器  
  28. adapter0=ic.stringToProxy('DemoIceStorm/TopicManager:default -p 20000')  
  29.   
  30. #得到主题管理  
  31. manager=IceStorm.TopicManagerPrx.checkedCast(adapter0)  
  32.   
  33. #主题消息  
  34. topicName = "msg"  
  35.   
  36. #得到所有消息  
  37. allmsg=manager.retrieveAll()  
  38.   
  39. #如果不存在,创建消息主题  
  40. if not topicName in allmsg:  
  41.  topic=manager.create(topicName)  
  42. else:  
  43.  topic=manager.retrieve(topicName)  
  44.   
  45. #创建自己hello  
  46. adapter = ic.createObjectAdapterWithEndpoints("SimperHello","default -p 20002")  
  47. #adapter = ic.createObjectAdapter("IceStorm.Publish")  
  48. subId = Ice.Identity()  
  49. subId.name = Ice.generateUUID()  
  50.   
  51. subscriber = adapter.add(HelloI(), subId)  
  52.   
  53. qos = {'reliability':'ordered'}  
  54.   
  55. #subscriber = subscriber.ice_datagram()  
  56.   
  57. topic.subscribeAndGetPublisher(qos, subscriber)  
  58.   
  59. adapter.activate()  
  60. ic.waitForShutdown()  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多