使用jmsTemplate清除非活动队列

时间:2013-05-22 13:30:09

标签: jms activemq

我正在尝试清除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>

正如我所读到的,当有0条消息且没有新的生产者/消费者时,队列处于非活动状态。

我正在使用jmsTemplate发送这样的过程:

//Creates an org.springframework.jms.connection.CachingConnectionFactory
conn = jmsTemplate.getConnectionFactory().createConnection(); 
session = conn.createSession(false, Session.AUTO_ACKNOWLEDGE);
...
jmsTemplate.convertAndSend(destinationQueue, messageDTO);
....
session.close();
conn.close();

当调用convertAndSend方法时,会创建生成器和队列,但是当发送完成时,生成器仍处于活动状态(jconsole指示producerCount = 1),尽管我关闭了会话和连接,因此队列没有被清除。

为什么不删除制作人? 可以影响使用cachingconnectingfactory吗?

谢谢!

1 个答案:

答案 0 :(得分:2)

你是对的。
由于CachingConnectionFactory的默认设置是

,您会看到此行为
  

SingleConnectionFactory子类,它也添加了Session缓存   MessageProducer和消费者缓存

正如spring doc中提到的,在缓存会话上调用close()时,它并未真正关闭,而是缓存以供重用。 生产者也被缓存。

如果您使用过SingleConnectionFactory,那么您将目睹生产者清理,但在选择正确的连接工厂之前还需要考虑其他事项。

如果要使用CachingConnectionFactory,可以通过设置禁用生产者缓存:

<property name="cacheProducers" value="false" />

您也可以为消费者设置类似的设置。