如何关闭 Spring JMS CachingConnectionFactory 中的空闲连接?

How to close idle connections in Spring JMS CachingConnectionFactory?

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

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

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

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

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

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