MQ 最大连接数问题

Baz*_*zza 4 java spring jms ibm-mq

我有一个 Java 客户端,它通过 10 个连接连接到 MQ。这些在 Java 客户端运行期间保持打开状态。对于每个线程,我们创建一条消息,创建一个会话,发送消息并关闭会话。我们正在使用 Spring CachingConnectionFactory 并且 sessionCacheSize 为 100。我们的 MQ 工程团队告诉我们,我们的队列管理器的最大连接数为 500,我们已经超过了这个值。QM.ini 文件具有:

maxChannels=500
maxActiveChannels=256
maxHandles=256
Run Code Online (Sandbox Code Playgroud)

我在 MQ 资源管理器中观察到,队列上的打开输出计数保持静态为 10,但是如果我们跨 2 个队列进行负载平衡,则每个队列都是 10,即使我们仍然只有 10 个连接。那么我想知道的是 jms 连接和会话在 MQ 术语中等同于什么?

我确实认为连接等同于活动通道而会话是句柄,因此当我们打开(和关闭)的会话数量达到数百或数千时,我们可能会超过句柄,而我们只有 10连接。尽管与此相反,IBM 的技术说明“ JMS 连接工厂的连接池和会话池设置说明”中的以下片段表明最大通道应该大于最大会话,但是我们永远不知道这一点,因为它取决于负载(除非这应该大于 sessionCacheSize?)。

每个会话代表一个到队列管理器的 TCP/IP 连接。使用此处提到的设置,最多可以有 100 个 TCP/IP 连接。如果您正在使用 WebSphere MQ,那么将位于 qm.ini 文件中的队列管理器的 MaxChannels 设置调整为一个大于连接到队列的每个 JMS 连接工厂的最大可能会话数总和的值很重要经理。

任何关于如何最好地配置 MQ 的帮助将不胜感激。

小智 5

假设您在 MQ 通道上的最大对话数设置为 1(在 MQ v7 和 v7.5 中默认为 10),那么 JMS 连接将产生 TCP 连接(MQ 通道实例),而 JMS 会话将产生另一个 TCP 连接(MQ 通道实例)。

从您的更新来看,您似乎配置了 10 个 JMS 连接,并且 Spring 中的 sessionCacheSize 设置为 100,因此 10 x 100 意味着正在创建 1000 个潜在的 MQ 通道实例。打开的输出计数将显示有多少“活动”JMS 会话正在尝试发送消息,而不一定是“缓存”了多少。

MQ 通道上的对话共享在这里可能会对您有所帮助,因为它定义了可以通过一个 TCP 连接(MQ 通道实例)共享多少个逻辑连接。因此默认的 10 个会话意味着您可以创建 10 个 JMS 会话,这些会话仅在一个 TCP 连接上运行。