2013-12-19 60 views
0

我有以下POJO:Apache Camel:分離器,CBR或動態路由器?

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

    // ctor, getters, setters, etc. 
} 

而下面的路線(春季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

理解的Content-Based Router<choice/>是,它允許你添加條件if-else-if邏輯到線路。但我不認爲我想這是因爲我需要的是不是有條件的:我總是希望MyPOJO#Fizzdirect:fizzFarm,我總是MyPOJO#Buzzdirect:buzzFarm

我的瞭解的一個Dynamic Router是它會動態路由消息到不同的目的地,雖然我現在還不太確定。我相信這是我想要的,但是,出來的myPOJOFactory bean,交換將包含一個MyPOJO對象。我覺得我必須在將它發送到動態路由器之前首先拆分MyPOJO。這樣,動態路由器將能夠清楚地看到該消息是否爲FizzBuzz,並且路由正確。

所以我相信我需要與動態路由器結合使用分離器。我只是沒有看到樹林裏的森林。事情是這樣的:

<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分割成MyPOJOFizzBuzz和#2設置路由器的路由FizzBuzz到不同的目的地)?提前致謝!

回答

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的語法,U還可以嘗試在XML)

希望你覺得這個有用。

+0

真棒回答,很好的建議!這很容易轉換成Spring XML,再次感謝! – IAmYourFaja

+0

不客氣隊友:) – vikingsteve