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