Java 在多主机内部将Camel处理器分组或批处理在一起
这里是Java8和ApacheCamel 2.19.5。我想定义一个路由(使用Spring XML DSL)来完成以下任务: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并将一
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您同时对两个“位置”进行了多播