使用Apache Camel处理具有不同优先级的JMS消息

时间:2013-12-06 14:12:00

标签: java design-patterns jms apache-camel enterprise-integration

我正在解决处理具有不同优先级的JMS消息的问题。我使用Apache Camel框架作为EIP实现者。我有两个队列,我必须使用它。第一个包含优先级较高的消息,第二个包含优先级较低的消息。

现在我想创建一个包含循环的特殊组件“混音器”,执行以下步骤:

  1. 查看优先级队列
    • 如果它包含一条消息,它会将它发送到输出队列并转到循环的开始(如果它包含大量消息,它将处理前10条消息,然后转到步骤2)< / LI>
    • 如果它不包含任何消息,请转到步骤2
  2. 查看第二个队列
    • 如果它包含消息,则将其发送到输出队列(但只有一条消息)并重复循环
    • 如果它不包含任何消息,请重复循环
  3. 正如你所看到的,如果有很多消息(10个来自优先级队列/ 1来自第二个),我想保持一个特殊的比率。如果优先级队列中没有消息,我们可以立即处理第二个队列中的消息。我希望有一些像EIP Resequencer这样的东西可以使用多个输入队列。

    我找了一条Camel的路线,在那里我将从两个队列中消耗,我将在上面描述我的组件“Mixer”。我想有类似的东西:

    <route>
      <from id="A" />
      <from id="B" />
      <resequence id="mixer" />
      <to id="C" />
    </route>
    

    但我没有找到办法如何去做。一条路线只能有一个输入。如果它有更多的输入,Camel将在内部复制路线(我们将有两条独立的路线),行为将如下:

    <route>
      <from id="A" />
      <resequence id="mixer" />
      <to id="C" />
    </route>
    
    <route>
      <from id="B" />
      <resequence id="mixer" />
      <to id="C" />
    </route>
    

    as descibed here。这不是我想要的:-(。你有什么想法如何解决我的问题? 提前谢谢!

1 个答案:

答案 0 :(得分:0)

也许您可以查看Polling Consumer EIP。

我正在展示一些来自camel网站的示例代码,这可能是您解决方案的基础:

public void someBusinessLogic() {
    // loop to empty queue
    while (true) {
        // receive the message from the queue, wait at most 3 sec
        String msg = consumer.receiveBody("activemq:queue.inbox", 3000, String.class);
        if (msg == null) {
            // no more messages in queue
            break;
        }

        // do something with body
        msg = "Hello " + msg;

        // send it to the next queue
        producer.sendBodyAndHeader("activemq:queue.foo", msg, "number", count++);
    }
}

您可以尝试修改此代码以使计数器尝试使用来自hi-pri队列的10条消息和来自lo-pri队列的1条消息。

玩得开心,祝你好运。有兴趣知道这是否成功:)