我有一个Java客户端,通过10个连接连接到MQ。这些在Java客户端运行期间保持打开状态。对于每个线程,我们创建一条消息,创建一个会话,发送消息并关闭会话。我们正在使用Spring CachingConnectionFactory并且sessionCacheSize为100.我们的MQ工程团队告诉我们,我们的队列管理器的最大连接数为500,而且我们超过了这个数量。 QM.ini文件包含:
maxChannels=500
maxActiveChannels=256
maxHandles=256
我在MQ资源管理器中观察到的是,队列上的开放输出计数在10处保持静态,但是如果我们在2个队列之间进行负载平衡,则每个队列的负载均为10,即使我们仍然只有10个连接。那么我想知道的是jms连接和会话在MQ术语中等同于什么?
我确实认为连接等同于活动通道而会话是句柄,因此我们可能超出的句柄因为我们打开(和关闭)的会话数量达到数百或数千,而我们只有10个连接。虽然违背了这一点,但IBM的Technote" Explanation of connection pool and session pool settings for JMS connection factories"下面的代码片段表明最大通道应该大于最大会话数,但是我们永远都不知道它取决于它在负载上(除非这应该大于sessionCacheSize?)。
每个会话代表与队列管理器的TCP / IP连接。 使用此处提到的设置,最多可以有100个TCP / IP 连接。如果您使用的是WebSphere MQ,则调整非常重要 队列管理器的MaxChannels设置,位于qm.ini文件中, 到一个大于最大可能数之和的值 来自连接到队列的每个JMS连接工厂的会话 管理器。
有关如何最好地配置MQ的任何帮助都将受到赞赏。
答案 0 :(得分:4)
假设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个仅在一个TCP连接上运行的JMS会话。