Java ApacheCamel:拆分器、CBR还是动态路由器?

Java ApacheCamel:拆分器、CBR还是动态路由器?,java,apache-camel,routes,splitter,integration-patterns,Java,Apache Camel,Routes,Splitter,Integration Patterns,我有以下几点建议: public class MyPOJO { private Fizz fizz; private Buzz buzz; // ctor, getters, setters, etc. } 以及以下路径(SpringXML): 我现在需要一种方法来将MyPOJO实例(在myPOJOFactorybean中创建)拆分为其组成部分Fizz和Buzz属性,并将Fizz以一种方式路由,将Buzz以另一种方式路由 我对a的理解是,它只需要交换主体并将其分解为2

我有以下几点建议:

public class MyPOJO {
    private Fizz fizz;
    private Buzz buzz;

    // ctor, getters, setters, etc.
}
以及以下路径(SpringXML):

我现在需要一种方法来将
MyPOJO
实例(在
myPOJOFactory
bean中创建)拆分为其组成部分
Fizz
Buzz
属性,并将
Fizz
以一种方式路由,将
Buzz
以另一种方式路由

我对a的理解是,它只需要交换主体并将其分解为2+个对象的集合。但我不认为这是我想要的,因为尽管我确实希望
MyPOJO
被“拆分”为其组成的
Fizz
Buzz
字段,但我希望它们被路由到不同的目的地。也许
Fizz
会转到
direct:fizzFarm
Buzz
会转到
direct:buzzFarm

我对(
)的理解是,它允许您在路由中添加条件
if-else-if
逻辑。但我也不认为我想要这个,因为我需要的不是有条件的:我总是希望
MyPOJO#Fizz
转到
direct:fizzFarm
,我总是希望
MyPOJO#Buzz
转到
direct:buzzFarm

我对a的理解是,它将动态地将消息路由到不同的目的地,尽管我还不确定如何路由。我相信这就是我想要的,然而,从
myPOJOFactory
bean中,交换将包含一个
MyPOJO
对象。我觉得在将
MyPOJO
发送到动态路由器之前,必须先拆分它。这样,动态路由器将能够清楚地看到消息是
嘶嘶声
还是
嗡嗡声
,并正确路由

因此,我认为我需要将拆分器与动态路由器结合使用。我只是没能透过树林看到森林。大概是这样的:

<route id="myroute">
    <from uri="timer://runOnce?repeatCount=1&amp;delay=10" />

    <to uri="bean:myPOJOFactory?method=newMyPOJO" />

    <split>
        <tokenize token="Somehow split MyPOJO into Fizz and Buzz here" />
        <to uri="direct:dynrouter" />
    </split>

    <from uri="direct:dynrouter" />

    <dynamicRouter>
        <!-- ??? Somehow route Fizz to direct:fizzFarm, and Buzz to direct:buzzFarm
    </dynamicRouter>
</route>


你是对的,因为逻辑总是一样的,路由器可能是杀伤力过大

拆分器通常与相同类型的对象一起使用(例如,拆分列表并分别处理每个项目)

所以我可以建议,像这样的方法应该有效:

from("timer://runOnce?repeatCount=1&delay=10")
    .bean(myPOJOFactory.class)
    .multicast().to("direct:sendFizz", "direct:sendBuzz")

from("direct:sendFizz")
    .setBody(simple("${body.fizz"))
    .to("direct:fizzFarm")

from("direct:sendBuzz")
    .setBody(simple("${body.buzz"))
    .to("direct:buzzFarm")

(这显然是DSL语法,您也可以在XML中尝试。)

您是对的,因为逻辑总是相同的,路由器可能会被过度使用

拆分器通常与相同类型的对象一起使用(例如,拆分列表并分别处理每个项目)

所以我可以建议,像这样的方法应该有效:

from("timer://runOnce?repeatCount=1&delay=10")
    .bean(myPOJOFactory.class)
    .multicast().to("direct:sendFizz", "direct:sendBuzz")

from("direct:sendFizz")
    .setBody(simple("${body.fizz"))
    .to("direct:fizzFarm")

from("direct:sendBuzz")
    .setBody(simple("${body.buzz"))
    .to("direct:buzzFarm")

(这显然是DSL语法,您也可以在XML中尝试。)

您是对的,因为逻辑总是相同的,路由器可能会被过度使用

拆分器通常与相同类型的对象一起使用(例如,拆分列表并分别处理每个项目)

所以我可以建议,像这样的方法应该有效:

from("timer://runOnce?repeatCount=1&delay=10")
    .bean(myPOJOFactory.class)
    .multicast().to("direct:sendFizz", "direct:sendBuzz")

from("direct:sendFizz")
    .setBody(simple("${body.fizz"))
    .to("direct:fizzFarm")

from("direct:sendBuzz")
    .setBody(simple("${body.buzz"))
    .to("direct:buzzFarm")

(这显然是DSL语法,您也可以在XML中尝试。)

您是对的,因为逻辑总是相同的,路由器可能会被过度使用

拆分器通常与相同类型的对象一起使用(例如,拆分列表并分别处理每个项目)

所以我可以建议,像这样的方法应该有效:

from("timer://runOnce?repeatCount=1&delay=10")
    .bean(myPOJOFactory.class)
    .multicast().to("direct:sendFizz", "direct:sendBuzz")

from("direct:sendFizz")
    .setBody(simple("${body.fizz"))
    .to("direct:fizzFarm")

from("direct:sendBuzz")
    .setBody(simple("${body.buzz"))
    .to("direct:buzzFarm")

(这显然是DSL语法,您也可以在XML中尝试它)。

非常棒的答案,非常好的建议!这很容易转换为SpringXML,再次感谢!真棒的回答,伟大的建议!这很容易转换为SpringXML,再次感谢!真棒的回答,伟大的建议!这很容易转换为SpringXML,再次感谢!真棒的回答,伟大的建议!这很容易转换为SpringXML,再次感谢!