0

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

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

它与我使用的春季版本有关吗?
还是我在配置中做错了什么?

4

1 回答 1

1

你需要在你close()MessageProducer. 根据 Java 文档:-

void close()  
           throws JMSException

关闭消息生产者。

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

根据 spring CachingConnectionFactory 文档:-

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

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

于 2014-08-14T11:27:46.013 回答