2011-07-26 11 views
3

私はオブジェクトを生成するBeanを持っていて、それをCamelのProducerTemplateを使ってSEDAキューに送ります。ここCamel Java DSL - ヘッダコンセントベースのルータまたはダイナミックルータのENUMでのルーティング

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

ヘッダ名がsourceSystemとヘッダオブジェクト値がENUM(sourceSys)でdifferntはattribsの数を含むdocumentオブジェクトのソースを含んでいる:

Iは本体とヘッダを送信します。

私は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

あなたはhttp://camel.apache.org/recipient-list.html

EIP 受信者リストを使用し、例えばメッセージが行くべきURIを計算するためにJava Beanを使用することができます。

from("seda:a") 
    .recpientList().method(MyBean.class, "whereToGo"); 

さらに、Beanパラメータバインディングを使用できます。

public class MyBean { 

    public String whereToGo(String body, @Header("foo") SourceSysEnum sys) { 
     ... 
    } 
} 

を使用すると、メッセージ本文が必要ないけない場合、あなたはそのパラメータを省略することができ、次のように

  • http://camel.apache.org/parameter-binding-annotations.html
  • http://camel.apache.org/bean-binding.html

    • は、だから、ヘッダーをバインドすることができます。

    1

    あなたはswitch文を使ってこれを実現するためにRouting Slipと組み合わせProcessorを使用することができます。私はあなたが大量の列挙値を持っていない限り、どれだけ効率が良いかわからない。ただし、将来複雑なロジックを追加する必要がある場合は、より柔軟に対応できます。

    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; 
        } 
        } 
    } 
    
    関連する問題