Маршрут "Пожар потом возвращайся" в Apache Верблюд - PullRequest
1 голос
/ 31 января 2020

Мы используем Apache Camel для запуска некоторых процессов в наших приложениях, например:

from("quartz2://sometThing/someQueue?cron=0+0+4+?+*+MON-SUN").setBody(constant(""))
    .routeId(this.getClass().getSimpleName())
    .to("jms:some-trigger-queue");

У нас есть группа процессоров из очереди запуска для выполнения каждого задания, например:

from("jms:some-trigger-queue")
    .processRef("someProcessor");

Некоторые из этих процессоров, в свою очередь, будут записывать сообщения в очереди JMS. Проблема, которую я пытаюсь исправить, состоит в том, что процессоры не передадут сообщения JMS посреднику, пока весь процесс не будет завершен. Я подозреваю, что это связано с тем, что в очереди триггера есть сообщение в полете («jms: some-trigger-queue»), и поскольку процессоры используют тот же контекст, который они не будут фиксировать, пока сообщение в полете не будет очищено (к вашему сведению пытался принудительно создать новые транзакции внутри процессоров, но безуспешно как я могу настроить верблюд так, чтобы он запускал процессор и сразу же двигался дальше (т. е. чтобы убрать триггерное сообщение из полета)?

1 Ответ

1 голос
/ 31 января 2020

Если вы хотите вызвать процессоры, а затем сразу же продолжить, то вы можете использовать Wire Tap EIP (https://camel.apache.org/manual/latest/wireTap-eip.html).

Например:

    from("jms:some-trigger-queue")
            .wireTap("direct:callProcessor");

    from("direct:callProcessor")
            .processRef("someProcessor");

Таким образом, маршрут direct: callProcessor будет выполняться в отдельном потоке, а jms: some-trigger-queue продолжит маршрутизацию, не ожидая ответа от direct : callProcessor 1015 *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...