Это то, что доставило мне немало хлопот. Есть несколько способов снятия шкуры с этой кошки, и ни один из них не настолько хорош, насколько я вижу.
Вкл. - установить, чтобы маршрут не запускался автоматически, и использовать расписание для запуска маршрута, а затем через короткое время снова его остановить, используя EIP пульта управления. http://camel.apache.org/controlbus.html
Мне не понравился этот подход, потому что я не верил, что он полностью опустошит очередь один раз и только один раз за триггер.
Другой способ - использовать pollEnrich
для запроса очереди, но, похоже, он выбирает только один элемент из очереди, но я хотел полностью его удалить (только один раз).
Я написал пользовательский компонент, использующий шаблоны потребителей и производителей для чтения всех записей в очереди с заданным временем ожидания.
Я где-то нашел пример в Интернете, но мне потребовалось много времени, чтобы найти его, и после быстрого поиска я не могу его найти.
Итак, что у меня есть:
from("timer:myTimer...")
.beanRef( "myConsumerBean", "pollConsumer" )
from("direct:myProcessingRoute")
.to("whatever");
И простой pollConsumer
метод:
public void pollConsumer() throws Exception {
if ( consumerEndpoint == null ) consumerEndpoint = consumer.getCamelContext().getEndpoint( endpointUri );
consumer.start();
producer.start();
while ( true ) {
Exchange exchange = consumer.receive( consumerEndpoint, 1000 );
if ( exchange == null ) break;
producer.send( exchange );
consumer.doneUoW( exchange );
}
producer.stop();
consumer.stop();
}
где производитель - DefaultProducerTemplate
, потребитель - DefaultConsumerTemplate
, и они настроены в конфигурации компонента.
Кажется, это работает для меня, но если кто-нибудь даст вам лучший ответ, мне будет очень интересно посмотреть, как это можно сделать лучше.