Camel Java DSL - маршрутизация на ENUM в заголовке - на основе conent или динамического маршрутизатора - PullRequest
3 голосов
/ 26 июля 2011

У меня есть бин, который создает объекты и отправляет их в очередь SEDA, используя ProducerTemplate в Camel.

Отправляю тело и заголовок:

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");

..

Ответы [ 2 ]

4 голосов
/ 27 июля 2011

Вы можете использовать список получателей EIP http://camel.apache.org/recipient-list.html

А затем, например, использовать Java-бин для вычисления URI, куда должно идти сообщение.

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

И в бинеВы можете использовать привязку параметров бина.

Таким образом, вы можете связать заголовок следующим образом:

public class MyBean {

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

Если выВам не нужно тело сообщения, тогда вы можете опустить этот параметр.

1 голос
/ 26 июля 2011

Вы можете использовать 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;
    } 
  }
}
...