【问题标题】:purgue inactive queues using jmsTemplate使用 jmsTemplate 清除非活动队列
【发布时间】:2023-03-25 09:10:01
【问题描述】:

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

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

谢谢!

【问题讨论】:

    标签: jms activemq


    【解决方案1】:

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

    SingleConnectionFactory 子类也添加了 Session 缓存 消息生产者和消费者缓存

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

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

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

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

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

    【讨论】:

    • 这就是我要找的!现在以正确的方式清除队列。非常完整的答案,非常感谢!
    • 如果 cacheProducers 设置为 false,默认情况下 JMSTemplate 将为发送的每条消息创建一个新的连接、会话、生产者 - 然后再次关闭它们。这是非常低效的!如果 cacheConsumers = false,同样的场景也适用
    猜你喜欢
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多