簡體   English   中英

Apache Camel:分離器,CBR還是動態路由器?

[英]Apache Camel: Splitter, CBR or Dynamic Router?

我有以下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屬性,並以一種方式路由Fizz ,以另一種方式路由Buzz方法。

我對Splitter的理解是,它只需要交換的主體並將其分解為2個以上的對象的集合。 但是我不認為這是我想要的,因為盡管我確實希望MyPOJO能夠“拆分”到其組成的FizzBuzz字段中,但我希望它們被路由到不同的目的地。 也許Fizz去了direct:fizzFarmBuzz去了direct:buzzFarm

我對基於內容的路由器<choice/> )的理解是,它允許您將條件if-else-if邏輯添加到路由中。 但是我也不希望這樣,因為我所需要的不是無條件的:我一直希望MyPOJO#Fizz轉到direct:fizzFarm ,而我一直希望MyPOJO#Buzz轉到direct:buzzFarm

我對動態路由器的理解是,它將動態地將消息路由到不同的目的地,盡管我不確定如何。 相信這就是我想要的,但是,從myPOJOFactory bean中出來之后,交換將包含一個MyPOJO對象。 我覺得我必須先拆分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中嘗試一下)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM