Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在多主机内部将Camel处理器分组或批处理在一起_Java_Apache Camel - Fatal编程技术网

Java 在多主机内部将Camel处理器分组或批处理在一起

Java 在多主机内部将Camel处理器分组或批处理在一起,java,apache-camel,Java,Apache Camel,这里是Java8和ApacheCamel 2.19.5。我想定义一个路由(使用Spring XML DSL)来完成以下任务: 使用来自ActiveMQ队列的消息 将XML消息从字符串反序列化为Fizzbuzz实例 将Fizzbuzz发送到FoobarGenerator处理器 FoobarGenerator处理器在exchange上生成一个Foobar 然后,Foobar消息的副本同时传递给两个下游处理器:(a)配置器处理器和(b)分析器处理器 6a。Configurator处理Foobar并将一

这里是Java8和ApacheCamel 2.19.5。我想定义一个路由(使用Spring XML DSL)来完成以下任务:

  • 使用来自ActiveMQ队列的消息
  • 将XML消息从字符串反序列化为
    Fizzbuzz
    实例
  • Fizzbuzz
    发送到
    FoobarGenerator
    处理器
  • FoobarGenerator
    处理器在exchange上生成一个
    Foobar
  • 然后,
    Foobar
    消息的副本同时传递给两个下游处理器:(a)配置器处理器和(b)分析器处理器 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>
    
    
    
    这个设置的问题是,据我所知,多星只能通过它们将要向其发送消息的顶级端点来定义。因此,按照我上面配置的方式,multicaster将同时将消息发送到:(a)bean:configurator,(b)bean:analyzer,(c)XStream/marshaller和(d)activemq:fizzbuzzs,而不是同时发送到bean:configurator和bean:analyzer,然后在bean:analyzer之后,编组并发送至AMQ


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

    为什么要使用multicaster EIP?似乎您可以通过完全删除Multicast来获得相同的结果,例如:

    <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部分保留在Multicast之外。Camel应该完成Multicast,然后继续封送/发送。

    结果表明,您可以:

    <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您同时对两个“位置”进行了多播