我正在尝试清除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吗?
谢谢!
答案 0 :(得分:2)
你是对的。
由于CachingConnectionFactory的默认设置是
SingleConnectionFactory子类,它也添加了Session缓存 MessageProducer和消费者缓存
正如spring doc中提到的,在缓存会话上调用close()时,它并未真正关闭,而是缓存以供重用。 生产者也被缓存。
如果您使用过SingleConnectionFactory,那么您将目睹生产者清理,但在选择正确的连接工厂之前还需要考虑其他事项。
如果要使用CachingConnectionFactory,可以通过设置禁用生产者缓存:
<property name="cacheProducers" value="false" />
您也可以为消费者设置类似的设置。