我已配置CachingConnectionFactory
包装MQTopicConnectionFactory
和MQQueueConnectionFactory
,每个缓存大小设置为10。
作为我应用程序中各种弹簧集成工作流程的一部分,这些用于多个jms:outbound-channel-adapter or jms:message-driven-channel-adapter
。
注意到,当进程停止运行时,偶尔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
&#13;
由于
答案 0 :(得分:1)
您确实需要显示您的配置,但Spring CachingConnectionFactory
仅创建一个为所有会话共享的单个连接。打开CCF类别的INFO
日志记录会在创建新连接时发出此日志...
if (logger.isInfoEnabled()) {
logger.info("Established shared JMS Connection: " + this.target);
}
修改强>
您的配置中没有任何内容突出显示。正如我所说,每个CCF一次最多只能打开一个连接。
如果您有空闲时间,一种可能性是网络(交换机或防火墙)可能在不告知客户端或服务器的情况下静默地丢弃连接。下次客户端尝试使用其连接时,它将失败并创建一个新连接但服务器可能永远不会发现旧的连接已经死亡。
通常,对于这种情况,启用心跳或保持连接会使连接保持活动状态(或者至少允许服务器知道它已经死了)。
答案 1 :(得分:0)
我在我的应用程序中调试了类似的问题,当连接工厂只打开一个Connection时,MQ中的打开输出计数。
MQ explorer中的数字输出计数是IBM MQ类创建的连接句柄数。根据IBM文档,Session对象封装了IBM MQ连接句柄,因此定义了会话的跨国范围。
由于我的应用程序中的会话高速缓存大小为10,因此创建了10个IBM MQ连接句柄(每个会话一个)保持打开数天并且句柄状态处于非活动状态。
可以在
中找到更多信息https://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.dev.doc/q031960_.htm
正如Gary Russell所说,Spring没有提供配置这些空闲连接的超时的方法。 IBM在MQConnectionFactory中具有内置属性,可以将其配置为设置重新连接超时。
更多信息可以在
中找到对于CCF,默认情况下重新连接为true。如果IBM在超时间隔后抛出异常,应该小心。我不确定在CCF中抛出异常之前是否有重复连接的最大次数。