驼峰Java DSL——在基于报头内容的路由器或动态路由器中基于ENUM的路由



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

最新更新