如何在Spring JMS CachingConnectionFactory中关闭空闲连接?
我使用SpringJMS cachingconnectionfactory来改进基于Spring集成和IBMMQ的应用程序的性能。我将sessioncachesize设置为10,因为我们最多有10个并发线程(ThreadPoolTaskExecutor)处理消费/发送消息 当我查看MQ资源管理器中打开的连接数(队列的打开输出计数)时,它显示为10,并且它会持续运行数天,并且永远不会关闭如何在Spring JMS CachingConnectionFactory中关闭空闲连接?,spring,jms,spring-integration,ibm-mq,spring-jms,Spring,Jms,Spring Integration,Ibm Mq,Spring Jms,我使用SpringJMS cachingconnectionfactory来改进基于Spring集成和IBMMQ的应用程序的性能。我将sessioncachesize设置为10,因为我们最多有10个并发线程(ThreadPoolTaskExecutor)处理消费/发送消息 当我查看MQ资源管理器中打开的连接数(队列的打开输出计数)时,它显示为10,并且它会持续运行数天,并且永远不会关闭 有没有一种方法可以通过编程来检测 可能会过时-比如说闲置半天-我检查了 resetConnection(),但
此外,heartbeat/keepalive机制将不适用于我们,因为我们希望根据上次使用的时间物理关闭缓存的连接。如果超时是IBM返回的
会话
对象的一个属性,您可以对连接工厂进行子类化,覆盖createSession()
;调用super.createSession(…)
然后在返回属性之前设置属性
您可能还必须重写
getSession(…)
,并一直调用它,直到得到一个未关闭的会话。在标准工厂中,我看不到任何检查会话状态的逻辑。(getSession()
在缓存为空时调用createSession()
)必须发生其他事情CachingConnectionFactory
是SingleConnectionFactory
的子类。每个工厂只有一个连接;会话缓存在该连接中。MQ explorer中的输出计数/连接数是IBM MQ类创建的连接句柄数。根据IBM文档,JMS会话对象封装了IBM MQ连接句柄,因此定义了会话的跨范围。由于我的应用程序中的会话缓存大小为10,因此创建了10个MQ连接句柄(每个会话一个),这些句柄保持打开状态达数天且处于非活动状态。我们可以在CCF中为缓存会话附加会话超时吗?我的应用程序需要CCF中缓存会话的会话超时。如果会话在一段时间内处于活动/未使用状态,我们希望从缓存和物理关闭中删除会话。我不确定Spring是否提供了将超时附加到会话或公开上次使用会话的选项;对于每次发送,都会从缓存返回一个会话,它会将一个生产者添加到自己的缓存中。大多数情况下不会重用同一个生产者,因为不能保证下次发送到同一目标时缓存会返回相同的会话。对于每个生产者,IBM都会创建连接句柄和1000多个mq连接,这些连接保持打开状态而不被重用(10个会话*100多个目的地)。Spring具有处理生产者缓存的动态代理impl,这使得为生产者实现关闭策略变得复杂;让调用线程在调用模板之前加载目标;然后,您可以为每个目的地缓存一个或多个会话。