3

CamelのProducerTemplateを使用して、オブジェクトを生成し、それらをSEDAキューに送信するBeanがあります。

本文とヘッダーを送信します。

producerTemp.sendBodyAndHeader(document, "sourceSystem", sourceSys);

ここで、ヘッダー名はsourceSystemであり、ヘッダーオブジェクト値はENUM(sourceSys)であり、これには、いくつかの異なる属性を含むオブジェクトのソースが含まれていdocumentます。

SEDAキューから同時にメッセージをプルし、sourceSys列挙型の値に応じて異なるエンドポイントにメッセージを送信したいと思います。

これを使用するためにラクダで最も効率的な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");

..?

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

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;
    } 
  }
}
于 2011-07-26T15:38:06.080 に答える