[英]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&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
能夠“拆分”到其組成的Fizz
和Buzz
字段中,但我希望它們被路由到不同的目的地。 也許Fizz
去了direct:fizzFarm
而Buzz
去了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&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
分為Fizz
和Buzz
,以及#2設置路由器以將Fizz
和Buzz
路由到不同的目的地)?
您是對的,因為邏輯總是相同的,所以路由器可能會過大。
拆分器最常與相同類型的對象一起使用(例如,拆分列表並分別處理每個項目)
所以我可以建議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.