Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Tibco EMS会话共享连接对象_C#_Tibco_Ems - Fatal编程技术网

C# Tibco EMS会话共享连接对象

C# Tibco EMS会话共享连接对象,c#,tibco,ems,C#,Tibco,Ems,我们与EMS代码的连接最初设计得很糟糕,我们听的每个主题都创建了一个TopicConnection对象。因此,实际上,每当我们订阅一个主题时,我们都会创建一个新的连接、一个新的会话,最后是一个新的侦听器 我们想切换到单连接模式。虽然通过共享一个连接对象并为每个主题创建一个新的会话对象,我可以在代码中轻松做到这一点,但我们不确定如果没有代码,这是否会导致任何问题 我的理解是,就共享连接而言,Tibco EMS客户端库是线程安全的。实际上,连接只是一个管道,会话可以以线程安全的方式恢复该管道 这个假

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

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

我的理解是,就共享连接而言,Tibco EMS客户端库是线程安全的。实际上,连接只是一个管道,会话可以以线程安全的方式恢复该管道


这个假设正确吗?或者还有更多的吗?

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

NET EMS API基于。在JMS中,连接和会话对象被指定为线程安全的,并且可以在程序中重用。您完全正确,因为Connection对象只是表示到EMS服务器的网络管道。《EMS用户指南》规定:

连接是一个相当重的对象,因此大多数客户机都会创建一次连接,并将其保持打开状态,直到客户机退出。如果需要,应用程序可以创建多个连接

关于会议:

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

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

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


请确保在使用完创建的任何对象后清理它们,例如,完成后关闭主题使用者对象、会话和连接。在与预回迁和容错重新连接设置结合使用时,在不关闭句柄的情况下泄漏句柄可能会导致不可预测的行为。

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

然后为每个线程创建并使用一个会话。请记住,当您关闭()会话时,它将阻塞,直到所有receive回调真正返回为止。因此,不要从回调函数的onMessage()中调用close()