似乎JMSProducer
在将消息传递到队列后没有收集垃圾并保持活动状态,我正在使用 Spring 3.2.2 并CachingConnectionFactory
使用 Keep-alive 设置发送消息。
每次我发送消息时,生产者数量都会不断增加。
它与我使用的春季版本有关吗?
还是我在配置中做错了什么?
似乎JMSProducer
在将消息传递到队列后没有收集垃圾并保持活动状态,我正在使用 Spring 3.2.2 并CachingConnectionFactory
使用 Keep-alive 设置发送消息。
每次我发送消息时,生产者数量都会不断增加。
它与我使用的春季版本有关吗?
还是我在配置中做错了什么?
你需要在你close()
的MessageProducer
. 根据 Java 文档:-
void close() throws JMSException
关闭消息生产者。
由于提供者可能会代表
MessageProducer
Java 虚拟机外部分配一些资源,因此客户端应该在不需要它们时关闭它们。依靠垃圾收集最终回收这些资源可能还不够及时。
根据 spring CachingConnectionFactory 文档:-
注意:此 ConnectionFactory 需要显式关闭从其共享连接中获得的所有会话。无论如何,这是本机 JMS 访问代码的通常建议。但是,对于这个 ConnectionFactory,它的使用是强制性的,以便实际允许 Session 重用。
所以你需要调用 getCachedSessionProxy 而不是 getSession 并且一旦完成发送消息调用 close() (in finally 块) 。根据源代码,处理对此 Session 代理的关闭调用,以便重用会话和消息生产者。加里的评论也是如此。