使用Camel Resequencer时如何将消息路由到JMS MessageListener / Consumer?

时间:2019-05-22 09:10:11

标签: spring-boot apache-camel spring-jms

场景1:

我有消息生产者和使用者,应用程序的流程如下:

生产者->队列->消费者

方案2: 现在我们引入了Camel来对消息进行重新排序。因此应用流程如下:

生产者->队列1->骆驼(重新排序)->队列2->消费者

问题:

我们可以不使用骆驼中的Queue2来进行方案2吗?我希望在骆驼重新排序步骤之后,消费者直接使用消息,因此应用程序流程如下:

生产者->队列1->骆驼(重新排序)->消费者

发送消息:

jmsTemplate.convertAndSend("mailbox", new Email("info@example.com", "Hello"));

骆驼重排

from("jms:queue1").resequence(header("myprop")).batch().to("queue2");

PS:我使用了消息组,以便要使用的消息将由特定使用者使用,解决方案也应保持此状态

1 个答案:

答案 0 :(得分:0)

在那种情况下,您不会自己实现JMS使用者,而是将消息使用委托给Camel的JMS组件-您已经使用from(“ jms:queue1”)做到了。

您将在“方案2”中的使用者中调用的逻辑将移至骆驼处理器:

from("jms:queue1")
 .resequence(header("myprop")).batch()
 .process(new MessageProcessor());

骆驼处理器处理收到的消息:

public class MessageProcessor implements Processor {
    @Override
    public void process(Exchange exchange) throws Exception {
        Message in = exchange.getIn();
        Object body = in.getBody();
        // body contains the content of the received JMS message
        ...
    }
}

或更短,使用Java 8 lambda语法:

from("jms:queue1")
 .resequence(header("myprop")).batch()
 .process().message(message -> { 
    Object body = message.getBody();
    // body contains the content of the received JMS message
    ...
 });

此消费者方逻辑在消息组方面应该是透明的。代理在发送消息时会自动选择拥有特定消息组的合适消费者,您无需担心消费者端代码。