Camel Java DSL - маршрутизация по ENUM в заголовке - маршрутизатор на основе conent или динамический маршрутизатор

У меня есть bean-компонент, который создает объекты и отправляет их в очередь 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");

..?


person NightWolf    schedule 26.07.2011    source источник


Ответы (2)


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

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

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

А в bean-компоненте вы можете использовать привязку параметров bean-компонента.

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

public class MyBean {

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

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

person Claus Ibsen    schedule 27.07.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;
    } 
  }
}
person Ryan Gross    schedule 26.07.2011