我有一个bean,它使用Camel中的ProducerTemplate生成对象并将它们发送到SEDA队列。
我发送了一个正文和标题:
producerTemp.sendBodyAndHeader(document, "sourceSystem", sourceSys);
此处标题名称为sourceSystem
,标题对象值为ENUM(sourceSys
),其中包含document
对象的来源,其中包含许多不同的属性。
我希望从SEDA队列以并发方式提取消息,并根据sourceSys枚举的值将它们发送到不同的端点。
骆驼使用它的效率最高的EIP是什么?有没有人使用Java DSL的例子,我不知道如何测试Enum的价值?
我在想我做这样的事情:
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");
...
答案 0 :(得分:4)
您可以使用收件人列表EIP http://camel.apache.org/recipient-list.html
然后例如使用java bean来计算消息应该去的uri。
from("seda:a")
.recpientList().method(MyBean.class, "whereToGo");
在bean中你可以使用bean参数绑定。
所以你可以按如下方式绑定标题:
public class MyBean {
public String whereToGo(String body, @Header("foo") SourceSysEnum sys) {
...
}
}
如果您不需要邮件正文,则可以省略该参数。
答案 1 :(得分:1)
您可以使用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;
}
}
}