spring-integration – 使用WebSphere MQ耗尽的JMS连接

我已经配置了CachingConnectionFactory,它包装MQTopicConnectionFactory和MQQueueConnectionFactory,每个缓存大小设置为10.

这些用于几个jms:outbound-channel-adapter或jms:message-driven-channel-adapter,作为我在我的应用程序中使用的各种spring集成工作流程的一部分.

注意到,当进程停止运行时,MQ通道上的连接计数偶尔会达到允许的最大值(大约1000).这对于生产应用来说是一个严重的问题.

将应用程序关闭不会减少连接数,因此看起来像MQ端的孤立连接?我不确定我是否错过了我的spring jms / SI配置中可以解决此问题的任何内容,我们将非常感谢任何帮助.

另外我想从应用程序中打开和关闭连接,但是没有办法做到这一点.

<bean id="mqQcf" class="com.ibm.mq.jms.MQQueueConnectionFactory">
//all that it needs host/port/ queue manager /channel
</bean>
 
 <bean id="qcf" class="org.springframework.jms.connection.CachingConnectionFactory">
			<property name="targetConnectionFactory" ref=" mqQcf "/>
			<property name="sessionCacheSize" value="10"/>			
</bean>


<bean id="mqTcf" class="com.ibm.mq.jms.MQTopicConnectionFactory">
//all that it needs host/port/ queue manager /channel
</bean>

<bean id="tcf" class="org.springframework.jms.connection.CachingConnectionFactory">
			<property name="targetConnectionFactory" ref=" mqTcf "/>
			<property name="sessionCacheSize" value="10"/>			
</bean>

//Qcf and tcf are than used in spring integration configuration as required

谢谢

最佳答案
您确实需要显示您的配置,但Spring CachingConnectionFactory仅创建一个为所有会话共享的单个连接.在创建新连接时,打开CCF类别的INFO日志记录会发出此日志…

if (logger.isInfoEnabled()) {
    logger.info("Established shared JMS Connection: " + this.target);
}

编辑:

您的配置中没有任何内容突出显示.正如我所说,每个CCF一次最多只能打开一个连接.

如果您有空闲时间,一种可能性是网络(交换机或防火墙)可能在不告知客户端或服务器的情况下静默地丢弃连接.下次客户端尝试使用其连接时,它将失败并创建一个新连接,但服务器可能永远不会发现旧的连接已经死亡.

通常,对于这种情况,启用心跳或保持连接将保持连接活动(或至少允许服务器知道它已死).

转载注明原文:spring-integration – 使用WebSphere MQ耗尽的JMS连接 - 代码日志