Asyn c Неблокирующая многоадресная передача с верблюдом - PullRequest
0 голосов
/ 24 марта 2020

У меня два запроса: 1. Можем ли мы иметь неблокирующие асин c маршруты на верблюде. Я вижу asyn c с seda, но тогда, если разгрузки работают на другой поток, который блокирует. 2. Если да, можем ли мы использовать многоадресную рассылку в таких маршрутах. Следующее - мой многошаговый верблюжий маршрут, который, кажется, работает. Но не уверен, что это асин c или неблокирующий асин c.

from("direct:multiStep")
             .to("bean:routeHandler?method=monoReturningMethod1")
             .process(new UnwrapStreamProcessor())
             .to("bean:routeHandler?method=monoReturningMethod2")
             .process(new UnwrapStreamProcessor())

Выше работ, и веб-запрос имеет ответ от monoReturningMethod. В этом случае я хочу убедиться, что весь процесс не блокируется.

Для многоадресной передачи я экспериментирую со следующим маршрутом. Не уверен, куда поставить UnwrapStreamProcessor. Я пытался поставить его после end(), но он не работает. Нужен ли кастом Processor? Или как я могу ie все Mono вернуть в одном?

from("direct:incoming")
         .multicast()
         .parallelProcessing()
         .to("bean:routeHandler?method=monoReturningMethod1", "bean:routeHandler?method=monoReturningMethod2")
         .end()

Я использую apache `верблюд 3.0.1 с пружинным загрузчиком.

@Component("routeHandler")
public class RouteHandler {
     Mono<Entity> monoReturningMethod1(Exchange exchange) {
          //make some WebClient request which returns Mono.
     }
     Mono<Entity> monoReturningMethod2(Exchange exchange) {
          //make some WebClient request which returns Mono.
     }
}

Этот маршрут обрабатывает входящий веб-запрос. Как сделать так, чтобы вся обработка маршрута была неблокируемой и asyn c. Я попытался использовать process(new UnwrapStreamProcessor()) в качестве шага процесса после monoReturningMehtod, и если я делаю это последовательно, это работает. Но он не работает с многоадресной рассылкой и не допускает перезаписи исходного сообщения. Любые предложения?

PS: я запускаю свой асин c поток, как показано ниже: producerTemplate.asyncSend("RouteName", exchange)

1 Ответ

0 голосов
/ 30 марта 2020

Согласно этой странице , все EIP поддерживаются механизмом маршрутизации asyn c, но не все типы конечных точек (компоненты) . Некоторые компоненты имеют только ограниченную поддержку, то есть они могут потреблять или производить только асинхронно.

Вы можете использовать Threads DSL в своем маршруте, чтобы сообщить Camel, что с этого момента сообщения должны маршрутизироваться асинхронно в новом потоке.

...