Camel Java DSL - 在头部的ENUM上路由 - 基于内容的路由器或动态路由器

时间:2011-07-26 15:17:27

标签: java apache-camel eip

我有一个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");

...

2 个答案:

答案 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)

您可以使用ProcessorRouting 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;
    } 
  }
}