在多播器中将骆驼处理器分组或批处理在一起

时间:2019-03-20 19:00:10

标签: java apache-camel

此处为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处理器 6a。 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之后,将其编组并发送到AMQ。

如何重新配置​​此路由以执行我想要的操作?

2 个答案:

答案 0 :(得分:0)

结果证明您可以:

<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 您已同时多播到两个“地点”。

答案 1 :(得分:-1)

为什么要使用多播器EIP?似乎可以通过完全删除多播程序来获得相同的结果,例如:

 Select count(a.User_id) as Users , p.Job_Title 
    from Jobs_posted p
    left join Jobs_Applied a 
      on p.job_id = a.job_id and p.Empl_id=a.Empl_id
   group by p.Job_Title

或者将marshal / activemq部分留在多播器之外。骆驼应该完成多播程序,然后继续进行元帅。