4

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

我们想切换到单一连接模型。尽管我可以通过共享一个连接对象并为每个主题创建一个新的会话对象在我们的代码中轻松地做到这一点,但我们不确定这是否会在没有代码的情况下导致任何问题。

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

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

4

3 回答 3

8

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

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

关于会话:

Session 是用于生产或消费消息的单线程上下文。您可以使用 Session 对象创建消息生产者或消息消费者。

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

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

请务必在完成后清理您创建的所有对象 - 例如,在完成后关闭主题消费者对象、会话和连接。当与预取和容错重新连接设置结合使用时,如果不关闭它们而泄漏句柄可能会导致不可预知的行为。

于 2011-01-02T13:31:29.427 回答
0

我认为是的,只要共享在同一个应用程序(exe,二进制)中。我们共享了相同的连接对象,并在我们的代码中将其用作单例。

于 2010-12-30T06:23:28.577 回答
0

同意较早的答案:JMS Session 不能在线程之间共享,但 Connection 可以/应该是。所以每个应用程序一个连接是可以的(确保你只启动/关闭一次 - 最好在创建单个线程之前/之后)。

然后为每个线程创建和使用一个 Session。请记住,当您 close() 会话时,它将阻塞,直到所有接收回调都真正返回。所以不要在回调的 onMessage() 中调用 close()。

于 2012-04-17T09:55:39.473 回答