1

我正在尝试清除 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),尽管我关闭了会话和连接,所以队列没有被清除。

为什么生产者没有被删除?会影响使用缓存连接工厂吗?

谢谢!

4

1 回答 1

2

你说的对。
您看到这种行为是因为 CachingConnectionFactory 的默认设置,它是

SingleConnectionFactory 子类,添加了 Session 缓存以及 MessageProducer 和消费者缓存

spring doc中所述,当在缓存会话上调用 close() 时,它并没有真正关闭,而是缓存以供重用。 生产者也被缓存。

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

如果你想使用 CachingConnectionFactory,你可以通过设置禁止生产者被缓存:

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

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

于 2013-05-22T23:14:57.027 回答