使用jmsTemplate清除非活动队列
我正在尝试清除activeMQ中的非活动队列使用jmsTemplate清除非活动队列,jms,activemq,Jms,Activemq,我正在尝试清除activeMQ中的非活动队列 <amq:broker persistent="true" useJmx="true" schedulePeriodForDestinationPurge="1000"> <amq:destinationPolicy> <amq:policyMap> <amq:policyEntries> <amq:policyEnt
<amq:broker persistent="true" useJmx="true" schedulePeriodForDestinationPurge="1000">
<amq:destinationPolicy>
<amq:policyMap>
<amq:policyEntries>
<amq:policyEntry queue="queue.>" gcInactiveDestinations="true" inactiveTimoutBeforeGC="5000" />
</amq:policyEntries>
</amq:policyMap>
</amq:destinationPolicy>
调用convertAndSend方法时,将创建生产者和队列,但当发送完成时,生产者仍然处于活动状态(jconsole指示producerCount=1),尽管我关闭了会话和连接,因此队列未被清除
为什么不删除生产者?
会影响使用cachingconnectingfactory吗
谢谢 你说得对
您之所以看到这种行为,是因为CachingConnectionFactory的默认设置是 SingleConnectionFactory子类,它还添加了会话缓存 MessageProducer和consumer缓存 如中所述,当对缓存会话调用close()时,它不是真正关闭的,而是缓存以供重用。 生产者也被缓存
如果你使用了一个单一的工厂,你会看到生产商的清理,但是在选择正确的连接工厂之前还有其他的事情要考虑。 如果要使用CachingConnectionFactory,可以通过以下设置禁用缓存生产者:
<property name="cacheProducers" value="false" />
您也可以为消费者做类似的设置。这就是我要找的!现在以正确的方式清除队列。非常完整的答案,非常感谢!如果cacheProducers设置为false,默认情况下,JMSTemplate将为每个发送的消息创建一个新的连接、会话、生产者,然后再次关闭它们。这是非常低效的!如果cacheConsumers=false,同样的场景也适用
<property name="cacheProducers" value="false" />