2011-03-11 51 views
1

例如,我们有一个持久主题消费者和该主题的一些代理。据我了解,即使耐久消费者长时间不活跃,经纪人也会继续存储每条消息(在一定范围内)。在ActiveMQ中自动删除不活动的耐用消费者

在ActiveMQ中是否存在一些经纪人的政策来销毁(自动取消订阅)非活动(对于某些指定时间)的持久消费者?所以我不需要监控所有消费者是否仍然有效并且实际存在。

+0

只是好奇,如果你认为他们将要下线这么久,为什么你会使用持久主题的消费者,他们不会变得相关了。如果一个“耐用”的消费者很长一段时间不会在线,并且你不关心它丢失的信息,那么你可能只是使用普通的消费者而没有使其持久。 – Noctris 2011-03-16 13:22:42

+0

他们不会离线。一些耐用消费者可能完全停止生活(例如,由于一些体系结构的变化)。我不想手动监控和删除每个这样的消费者ID。 – Shcheklein 2011-03-16 14:35:43

回答

2

我建议你使用虚拟主题而不是耐用消费者。

使用虚拟主题发自您的消息所有讯息仅供您现在发送。但是,当一个新的消费者注册一个唯一的消费者名称时 - 会为他创建一个新的队列,并且发送给虚拟主题的所有消息都将复制到队列中。这意味着每个消费者都有自己的队列 - 这比持久主题订阅方便得多。

然后,当您确定消费者不再存在时 - 您可以删除包含所有待处理消息的队列。无论是从代码还是通过AMQ Web控制台或jconsole手动完成。

编辑: 随着虚拟话题,你得到一个新的队列为每一个消费者,因此,你可以申请队列策略来删除它时,不活动的指定时间段。

在你activemq.xml中集gcInactiveDestinations =真:

<destinationPolicy> 
     <policyMap> 
      <policyEntries> 
      <policyEntry queue=">" producerFlowControl="false" 
         gcInactiveDestinations="true" inactiveTimoutBeforeGC="10000"/> 

了解更多: http://activemq.apache.org/delete-inactive-destinations.html

+0

感谢您的回应,我会考虑虚拟主题。但是,问题是如何强制ActiveMQ自动删除旧的/不活动的使用者。某种活动超时。 – Shcheklein 2011-09-20 19:21:35

+0

看到我上面的编辑 – Paul 2011-09-20 22:02:26

+0

无法理解这些队列(每个消费者一个)提供与持久订阅相同的行为。我的意思是我需要他们在消费者重新启动后传递每个错过的消息(只有错过的消息,而不是整个队列)。如何实现这一目标?有一些超时的持久性消息? – Shcheklein 2011-09-21 10:46:49

0

以上的答案是正确的,但将无法正常工作,直到你不加schedulePeriodForDestinationPurge = “10000” 在经纪人级别。 每隔10秒,代理检查未激活的使用者连接的未激活队列以及未处理消息的数量为零。您也可以将它设置为更高的值。

2

这是你需要设置的选项:

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost" dataDirectory="${activemq.data}" schedulePeriodForDestinationPurge="10000" offlineDurableSubscriberTimeout="30000" offlineDurableSubscriberTaskSchedule="10000">