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

StackOverflow https://stackoverflow.com/questions/6832375

  •  27-10-2019
  •  | 
  •  

Вопрос

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

Я посылаю тело и заголовок:

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

Здесь имя заголовка sourceSystem и значение объекта заголовка - это перечисление (sourceSys), который содержит источник document Объект, содержащий ряд различных атрибутов.

Я хочу вытащить сообщения одновременно из очереди SEDA и отправить их в разные конечные точки в зависимости от значения перечисления источников.

Каков самый эффективный 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");

..?

Это было полезно?

Решение

Вы можете использовать список получателей EIPhttp://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) {
      ...
   }
}

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

Другие советы

Вы можете использовать Processor в сочетании с Routing Slip Чтобы выполнить это с помощью оператора переключения. Я не уверен, насколько это будет эффективнее, если у вас нет тонны значений Enum. Это, однако, даст вам больше гибкости, если вам нужно добавить более сложную логику в будущем.

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;
    } 
  }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top