Верблюд ApacheMQ -> AHC поведение (блокировка?)
Я только начал использовать Apache Camel, и меня интересует кажущееся нелогичным поведение по умолчанию асинхронного http-клиента (AHC). Принимая сообщения от ActiveMQ, я не могу заставить его работать неблокирующим образом.
Мой маршрут выглядит так:
@Component
public class Broadcaster extends RouteBuilder {
@Override
public void configure() throws Exception {
errorHandler(deadLetterChannel("activemq:failed.messages"));
from("activemq:outbound.messages")
.setExchangePattern(ExchangePattern.InOnly)
.recipientList(simple("ahc:${in.header[PublishDestination]}"))
.end();
}
}
Я поставил в очередь несколько сообщений, половину из которых я отправил на задержанный веб-сервер, а другую - на нормальное. Я ожидал увидеть все обычные сообщения, потребляемые быстрым сервером, и медленные сообщения постепенно со временем. Однако такое поведение наблюдается на быстром веб-сервере:
00:24:02.585, <hello>World</hello>
00:24:03.622, <hello>World</hello>
00:24:04.640, <hello>World</hello>
00:24:05.658, <hello>World</hello>
Как видите, между каждым зарегистрированным запросом ровно одна секунда, что соответствует искусственной задержке в 1 секунду на медленном сервере. Исходя из времени маршрутизации, похоже, что потребитель JMS ожидает завершения AHC, прежде чем он получит следующее сообщение из очереди:
Processor Elapsed (ms)
[activemq://outbound.messages ] [ 1020]
[setExchangePattern[InOnly] ] [ 0]
[ahc:${in.header[PublishDestination]}} ] [ 1018]
Я должен явно использовать асинхронные производители и писать обработчики обратного вызова в этих случаях, или я что-то упускаю? Спасибо!
1 ответ
Ну, в случае RTFM, я думаю, хотя моя страница ActiveMQ оставляет желать лучшего с точки зрения свойств, доступных для конфигурации конечной точки. Вероятно, должна быть заметка о том, что большинство (всех?) Опций конфигурации JMS также доступны для компонента ActiveMQ. В любом случае решение состоит в том, чтобы определить потребителя следующим образом:
from("activemq:outbound.messages?asyncConsumer=true")