2011-07-26 60 views
3

我有一個bean產生對象並使用Camel中的ProducerTemplate將它們發送到SEDA隊列。Camel Java DSL - 在頭部的ENUM路由 - 基於conent的路由器或動態路由器

我發送一本體及一標頭:

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

在這裏,標題名是sourceSystem和標題對象值是一個ENUM(sourceSys),其中包含document對象的含有許多不同的充attribs的源。

我想從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

您可以使用收件人列表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

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