ActiveMQ如何防止低优先级消息的饥饿?

时间:2014-09-29 11:24:23

标签: jms activemq priority-queue

我在ActiveMQ中实现了一个优先级队列。如果队列持续充满高优先级消息,则永远不会处理低优先级消息。 ActiveMQ如何处理这种情况或如何避免或处理这种情况?

2 个答案:

答案 0 :(得分:4)

ActiveMQ并不会尝试做任何事情来阻止这种情况,因为它可以根据您的应用需求来解决它。如果您遇到这种情况,您可能需要考虑使用每个优先级的队列来允许跨队列进行负载平衡。

答案 1 :(得分:1)

扩展到Tim Bish的答案,ActiveMQ中有一些功能可以用来处理这种情况。

您可以设置虚拟目标来过滤掉高和低prio消息,例如(在virtualDestinationInterceptor标记内)。

<virtualDestinations>
  <compositeQueue name="ALL">
     <forwardTo>
          <filteredDestination selector="JMSPriority &lt; 5" queue="LOW.PRIO"/>
          <filteredDestination selector="JMSPriority &gt; 4" queue="HIGH.PRIO"/>
     </forwardTo>
  </compositeQueue>
</virtualDestinations>

然后,您可以按照提交的替代策略here进行操作。 您将一个使用者放在LOW.PRIO队列上,将多个使用者放在HIGH.PRIO队列上。然后将处理LOW.PRIO消息,但线程少于高prio消息。

您还可以使用消费者应用程序中的所选选项直接从“ALL”队列中读取消息。