Как перенаправить сообщения в JMS MessageListener / Consumer при использовании Camel Resequencer? - PullRequest
0 голосов
/ 22 мая 2019

Сценарий 1:

У меня есть Сообщение производителя и потребителя, и поток приложения выглядит следующим образом:

производитель -> Очередь -> Потребитель

Сценарий 2: Теперь мы представили Camel для повторного упорядочения сообщений. Итак, поток приложения выглядит следующим образом:

продюсер -> Queue1 -> Camel (Resequence) -> Очередь2 -> потребитель

Вопрос:

Можем ли мы сделать Сценарий 2, не используя Очередь2 у верблюда?Я хочу, чтобы сообщения потреблялись непосредственно потребителем после шага повторения последовательности верблюдов, поэтому поток приложений будет следующим:

производитель -> очередь1 -> верблюд (повторная последовательность) -> потребитель

Для отправки сообщения:

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

Повторение верблюда

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

PS: Я использовал группы сообщений, чтобы сообщения, которые должны быть использованы определенными потребителями, решение должно поддерживатьэто также

1 Ответ

0 голосов
/ 23 мая 2019

В этом случае вы не будете реализовывать потребителя JMS самостоятельно, а делегируете потребление сообщений компоненту JMS Camel - вы уже сделали это с помощью from ("jms: queue1").

Логика, которую вы будете вызывать у своего потребителя в «сценарии 2», будет затем перенесена на процессор Camel:

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

Процессор Camel, работающий с полученным сообщением:

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:

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

Эта логика на стороне потребителя должна быть прозрачной в отношении групп сообщений.При отправке сообщения брокер автоматически выбирает нужного потребителя, которому принадлежит определенная группа сообщений, вам не нужно беспокоиться о коде на стороне потребителя.

...