Camel Java DSL - маршрутизация на enum в заголовке - маршрутизатор на основе Conent или динамический маршрутизатор
-
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");
А в бобах вы можете использовать привязку параметров бобов.
- http://camel.apache.org/bean-binding.html
- http://camel.apache.org/parameter-binding-annotations.html
Таким образом, вы можете связать заголовок следующим образом:
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;
}
}
}