0

我有以下 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实例(在myPOJOFactorybean 中创建)拆分为其组成部分FizzBuzz属性,并以Fizz一种方式和Buzz另一种方式路由。

我对Splitter的理解是它只需要交换的主体并将其分解为 2+ 个对象的集合。但我不认为这是我想要的,因为虽然我确实希望将MyPOJO其“拆分”成其组成部分FizzBuzz字段,但我希望它们被路由到不同的目的地。也许Fizz去去去。direct:fizzFarm_ Buzz_direct:buzzFarm

我对基于内容的路由器( <choice/>) 的理解是,它允许您将条件if-else-if逻辑添加到路由中。但我也不认为我想要这个,因为我需要的不是有条件的:我总是想要MyPOJO#Fizzdirect:fizzFarm,而且我总是想要MyPOJO#Buzzdirect:buzzFarm

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

所以我相信我需要将分离器与动态路由器结合使用。我只是没有透过树木看到森林。像这样的东西:

<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>

关于我如何实现这一点的任何想法(#1 拆分MyPOJOFizzand Buzz,#2 设置路由器以路由FizzBuzz不同的目的地)?

4

1 回答 1

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 中尝试)。

于 2013-12-19T14:47:24.880 回答