我有以下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
属性,然后路由{{1一种方式,Fizz
另一种方式。
我对Splitter的理解是它只需要交换的主体并将其分解为2个以上对象的集合。但我不认为这是我想要的,因为虽然我希望Buzz
能够“分裂”到其成分MyPOJO
和Fizz
字段中,但我希望它们路由到不同的目的地。也许Buzz
转到Fizz
而direct:fizzFarm
转到Buzz
。
我对Content-Based Router(direct:buzzFarm
)的理解是,它允许您将条件<choice/>
逻辑添加到路径中。但我不认为我想要这个,因为我需要的不是条件:我总是希望if-else-if
转到MyPOJO#Fizz
,而我总是希望direct:fizzFarm
转到MyPOJO#Buzz
。
我对Dynamic Router的理解是它会动态地将消息路由到不同的目的地,尽管我还不确定。我相信这就是我想要的,但是,从direct:buzzFarm
bean出来,交换将包含一个myPOJOFactory
对象。我觉得在将{{1}}发送到动态路由器之前,我必须首先拆分MyPOJO
。这样,动态路由器将能够清楚地看到消息是MyPOJO
还是Fizz
,并正确路由。
所以我认为我需要将分离器与动态路由器结合使用。我只是没有看到森林穿过树林。像这样:
Buzz
关于如何实现这一点的任何想法(#1将<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>
拆分为MyPOJO
和Fizz
,以及#2设置路由器以路由Buzz
和{ {1}}到不同的目的地)?
答案 0 :(得分: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语法,你也可以用XML来试试。)