我有一个amqp连接器设置,可以在单个队列上侦听JSON消息,并且工作正常。该业务已经删除了一个用例,我的应用程序现在需要按优先级顺序监听多个队列。例如,有三个队列:
我希望mule连接器首先从HighQ读取直到空,然后是NormalQ直到空,LowQ直到空。每条消息后从HighQ重新启动。
我觉得这应该是标准的,但我的谷歌foo让我失望。
正确方向的任何指针?
答案 0 :(得分:3)
在您指定的用例中,我认为最好使用单个队列,但发布具有3个优先级的消息。
这种方式总是按照优先顺序读取消息,并且始终首先读取最高优先级消息。
因此,您可以让消息生成器将消息发布到具有3个优先级的队列中(例如9表示高,4表示正常,0表示低)。
您的入站JMS端点将首先读取优先级为9的所有消息。然后它将读取所有具有4的priotiy消息,然后读取优先级为0的消息。
具有优先权的示例JMS出站发布消息。
<jms:outbound-endpoint queue="StudioOUT" connector-ref="MyAppJMS" doc:name="JMS">
<set-property propertyName="Priority" value="9"/>
</jms:outbound-endpoint>
我希望这可以解决你的问题。
更多关于JMS的优先级。 http://www.christianposta.com/blog/?p=289
答案 1 :(得分:0)
处理消息优先级实际上是您的经纪人应该处理的事情。自己处理这个问题可能会非常麻烦和麻烦。
按顺序处理队列以模拟优先级似乎是一个坏主意。假设您已经处理了来自高优先级队列的所有消息并开始处理普通优先级队列。
在处理普通优先级队列时,新消息将进入高优先级队列。这些高优先级消息将位于那里,直到完全处理正常和低优先级队列。
你可能会改进你的机制来处理这样的情况好一点,但很难让它成为防弹。你真的不想自己处理这样的事情。
JMS api具有&#39;消息优先级的概念&#39;内置,但如果您没有使用JMS代理,那对U很有用。
如果你正在使用rabbit mq,那么你应该看看这个stackoverflow帖子:rabbitmq-and-message-priority。 由于Rabbit MQ队列基本上是FIFO队列,因此没有简单的方法可以使用&#34; real&#34;优先消息(例如在JMS中)。
但是有一个插件声称提供了您正在寻找的功能:rabbitmq-priority-queue。 根据文档,下一版RabbitMQ(3.5.0)将支持开箱即用的优先级队列。
如果使用插件不是一个选项,如果消息的优先级非常重要,那么我就不会使用您使用多个队列描述的模式。如果需要更高的优先级,该模式也不能很好地扩展。我会选择接收单个通道上的所有消息(假设每条消息都有一个代表优先级的属性)并将它们转发到(非amqp)新通道,为您处理resequencing。一个可以帮助您解决这个问题的开源产品是Apache ActiveMQ,但也有其他选择。