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

如何在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(),但

我使用SpringJMS cachingconnectionfactory来改进基于Spring集成和IBMMQ的应用程序的性能。我将sessioncachesize设置为10,因为我们最多有10个并发线程(ThreadPoolTaskExecutor)处理消费/发送消息

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

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

  • 此外,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,这使得为生产者实现关闭策略变得复杂;让调用线程在调用模板之前加载目标;然后,您可以为每个目的地缓存一个或多个会话。