【问题标题】:How to close idle connections in Spring JMS CachingConnectionFactory?如何关闭 Spring JMS CachingConnectionFactory 中的空闲连接?
【发布时间】:2017-04-26 18:42:05
【问题描述】:

我使用 Spring JMS 缓存连接工厂来提高基于 Spring Integration 和 IBM MQ 的应用程序的性能。我将 sessioncachesize 设置为 10,因为我们有最多 10 个并发线程(ThreadPoolTask​​Executor)在消费/发送消息。

当我查看在 MQ 资源管理器中打开的连接数(队列的打开输出计数)时,它显示为 10,并且它会持续数天并且永远不会关闭。

  1. 有没有办法以编程方式检测连接 可能过时 - 说闲置半天 - 我检查了 resetConnection() 但不确定如何获取上次使用的时间 会议。
  2. Spring 是否提供任何连接超时参数 缓存连接工厂?或者如何释放这些空闲连接?

此外,心跳/keepalive 机制对我们不起作用,因为我们希望根据上次使用的时间物理关闭缓存的连接。

【问题讨论】:

  • 必须有其他事情发生; CachingConnectionFactorySingleConnectionFactory 的子类。每个工厂只有一个连接;会话缓存在该连接中。
  • MQ 资源管理器中的输出计数/连接数是 IBM MQ 类创建的连接句柄数。根据 IBM 文档,JMS 会话对象封装了一个 IBM MQ 连接句柄,因此定义了会话的跨国范围。由于我的应用程序中的会话缓存大小为 10,因此创建了 10 个 MQ 连接句柄(每个会话一个)保持打开状态数天并且处于非活动状态。我们可以将会话超时附加到 CCF 中的缓存会话吗? ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/…
  • 我的应用程序需要 CCF 中缓存会话的会话超时。如果会话在一段时间内不活动/未使用,我们希望从缓存和物理关闭中删除会话。我不确定 Spring 是否提供了将超时附加到会话或公开上次使用会话的选项。

标签: spring jms spring-integration ibm-mq spring-jms


【解决方案1】:

如果超时是 IBM 返回的 Session 对象的属性,您可以子类化连接工厂,覆盖 createSession();调用super.createSession(...),然后在返回之前设置属性。

您可能还必须覆盖 getSession(...) 并继续调用它,直到您获得未关闭的会话。我没有看到任何逻辑来检查标准工厂中的会话状态。 (当缓存为空时getSession() 调用createSession())。

【讨论】:

  • 我们有 100 多个目的地;对于每次发送,都会从缓存中返回一个会话,它将一个生产者添加到自己的缓存中。大多数情况下都不会重用同一个生产者,因为不能保证下一次发送到同一个目的地时缓存会返回同一个会话。对于每个生产者,IBM 都会创建连接句柄和 1000 多个 mq 连接保持打开而不被重用(10 个会话 * 100 多个目的地)。 Spring 具有用于处理生产者缓存的动态代理 impl,这使得为生产者实现关闭策略变得复杂。
  • 也许你可以使用ThreadLocal;在调用模板之前,让调用线程将其加载到目的地;那么你可以为每个目的地缓存一个(或多个)会话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-05-24
  • 2012-09-05
  • 1970-01-01
  • 2012-02-20
  • 1970-01-01
  • 2014-10-12
  • 1970-01-01
相关资源
最近更新 更多