3

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

..?

4

2 回答 2

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) {
      ...
   }
}

如果您不需要消息正文,则可以省略该参数。

于 2011-07-27T17:40:37.807 回答
1

您可以使用 aProcessor与 a 结合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;
    } 
  }
}
于 2011-07-26T15:38:06.080 回答