生产者在使用CachingConnectionFactory时没有得到清理

时间:2014-08-14 11:22:49

标签: java spring jms spring-jms jmstemplate

似乎JMSProducer没有收集垃圾并在将消息发送到队列后保持活动状态,我使用Spring 3.2.2和CachingConnectionFactory使用Keep-alive设置发送消息。

每次发送消息时,生产者数量都会不断增加。

它与我使用的弹簧版本有关吗?
或者我在配置中做错了什么?

1 个答案:

答案 0 :(得分:1)

您需要在MessageProducer上致电close() method。根据Java文档: -

void close()  
           throws JMSException
     

关闭消息制作者。

     

由于提供程序可能代表Java虚拟机外部的MessageProducer分配一些资源,因此客户端应在不需要时关闭它们。依靠垃圾收集来最终收回这些资源可能不够及时。

根据Spring CachingConnectionFactory docs: -

  
    

注意:此ConnectionFactory需要明确关闭所有会话     从其共享Connection获得。这是通常的建议     无论如何,对于本机JMS访问代码。但是,有了这个     ConnectionFactory,它的使用是强制性的,以便实际允许     会话重用。

  

所以你需要调用getCachedSessionProxy而不是getSession,一旦完成发送消息调用close()(在finally块中)。根据源代码,处理对此Session代理的紧密调用,以便重用会话和消息生成器。加里的评论也是如此。