Как запланировать использование JMS в Apache Camel? - PullRequest
0 голосов
/ 08 января 2019

Мне нужно принимать сообщения JMS с Camel каждый день в 21:00 (или с 9:00 до 22:00, чтобы дать ему время поглотить все сообщения).

Я не вижу никакой опции "планировщика" для URI "cMQConnectionFactory: queue: myQueue", пока она существует для URI "file: //" или "ftp: //".

Если я поставлю cTimer до того, как он отправит пустое сообщение в очередь, а не запланирует потребителя.

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Это то, что доставило мне немало хлопот. Есть несколько способов снятия шкуры с этой кошки, и ни один из них не настолько хорош, насколько я вижу.

Вкл. - установить, чтобы маршрут не запускался автоматически, и использовать расписание для запуска маршрута, а затем через короткое время снова его остановить, используя 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, и они настроены в конфигурации компонента.

Кажется, это работает для меня, но если кто-нибудь даст вам лучший ответ, мне будет очень интересно посмотреть, как это можно сделать лучше.

0 голосов
/ 08 января 2019

Вы можете использовать политику маршрута, где вы можете настроить, например, выражение cron, чтобы сообщить, когда маршрут запущен и когда он остановлен.

http://camel.apache.org/scheduledroutepolicy.html

Другими альтернативами является запуск / остановка маршрута через Java API или JMX и т. Д., А также некоторая другая логика, которая знает, когда делать это в соответствии с часами.

...