Spring integration 使用WebSphere MQ耗尽JMS连接

Spring integration 使用WebSphere MQ耗尽JMS连接,spring-integration,ibm-mq,spring-jms,Spring Integration,Ibm Mq,Spring Jms,我已经配置了CachingConnectionFactory,它包装了MQTopicConnectionFactory和MQQueueConnectionFactory,每个缓存大小设置为10 作为我在应用程序中拥有的各种spring集成工作流的一部分,在一些jms:outbound channel adapter或jms:message-driven channel adapter中使用了它们 请注意,当进程停止运行时,MQ通道上的连接计数偶尔会达到允许的最大值(约1000)。对于生产应用程序

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

作为我在应用程序中拥有的各种spring集成工作流的一部分,在一些
jms:outbound channel adapter或jms:message-driven channel adapter
中使用了它们

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

关闭应用程序不会减少连接数,因此MQ端看起来像孤立连接?我不确定我的SpringJMS/SI配置中是否遗漏了可以解决此问题的任何内容,如有任何帮助,将不胜感激

另外,我想从应用程序记录连接的打开和关闭,但没有找到一种方法


//它需要主机/端口/队列管理器/通道
//它需要主机/端口/队列管理器/通道
//Qcf和tcf在spring集成配置中根据需要使用

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

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

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

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


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

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

MQ explorer中的number output counts是IBM MQ类创建的连接句柄数。根据IBM文档,会话对象封装了IBM MQ连接句柄,因此定义了会话的跨范围

由于我的应用程序中的会话缓存大小为10,因此创建了10个IBM MQ连接句柄(每个会话一个),这些句柄保持打开状态达数天,并且句柄状态为非活动状态

更多信息请访问:

正如Gary Russell所提到的,Spring没有提供为这些空闲连接配置超时的方法。IBM在MQConnectionFactory中具有内置属性,可以将其配置为设置重新连接超时

更多信息可在


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

只是在问题中添加了一些代码示例,这没有什么特别的,只是连接工厂所需的非常基本的配置,如果您想查看任何其他代码,请告诉我,谢谢!此外,我还启用了上面的日志记录,并看到正在打印一个共享连接,但它必须创建更多的连接以服务于不同的发布者和订阅者,同时当并发消费者设置为更高的数字时?谢谢Gary,有没有办法告诉CachingConnectionFactory关闭一个连接,如果一段时间没有使用?没有建立连接;它确实有一个方法
resetConnection()
,您可以调用它,但它会对任何进程中的活动造成不利影响;心跳/keepalives是唯一可靠的机制。在相关的说明中,我注意到日志打印了..已建立的共享JMS连接:com.ibm.mq.JMS.MQQueueConnection….仅一次,但mq上的连接计数增加了2,这是为什么?感谢您的解决方案?CCF在每个会话中也为生产者维护一个缓存。在进一步调试我的应用程序中的连接问题时,创建并保持空闲的IBM连接句柄总数为=会话缓存大小*唯一目标数。无法保证下次您将再次从缓存中获得相同的会话,并且最终使用缓存中的生产者。因此,这对应用程序来说是一种开销,连接会闲置几天而不会重复使用。因此,在决定会话缓存大小以及是否使用生产者缓存时,应该小心。