Rabbitmq 如何在Mule应用程序中按优先级顺序侦听多个队列。

Rabbitmq 如何在Mule应用程序中按优先级顺序侦听多个队列。,rabbitmq,mule,esb,mule-studio,Rabbitmq,Mule,Esb,Mule Studio,我有一个amqp连接器设置,可以在单个队列上侦听JSON消息,并且工作正常。业务部门已经放弃了一个用例,即我的应用程序现在需要按优先级顺序侦听多个队列。例如,有三个队列: 高质量 NormalQ 低质量 我希望mule连接器首先从HighQ读取,直到为空,然后从NormalQ读取,直到为空,然后从LowQ读取,直到为空。在每条消息之后从HighQ重新启动 我觉得这应该是标准的,但是我的GoogleFoo让我失望了 有没有指向正确方向的指针 在您指定的用例中,我认为最好使用单个队列,但发布具有3个

我有一个amqp连接器设置,可以在单个队列上侦听JSON消息,并且工作正常。业务部门已经放弃了一个用例,即我的应用程序现在需要按优先级顺序侦听多个队列。例如,有三个队列:

  • 高质量
  • NormalQ
  • 低质量
  • 我希望mule连接器首先从HighQ读取,直到为空,然后从NormalQ读取,直到为空,然后从LowQ读取,直到为空。在每条消息之后从HighQ重新启动

    我觉得这应该是标准的,但是我的GoogleFoo让我失望了


    有没有指向正确方向的指针

    在您指定的用例中,我认为最好使用单个队列,但发布具有3个优先级的消息

    这样,消息总是按照优先级最高的顺序读取。消息总是先读取

    因此,您可以让消息生产者以3个优先级将消息发布到队列中(例如9表示高优先级,4表示正常优先级,0表示低优先级)

    入站JMS端点将首先读取优先级为9的所有消息。然后它将读取优先级为4的所有消息,然后读取优先级为0的消息

    具有优先级的JMS出站发布消息示例

    <jms:outbound-endpoint queue="StudioOUT" connector-ref="MyAppJMS" doc:name="JMS">
            <set-property propertyName="Priority" value="9"/> 
    </jms:outbound-endpoint>
    
    
    
    我希望这能解决你的情况

    更多关于JMS优先级的信息。
    处理消息优先级确实是您的代理应该处理的事情。自己处理这个问题可能会很棘手和麻烦

    按顺序处理队列以模拟优先级似乎不是一个好主意。假设您已经处理了来自高优先级队列的所有消息,并开始处理正常优先级队列

    在处理正常优先级队列时,新消息将进入高优先级队列。在正常队列和低优先级队列都被完全处理之前,这些高优先级消息将一直存在

    您可能会改进您的机制,以便更好地处理此类情况,但很难使其防弹。你真的不想自己处理这样的事情

    jmsapi内置了“消息优先级”的概念,但是如果您不使用JMS代理,这对您没有什么用处

    如果您使用的是rabbit mq,那么您应该查看以下stackoverflow帖子:。 由于rabbitmq队列基本上是FIFO队列,所以不容易使用“真正的”优先级消息(例如JMS)

    然而,有一个插件声称提供了您正在寻找的功能:。 根据文档,RabbitMQ的下一个版本(3.5.0)将支持开箱即用的优先级队列


    如果使用插件不是一个选项,如果消息的优先级非常重要,那么我不会使用您描述的使用多个队列的模式。如果需要更高的优先级,该模式也不能很好地扩展。我会选择在一个通道上接收所有消息(假设每条消息都有一个表示优先级的属性),然后将它们转发到一个(非amqp)新通道,该通道将为您处理优先级。有一种开源产品可以帮助您实现这一点,但也有其他可用选项。

    这是否适用于AMQP这样的AMQP服务器?如果消息是先进先出的,如何从消息内容本身或其属性中读取优先级?这是JMS特有的吗?(也就是说,JMS可以说在不影响其余消息顺序的情况下给我队列中所有优先级为9的消息?)我认为队列的目的是维护顺序,而不必担心先进先出。只有当所有消息具有相同优先级时,才会发生这种情况。如果某些邮件具有更高的优先级,则无论何时发布,都会首先阅读这些邮件。优先级内置于JMS读取中。您不需要配置任何额外的内容来首先读取高优先级。唯一要做的编码是在将消息发布到队列时,根据您的业务逻辑,以适当的优先级B发布它们。我同意@user1760178的观点,即您不应尝试使用多个队列复制优先级传递机制,而应使用单个队列,并使用尊重消息优先级属性的JMS/AMQP代理。伙计们,队列的设计不在我的控制范围内。我得到的架构是RabbitMQ多队列和Mule ESB。如果这是如此复杂,以至于无法完成,那么我会告诉他们这是无法完成的。但我知道它可以用一种肮脏的方式完成(用Java自己编写),我只是在从Mule本身寻找一个干净的解决方案。享受免费的300点升级#失望的是,我现在连投票都没能通过lol声誉从367降到67。第一次也是最后一次我在做悬赏。谢谢你的反馈。我还不能使用rabbitmq的新版本(部署在prod中)是的,我已经说过JMS不会有用,我不同意这是一个糟糕的想法。你的例子是错误的。我将始终从高优先级队列开始处理。例如,如果我处理了一条正常队列消息,那么下次“轮询”时来自高优先级队列,因此我将看到在处理正常优先级消息时传入的消息。检查高,检查中,检查低,重复。如果我在任何一次“检查”中收到一条消息,我将对其进行处理,并以“检查高”重新开始。