Группировка или пакетирование процессоров Camel вместе в мультикастере - PullRequest
0 голосов
/ 20 марта 2019

Java 8 и Apache Camel 2.19.5 здесь. Я хочу определить маршрут (используя Spring XML DSL), который выполняет следующее:

  1. потребляет сообщение из очереди ActiveMQ
  2. Десериализует XML-сообщение из строки в Fizzbuzz экземпляр
  3. Отправляет Fizzbuzz в FoobarGenerator процессор
  4. Процессор FoobarGenerator генерирует Foobar на обмене
  5. Копии сообщения Foobar затем передаются двум нижестоящим процессорам одновременно: (a) процессор Configurator и (b) процессор Analyzer 6а. Configurator обрабатывает Foobar и сохраняет некоторые результаты в БД 6b. Analyzer обрабатывает Foobar, а затем маршрут отправляет этот экземпляр десериализатору (обратно в строку), а затем отправляет эту строку в другую очередь AMQ

Вот что у меня есть:

<route id="fizzbuzz_processor">
  <!-- Step 1: Consume Fizzbuzz XML from AMQ -->
  <from uri="activemq:fizzbuzzes"/>

  <!-- Step 2: Deserialize into Fizzbuzz POJO instance, using XStream -->
  <unmarshall ref="xs"/>

  <!--
    Step 3 + 4: Send to FoobarGenerator processor;
    output is a 'Foobar' POJO instance
  -->
  <to uri="bean:foobarGenerator"/>

  <!-- Step 5: Send Foobar to two places at the same time -->
  <multicast>
    <!-- Step 6a: Foobar goes to Configurator processor -->
    <to uri="bean:configurator"/>

    <!-- Step 6b: Foobar also goes to Analyzer processor -->
    <to uri="bean:analyzer"/>

    <!--
      AFTER Analyzer, Foobar gets serialized into XML and sent
      to another queue
    -->
    <marshall ref="xs"/>
    <to uri="activemq:foobars"/>
  </multicast>
</route>

Проблема с этой настройкой заключается в том, что, насколько я могу судить, мультикастеры могут быть определены только с конечными точками верхнего уровня, на которые они будут отправлять сообщения. Таким образом, как я настроил выше, мультикастер отправит сообщение: (a) bean: configurator, (b) bean: analyzer, (c) XStream / marshaller и (d) activemq: fizzbuzzes на в то же время , в отличие от одновременной отправки в bean: configurator и bean: analyzer, а затем после bean: analyzer, marshalling и отправки в AMQ.

Как мне перенастроить этот маршрут, чтобы делать то, что я хочу?

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Оказывается, вы можете просто:

<route id="fizzbuzz_processor">
  <!-- Step 1: Consume Fizzbuzz XML from AMQ -->
  <from uri="activemq:fizzbuzzes"/>

  <!-- Step 2: Deserialize into Fizzbuzz POJO instance, using XStream -->
  <unmarshall ref="xs"/>

  <!--
    Step 3 + 4: Send to FoobarGenerator processor;
    output is a 'Foobar' POJO instance
  -->
  <to uri="bean:foobarGenerator"/>

  <!-- Step 5: Send Foobar to two places at the same time -->
  <multicast parallelProcessing="true">
    <!-- Step 6a: Foobar goes to Configurator processor -->
    <to uri="bean:configurator"/>

    <!-- Step 6b: Foobar also goes to Analyzer processor -->
    <to uri="direct:someOtherRoute"/>
  </multicast>
</route>

Где direct:someOtherRoute идет к другому маршруту, который реализует все после 6b, которое я описал, и boom вы многоадресно передали в оба "места" одновременно.

0 голосов
/ 22 марта 2019

Почему вы хотите использовать многоадресный EIP?Кажется, что вы можете получить тот же результат, либо полностью удалив мультикастер, например:

<route id="fizzbuzz_processor">
  <!-- Step 1: Consume Fizzbuzz XML from AMQ -->
  <from uri="activemq:fizzbuzzes"/>
  <!-- Step 2: Deserialize into Fizzbuzz POJO instance, using XStream -->
  <unmarshall ref="xs"/>
  <!--
    Step 3 + 4: Send to FoobarGenerator processor;
    output is a 'Foobar' POJO instance
  -->
  <to uri="bean:foobarGenerator"/>

  <!-- Step 6a: Foobar goes to Configurator processor -->
  <to uri="bean:configurator"/>

  <!-- Step 6b: Foobar also goes to Analyzer processor -->
  <to uri="bean:analyzer"/>
  <marshall ref="xs"/>
  <to uri="activemq:foobars"/>
</route>

, либо оставив часть маршала / activemq вне мультикастера.Верблюд должен завершить мультикастер, а затем продолжить маршал / до.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...