`
suoyihen
  • 浏览: 1359994 次
文章分类
社区版块
存档分类
最新评论

使用Java进行CORBA编程-JacORB-Notification Service

 
阅读更多
上一篇介绍了CORBA的Event Service,
http://blog.csdn.net/fw0124/article/details/7192305
它是一个很好的消息分发机制,但是它也有以下弱点:
1)缺乏消息过滤机制(No filtering)。
2)缺乏QoS机制(No Quality of Service)。
3)Consumer不知道存在的Supplier,也不知道Supplier提供何种Event。反之亦然。
4)Event以Any形式发送,缺乏结构化的数据。

Notification Service扩展了Event Service的功能,克服了以上缺点。
可以参考以下这些IDL文件($JacORB_INSTALL_DIR/idl/omg/文件夹下)来了解Notificaton Service的体系结构。
CosNotification.idl
CosNotifyFilter.idl
CosNotifyComm.idl
CosNotifyChannelAdmin.idl


Structured Events

Notification Service提供了结构化的Event类型StructuredEvent。


Filtering
一个Filter中可以加入多个constraints,这些constraints之间用OR来连接。

Consumer

在CosNotifyComm这个名字空间下,重新定义了PushConsumer/PullConsumer这个接口,
保留对Any类型的Event的支持,
另外增加了StructuredPushConsumer/StructuredPullConsumer,
以及SequencePushConsumer/SequencePullConsumer这几个接口,
分别来处理StructuredEvent和StructuredEvent的Sequence。

Supplier

类似Consumer,增加了对StructuredEvent的支持。

ProxyConsumer

类似地,重新定义了Consumer的Proxy类,以加了对StructuredEvent的支持,
以及对Filter和QoS的支持。

ProxySupplier

类似地,重新定义了Supplier的Proxy类,以加了对StructuredEvent的支持,
以及对Filter和QoS的支持。

ConsumerAdmin/SupplierAdmin

ConsumerAdmin和SupplierAdmin也被重新定义,同样增加了对Filter和QoS的支持。

EventChannel

重新定义了EventChannel接口,增加了EventChannel的工厂类。

多个Filter之间的运算关系
前面提到一个Filter中可以加入多个constraints,这些constraints之间用OR来连接。
从上面的类图可以看出,Proxy和Admin的接口同样继承了Filter接口。
多个Filter之间的运算结果是怎么决定的呢?
首先在Proxy内部进行计算,同一个Proxy中的多个Filter之间是用OR来连接运算结果的。
然后在Admin内部进行计算,同一个Admin中的多个Filter之间也是用OR来连接运算结果的。
Proxy的运算结果,然后再和Admin的运算结果,按照Admin对象的MyOperator来决定最后的结果。
MyOperator是一个InterFilterGroupOperator的枚举类型,包括AND_OP和OR_OP这2个类型,
分别对应AND和OR逻辑运算符。

使用NotificationService的方法
使用NotificationService的方法和使用Event Service的步骤基本类似。
(EventService的使用步骤->http://blog.csdn.net/fw0124/article/details/7192305

下面以push mode为例进行说明。
Server侧(Supplier)
1)创建一个类,继承自StructuredPushSupplierPOA,这个类就是Server侧的Supplier的实现类。
2)在ORB对象上调用resolve_initial_references("NotificationService")获得EventChannelFactory这个工厂类对象的引用。
然后使用这个工厂类的create_channel()方法,创建一个EventChannel对象,
然后向NameService注册这个Channel,注册时提供一个Channel名。
3)调用EventChannel对象的default_supplier_admin()或者new_for_suppliers()方法,得到一个SupplierAdmin对象。
4)调用SupplierAdmin对象的obtain_notification_push_consumer()方法,传入ClientType的参数,
这里用STRUCTURED_EVENT,得到一个StructuredProxyPushConsumer对象。
5)创建1)中的Supplier的实现类的一个实例。
在上面4)得到的StructuredProxyPushConsumer对象上调用connect_structured_push_supplier()方法,
把Supplier的实现类的实例传给此方法。
6)现在Server侧已经连接到Event Channel,可以调用StructuredProxyPushConsumer对象的push_structured_event()方法来发送事件通知给Channel了。

Client侧(Consumer)
1)创建一个类,继承自StructuredPushConsumerPOA,这个类就是Client侧的Consumer的实现类。
这个类的push_structured_event()方法,在Event Channel发送事件通知过来的时候会被调用。
在这里添加对事件通知的处理代码。
2)向NameService查询并获得Event Channel的引用(EventChannel对象),查询时需要提供Server侧注册时使用的Channel名。
3)调用EventChannel对象的default_consumer_admin()或者new_for_consumers()方法,得到一个ConsumerAdmin对象。
可以向ConsumerAdmin对象添加Filter。
4)调用ConsumerAdmin对象的obtain_notification_push_supplier()方法,传入ClientType的参数,
这里用STRUCTURED_EVENT,得到一个StructuredProxyPushSupplier对象。
可以向StructuredProxyPushSupplier对象添加Filter。
5)创建1)中的Consumer的实现类的一个实例。
在上面4)得到的StructuredProxyPushSupplier对象上调用connect_structured_push_consumer()方法,
把Consumer的实现类的实例传给此方法。
6)现在Client侧也已经连接到Event Channel。
这时候如果Server侧(Supplier)发送事件通知,Consumer的实现类的push_structured_event()方法就会被调用了。

运行NotificationService的例子,见下一篇:
使用Java进行CORBA编程-JacORB-Notification Service(2)
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics