【问题标题】:JMS connections exhausted using WebSphere MQ使用 WebSphere MQ 耗尽的 JMS 连接
【发布时间】:2015-01-05 19:27:46
【问题描述】:

我已经配置了 CachingConnectionFactory,它包装了 MQTopicConnectionFactoryMQQueueConnectionFactory,每个缓存大小设置为 10。

这些在多个jms:outbound-channel-adapter or 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-integration ibm-mq spring-jms


【解决方案1】:

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

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

编辑:

您的配置中没有什么突出的。正如我所说,每个 CCF 一次最多打开 1 个连接。

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

通常,在这种情况下,启用心跳或保持连接会保持连接处于活动状态(或至少让服务器知道它已死)。

【讨论】:

  • 刚刚在问题中添加了一些代码示例,这没什么特别的,只是连接工厂所需的非常基本的配置,如果您想查看任何其他代码,请告诉我,谢谢!此外,我确实启用了上面的日志记录并看到正在打印共享连接,但它必须创建更多连接来服务各种发布者和订阅者,即使并发消费者设置为更高的数字?
  • 谢谢 Gary,有没有办法告诉 CachingConnectionFactory 在一段时间不使用时关闭连接?
  • 未构建;它确实有一个您可以调用的方法resetConnection(),但它会拉扯任何正在进行的活动。
  • 如果网络已经拔掉连接上的插头也无济于事; heartbeats/keepalives 是唯一可靠的机制。
  • 在相关说明中,我注意到日志打印出 ..Established shared JMS Connection: com.ibm.mq.jms.MQQueueConnection....只是一次,但 MQ 上的连接数上升2,为什么会这样?谢谢
【解决方案2】:

当连接工厂只打开一个连接时,我在我的应用程序中调试了一个关于 MQ 中打开输出计数的类似问题。

MQ 资源管理器中的输出计数是 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 中有内置属性,可以配置这些属性来设置重新连接超时。

更多信息请参见,

https://www.ibm.com/developerworks/community/blogs/messaging/entry/simplify_your_wmq_jms_client_with_automatic_client_reconnection19?lang=en

默认情况下,CCF 的重新连接异常为 true。因此,如果 IBM 在超时间隔后抛出异常,则应小心。我不确定在 CCF 中引发异常之前是否会尝试重新连接的最大次数。

【讨论】:

  • CCF 在每个会话中也为生产者维护一个缓存。在我的应用程序中进一步调试连接问题时,创建并保持空闲状态的 IBM 连接句柄总数 = 会话缓存大小 * 唯一目标数。不能保证您下次会从缓存中再次获得相同的会话,并且您最终会使用缓存中的生产者。因此,这是应用程序的开销,并且连接会闲置数天而不会重复使用。所以在决定会话缓存大小以及是否使用生产者缓存时应该小心。
猜你喜欢
  • 2010-11-24
  • 2015-07-08
  • 2014-09-19
  • 2017-02-03
  • 1970-01-01
  • 2012-03-10
  • 2010-10-28
  • 2014-07-22
  • 1970-01-01
相关资源
最近更新 更多