Tibco EMS会话共享连接对象

Szy*_*zga 4 c# tibco ems

我们与EMS代码的连接最初设计不合理,并且我们收听了每个主题的一个TopicConnection对象.因此,实际上,每当我们订阅主题时,我们都会创建一个新连接,一个新会话,最后一个新的侦听器.

我们想切换到单一的连接模型.虽然我能够通过共享一个连接对象,并建立每个主题一个新的会话对象在我们的代码要做到这一点很容易,我们不能确定这是否会造成任何问题,而代码.

我的理解是Tibco EMS客户端库在共享连接方面是线程安全的.实际上,连接只是一个管道,会话可以以线程安全的方式重用此管道.

这个假设是正确的还是还有更多?

Pav*_*vel 7

.NET EMS API基于JMS.在JMS中,Connection和Session对象被指定为线程安全的,可以在程序中重用.您完全正确,因为Connection对象只是表示EMS服务器的网络管道.EMS用户指南指出:

连接是一个相当重量级的对象,因此大多数客户端将创建一次连接并保持打开直到客户端退出.如有必要,您的应用程序可以创建多个连接.

关于会议:

Session是用于生成或使用消息的单线程上下文.您可以使用Session对象创建Message Producers或Message Consumers.

基本上,除非您需要非常大的数量并且遇到性能限制,否则在应用程序中仅使用一个连接是完全安全的.会话控制在其中创建的任何生产者或消费者的事务/确认语义,但再次可以安全地重用.对于具有不同生命周期的应用程序中存在的模块,我可能会使用单独的会话(在应用程序服务器中考虑单独的部署单元).

您的EMS服务器安装将包含带有各种代码的示例目录(类似于C:\ tibco\ems\5.0\samples\cs).csTopicSubscriber.cs中的代码显示了如何编写单线程主题使用者.没有多线程主题使用者示例,但csMsgConsumerPerf.cs演示了如何使用队列执行此操作.

确保在完成之后清理您创建的任何对象 - 例如,在完成后关闭主题使用者对象,会话和连接.与预取和容错重新连接设置结合使用时,泄漏句柄而不关闭它们会导致不可预测的行为.