我有以下 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
将“ split ”为其组成部分Fizz
和Buzz
字段,我希望它们路由到不同的目的地。也许Fizz
转到direct:fizzFarm
和Buzz
转到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&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中尝试)。
关于java - Apache Camel : Splitter, CBR 还是动态路由器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20684259/