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

标签 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 内创建)到其组成部分 Fizz 中和Buzz属性,并路由Fizz一种方式,以及 Buzz另一种方式。

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

我对Content-Based Router的理解( <choice/> ) 是它允许您添加条件 if-else-if逻辑成一条路线。但我认为我也不想要这个,因为我需要的不是有条件的:我总是想要 MyPOJO#Fizz前往 direct:fizzFarm ,我总是想要 MyPOJO#Buzz前往 direct:buzzFarm .

我对Dynamic Router的理解是它会动态地将消息路由到不同的目的地,尽管我还不太确定如何实现。然而,我相信这就是我想要的,来自 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 路由到不同的目的地)?

最佳答案

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

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

那么我可以建议 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中尝试)。

关于java - Apache Camel : Splitter, CBR 还是动态路由器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20684259/

相关文章:

java - ExecutorService 未及时终止

java - 服务器遇到内部错误,无法完成此请求

java - Camel 不承认 ?lock=false 有效

java - Camel .to 文件扩展名

zend-framework - Zend - 从模块/ Controller / View 逻辑生成语音 URL

symfony - 在 Symfony 4 中为路由配置默认主机

java - 通过批处理文件使用main方法执行独立项目

java - Eclipse 2018-09 不会编译 Java 11 源代码;认为低于1.7

apache-camel - Camel SFTP 文件处理问题

reactjs - 如何在 react-router-dom v4.2.2 中获取当前路由