Apache Camel:Splitter,CBR还是动态路由器?

时间:2013-12-19 14:28:41

标签: java apache-camel routes splitter integration-patterns

我有以下POJO:

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

    // ctor, getters, setters, etc.
}

以下路由(Spring XML):

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

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

    <!-- Not sure what to do here -->
    <!-- MyPOJO#Fizz should get routed to direct:fizzFarm. -->
    <!-- MyPOJO#Buzz should get routed to direct:buzzFarm. -->
</route>

myPOJOFactory的位置:

public class MyPOJOFactory {
    public MyPOJO newMyPOJO(Exchange exchange) {
        Fizz fizz = new Fizz(true, 3);
        Buzz buzz = new Buzz("awesome");

        MyPOJO pojo = new MyPOJO(fizz, buzz);

        exchange.getOut().setBody(pojo);
    }
}

我现在需要一种方法将MyPOJO实例(在myPOJOFactory bean中创建)拆分为其成分FizzBuzz属性,然后路由{{1一种方式,Fizz另一种方式。

我对Splitter的理解是它只需要交换的主体并将其分解为2个以上对象的集合。但我不认为这是我想要的,因为虽然我希望Buzz能够“分裂”到其成分MyPOJOFizz字段中,但我希望它们路由到不同的目的地。也许Buzz转到Fizzdirect:fizzFarm转到Buzz

我对Content-Based Routerdirect:buzzFarm)的理解是,它允许您将条件<choice/>逻辑添加到路径中。但我不认为我想要这个,因为我需要的不是条件:我总是希望if-else-if转到MyPOJO#Fizz,而我总是希望direct:fizzFarm转到MyPOJO#Buzz

我对Dynamic Router的理解是它会动态地将消息路由到不同的目的地,尽管我还不确定。我相信这就是我想要的,但是,从direct:buzzFarm bean出来,交换将包含一个myPOJOFactory对象。我觉得在将{​​{1}}发送到动态路由器之前,我必须首先拆分MyPOJO。这样,动态路由器将能够清楚地看到消息是MyPOJO还是Fizz,并正确路由。

所以我认为我需要将分离器与动态路由器结合使用。我只是没有看到森林穿过树林。像这样:

Buzz

关于如何实现这一点的任何想法(#1将<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> 拆分为MyPOJOFizz,以及#2设置路由器以路由Buzz和{ {1}}到不同的目的地)?

1 个答案:

答案 0 :(得分:3)

你是对的,因为逻辑总是相同的,路由器可能有点过分。

分割器最常用于相同类型的对象(例如,拆分列表并分别处理每个项目)

我可以建议Multicast EIP,这样的事情应该有效:

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来试试。)