【问题标题】:Apache Camel: Splitter, CBR or Dynamic Router?Apache Camel:分离器、CBR 还是动态路由器?
【发布时间】:2013-12-19 14:28:41
【问题描述】:

我有以下 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 属性,并以一种方式路由 FizzBuzz另一种方式。

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

我对@9​​87654322@ (&lt;choice/&gt;) 的理解是它允许您将条件if-else-if 逻辑添加到路由中。但我也不认为我想要这个,因为我需要的不是有条件的:我总是希望 MyPOJO#Fizz 转到 direct:fizzFarm,并且我总是希望MyPOJO#Buzz 转到direct:buzzFarm

我对@9​​87654323@ 的理解是,它将动态地将消息路由到不同的目的地,尽管我还不太确定如何。我相信这就是我想要的,但是,从myPOJOFactory bean 出来,交换将包含一个MyPOJO 对象。我觉得我必须先拆分MyPOJO,然后再将其发送到动态路由器。这样,动态路由器就能清楚地看到消息是Fizz还是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 将MyPOJO 拆分为FizzBuzz,以及#2 设置路由器以将FizzBuzz 路由到不同的目的地)?

【问题讨论】:

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


    【解决方案1】:

    你是对的,因为逻辑总是一样的,路由器可能有点矫枉过正。

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

    所以我可以建议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试试)。

    【讨论】:

    • 很棒的答案,很好的建议!这很容易转换为 Spring XML,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2018-07-01
    • 2019-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-29
    相关资源
    最近更新 更多