场景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:我使用了消息组,以便要使用的消息将由特定使用者使用,解决方案也应保持此状态
答案 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
...
});
此消费者方逻辑在消息组方面应该是透明的。代理在发送消息时会自动选择拥有特定消息组的合适消费者,您无需担心消费者端代码。