例如,我们有一个持久的主题使用者和该主题的一些经纪人。据我所知,经纪人将继续存储每条消息(在一定限度内),即使持久消费者在很长一段时间内都不活跃。
ActiveMQ中有一些经纪人的政策要销毁(自动取消订阅)非活动(在某些特定时间内)持久消费者吗?因此,我不需要监控所有消费者是否仍然有效且实际存在。
答案 0 :(得分:2)
我建议您使用虚拟主题而不是持久消费者。
使用虚拟主题时,所有来自制作人的邮件都会以您现在发送的相同方式发送。但是,当新的使用者使用唯一的使用者名称注册时 - 会为他创建一个新队列,并且发送到虚拟主题的所有消息都会复制到队列中。这意味着每个消费者都有自己的队列 - 这比持久主题订阅更方便。
然后,当您确定您的消费者不再存在时 - 您可以删除其中包含所有待处理消息的队列。无论是从代码还是通过AMQ Web控制台或jconsole手动都可以完成。
修改强> 使用虚拟主题,您可以为每个单个使用者获取一个新队列,因此您可以应用队列策略在非活动状态下将其删除指定的时间段。
在activemq.xml中设置gcInactiveDestinations = true:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" producerFlowControl="false"
gcInactiveDestinations="true" inactiveTimoutBeforeGC="10000"/>
了解更多: http://activemq.apache.org/delete-inactive-destinations.html
答案 1 :(得分:2)
这是您需要设置的选项:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulePeriodForDestinationPurge="10000" offlineDurableSubscriberTimeout="30000" offlineDurableSubscriberTaskSchedule="10000">
答案 2 :(得分:0)
以上答案是正确的,但在您不在代理级别添加schedulePeriodForDestinationPurge =“10000”之前无效。 每10秒代理检查一个非活动队列,其中没有活动的消费者连接,并且待处理消息的数量为零。您也可以将其设置为更高的值。
答案 3 :(得分:0)
使用 schedulePeriodForDestinationPurge 策略是否可以删除目的地,即使有待处理的消息,比如设置 100 条消息的限制