Легкий рабочий процесс с верблюдом

В настоящее время я занимаюсь разработкой облегченной системы обмена сообщениями. Для этой системы обмена сообщениями (легкий концентратор) мне требуется небольшой рабочий процесс на основе маршрутов. Во-первых, я не хочу использовать движок рабочего процесса или движок bpm, так как это было бы излишеством для такого легкого решения для обмена сообщениями.

Мои требования просты — я предпочитаю иметь решающий модуль/компонент, который в основном определяет следующий шаг/конечную точку/компонент. Решающее устройство принимает во внимание текущий статус сообщения, некоторые предопределенные функциональные правила (возможно, в базе данных) и некоторые технические правила, если это необходимо. Я думал о связи между различными конечными точками/компонентами на основе jms (эти конечные точки будут внутренними конечными точками как часть приложения) - это позволит слабую связь, а также будет более масштабируемым.

Я смотрел на верблюда и как и если бы он мог помочь, но я не мог понять, как следующие шаги в маршруте будут определяться модулем / компонентом центрального решающего устройства.

Я также рассматривал возможность иметь несколько решающих модулей и при необходимости соединять их в цепочку (если верблюд будет здесь полезен). Любая идея, как это можно реализовать с помощью верблюда или любой другой среды или просто с помощью java с пружиной?


person Abby    schedule 12.06.2018    source источник


Ответы (1)


Вы можете использовать заголовок сообщения, установленный вашим решающим устройством, и маршрутизацию на основе содержимого для управления потоком сообщений. Например:

В вашем маршруте, который получает сообщение

...
.from(endpointreceivingmessage)
.process(decider)
.recipientList(simple("direct:${header.destinationRoute"));

В вашем решающем процессоре

...
doProcess(Exchange exchange) throws Exception{
Message message = exchange.getIn(); 

//logic to determine next step
message.setHeader("destinationRoute", "DestinationRoute1"); 

exchange.setIn(message); 
}

Тогда у вас могут быть разные маршруты для вашего следующего шага, которые также могут быть маршрутами от процессоров к решающим цепочкам.

Альтернативой использованию ReceiveList было бы использование выбора:

.choice
 .when(simple("{header.destinationRoute} is 'DestinationRoute1'"))
  .to("direct:DestinationRoute1")
 .when(simple("{header.destinationRoute} is 'DestinationRoute2'"))
  .to("direct:DestinationRoute2")
  ...
person Mark    schedule 13.06.2018
comment
Спасибо. Я понимаю. Однако в этом случае не будет ли использование верблюда накладными расходами, поскольку я в конечном итоге буду использовать всего пару маршрутов, а решающий фактор фактически проработает следующие шаги? - person Abby; 14.06.2018
comment
Извините, что поднимаю действительно старую тему, но я думаю, что вам нужен динамический маршрутизатор. Достаточно хорошая документация находится здесь: github.com/apache/camel/blob/master/camel-core/src/main/docs/ - person ShellDragon; 12.12.2018