Как выполнять маршруты Camel с различными обменами синхронно? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть несколько синхронных верблюжьих маршрутов с:

from("file:...")
...
.to("direct:next1")

from("direct:next1")
...

Теперь я хотел бы запустить другой маршрут с другим обменом синхронно:

from("file:local/A")
...
.to("file:remote/A")
.to("direct:next2")

from("file:remote/A")  // direct:next2 ?
...

Как мне этого добиться?

1 Ответ

0 голосов
/ 07 ноября 2018

Прежде всего - слон в комнате. Оба ваших file маршрута будут запускаться и выполняться асинхронно по умолчанию, потому что между этими двумя маршрутами на уровне EIP нет зависимости, позволяющей одному запускать один за другим.

Есть два способа решения этой проблемы (например, чтобы вызвать взаимозависимость между маршрутами):

  • Требуется local/A, чтобы запустить маршрут remote/A (и не пытаться re запустить маршрут, если он выполняется.
  • Разрешить remote/A опрашивать файл через заданные интервалы.

Цепной запуск маршрутов является более сложной функцией Camel и позволяет точно определять жизненный цикл маршрутов на досуге. В этом случае, после того как ваш маршрут файла local/A завершит использование, он запустит маршрут remote/A.

Для этого мы можем использовать Control Bus EIP , которая позволяет напрямую контролировать жизненный цикл маршрутов.

from("file:local/A")
        .routeId("localA")
        .process(aProcessor)
        .to("controlbus:route?routeId=remoteA&action=start");

from("file:remote/A")
        .routeId("remoteA")
        .autoStartup(false)
        .process(aDifferentProcessor)
        .to("controlbus:route?routeId=remoteA&action=suspend&async=true");

Опрос, пожалуй, самый простой подход, и он не требует особого внимания. Либо файл существует, либо его нет, когда вы приступаете к его обработке, и вы можете подождать определенный период времени, когда этот файл появится снова.

from("file:local/A")
        .routeId("localA")
        .process(aProcessor);


from("file:remote/A?delay=2m")
        .routeId("remoteA")
        .process(aDifferentProcessor);
}

Моим предпочтением будет опрос с фиксированным интервалом или по расписанию хрон, просто потому, что не похоже, что вы получите истинную синхронность с любым подходом. Вы можете сами решать, что и когда срабатывать, но это не на 100% синхронно, как direct маршруты.

...