Java 使用CachingConnectionFactory时未清洁生产商
似乎Java 使用CachingConnectionFactory时未清洁生产商,java,spring,jms,spring-jms,jmstemplate,Java,Spring,Jms,Spring Jms,Jmstemplate,似乎JMSProducer在将消息传递到队列后没有被垃圾收集并保持活动状态,我正在使用Spring 3.2.2和CachingConnectionFactory以及保持活动状态设置来发送消息 每次我发送消息时,生产者数量不断增加 它与我正在使用的spring版本有关吗? 或者我的配置有问题吗?您需要调用您的MessageProducer。根据Java文档:- 关闭消息生成器 由于提供者可以代表MessageProducer在Java虚拟机之外分配一些资源,因此客户端应该在不需要时关闭它们。依靠垃
JMSProducer
在将消息传递到队列后没有被垃圾收集并保持活动状态,我正在使用Spring 3.2.2和CachingConnectionFactory
以及保持活动状态设置来发送消息
每次我发送消息时,生产者数量不断增加
它与我正在使用的spring版本有关吗?或者我的配置有问题吗?您需要调用您的
MessageProducer
。根据Java文档:-
关闭消息生成器
由于提供者可以代表MessageProducer
在Java虚拟机之外分配一些资源,因此客户端应该在不需要时关闭它们。依靠垃圾收集最终回收这些资源可能不够及时
根据spring CachingConnectionFactory文档:-
注意:此ConnectionFactory要求显式关闭所有会话
从其共享连接中获取。这是通常的建议
对于本机JMS访问代码。但是,
ConnectionFactory,它的使用是强制性的,以便实际允许
会话重用
因此,您需要调用getCachedSessionProxy而不是getSession,一旦发送完消息,就调用close()(在finally块中)。根据源代码,将处理对此会话代理的关闭调用,以便重用会话和messageproducer。Gary的评论也是如此。这可能与您使用它的方式有关。一些代码要显示吗?我怀疑一次又一次关闭生产商会影响性能,在使用Cachingconnectionfactory时,它应该在内部处理。这就是重点;将拦截
close()
,并将生产者放入缓存中,而不是实际关闭。工厂不能“自动”完成;应用程序必须在完成时通知它(应用程序可能希望一次生成多条消息)。@GaryRussell感谢Gary的支持suggestion@TarishSaini请查找更新的答案。如果它解决了您的问题,请告诉我们我正在使用JMSTemplate,希望它能显式地解决问题,那么我还需要调用close()方法吗???
void close()
throws JMSException