使用jmsTemplate清除非活动队列

使用jmsTemplate清除非活动队列,jms,activemq,Jms,Activemq,我正在尝试清除activeMQ中的非活动队列 <amq:broker persistent="true" useJmx="true" schedulePeriodForDestinationPurge="1000"> <amq:destinationPolicy> <amq:policyMap> <amq:policyEntries> <amq:policyEnt

我正在尝试清除activeMQ中的非活动队列

<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" />