我有一个bean,它使用Camel中的ProducerTemplate生成对象并将它们发送到SEDA队列。
我发送一个正文和一个报头:
producerTemp.sendBodyAndHeader(document, "sourceSystem", sourceSys);
这里头名称是sourceSystem
,头对象值是一个ENUM (sourceSys
),其中包含document
对象的源,包含许多不同的属性。
我想以并发方式从SEDA队列中提取消息,并根据sourceSys enum的值将它们发送到不同的端点。
什么是骆驼中最有效的EIP使用这个,是否有人使用Java DSL的例子,我不确定如何测试枚举的值?
我想我应该这样做:
from("seda:a")
.choice()
.when(header("foo").isEqualTo(SourceSysEnum.SYSTEM1))
.to("seda:b")
.when(header("foo").isEqualTo(SourceSysEnum.SYSTEM2))
.to("seda:c")
.otherwise()
.to("seda:d");
. . ?
您可以使用收件人列表EIPhttp://camel.apache.org/recipient-list.html
然后使用java bean来计算消息应该去的uri。
from("seda:a")
.recpientList().method(MyBean.class, "whereToGo");
在bean中你可以使用bean参数绑定。
- http://camel.apache.org/bean-binding.html
- http://camel.apache.org/parameter-binding-annotations.html
所以你可以这样绑定标题:
public class MyBean {
public String whereToGo(String body, @Header("foo") SourceSysEnum sys) {
...
}
}
如果你不需要消息体,那么你可以省略该参数
您可以使用一个Processor
和一个Routing Slip
结合使用一个switch语句来完成这个任务。我不确定这会有多高效,除非你有大量的枚举值。但是,如果将来需要添加更复杂的逻辑,它将为您提供更大的灵活性。
from("seda:a")
.process(new SourceSysRoutingSlipProvider())
.routingSlip(SourceSysRoutingSlipProvider.HEADER_NAME);
public class SourceSysRoutingSlipProvider : Processor {
public static String HEADER_NAME="sourceSystemRoutes";
public void process(Exchange exchange) throws Exception {
Message in = exchange.getIn();
switch( in.getHeader("sourceSystem") ) {
case SourceSysEnum.SYSTEM1:
in.setHeader(HEADER_NAME, "seda:b");
break;
case SourceSysEnum.SYSTEM2:
in.setHeader(HEADER_NAME, "seda:c");
break;
...
default:
in.setHeader(HEADER_NAME, "seda:d");
break;
}
}
}