MQ 是不是仍然有每个线程连接的限制?

Posted

技术标签:

【中文标题】MQ 是不是仍然有每个线程连接的限制?【英文标题】:Does MQ still have a limitation of per-thread connections?MQ 是否仍然有每个线程连接的限制? 【发布时间】:2015-03-28 10:45:34 【问题描述】:

上次我在愤怒中使用 MQ(v6,从内存,在 HPUX 平台上)时,存在一个限制,即无法在进程内的线程之间共享连接。

如果您尝试从一个已经连接到队列管理器的线程执行另一个MQCONN,它会很快返回之前的句柄并警告说它正在重新使用它因此,只要您正确管理共享连接,单个线程就可以有效地与同一个队列管理器建立多个连接。

但是,如果您尝试从进程中的一个 不同 线程进行连接,则会给您一个不同的连接句柄,这会带来所有的缓慢,因为它必须经历所有的繁琐IPC、安全检查、运行另一个代理线程或进程等等。

我问这个问题的原因是,客户端已经看到了一种架构,其中线程是按需创建的(Windows 下的 C#),它们都将尝试连接到同一个队列管理器。他们提议运行 MQ 7.5,如果相关的话。

所有线程都将使用XMSFactoryFactory 进行连接,据称它提供了 MQ 连接池以提高效率,但是,如果仍然存在每个线程的连接要求并且线程它们自己没有被池化,我'我担心 MQ 连接池可能无用,因为每个新线程都需要一个新连接。

【问题讨论】:

【参考方案1】:

现在可以跨线程共享连接。阅读此link 了解更多信息。

XMS .NET 是 C# 语言的 JMS 规范实现,用于与 IBM MQ 队列管理器进行通信。 XMSFactoryFactory 不提供连接池。

您还应该注意,根据 JMS v1.1 规范,JMS 会话对象及其子对象(生产者、消费者等)不应跨线程共享。

【讨论】:

也许我读错了,但我们有代码可以执行 XMSFactoryFactory ff = XMSFactoryFactory.GetInstance(XMSC.CT_WMQ); IConnectionFactory cf = ff.CreateConnectionFactory(); 并且设置的属性之一是 WMQ_USE_CONNECTION_POOLING(这是来自内存,代码在工作)。 WMQ_USE_CONNECTION_POOLING 属性未记录,因此不应使用。您可以在这里找到所有 XMS .NET ConnectionFactory 属性 - www-01.ibm.com/support/knowledgecenter/SSFKSJ_7.5.0/… @Shashi 还是这样(关于不支持池化)? 是的,还是这样

以上是关于MQ 是不是仍然有每个线程连接的限制?的主要内容,如果未能解决你的问题,请参考以下文章

每个连接模型的 Java 线程与 NIO

WebSocketsPP v3 库的客户端连接限制

Linux 线程(进程)数限制分析

PyZMQ 是不是为每个新的客户端连接处理创建线程?

POSIX消息队列 - mq_send线程唤醒命令

如何解决高并发,连接等待超时的异常