Как отложить получение сообщений в Apache Camel из ActiveMQ

У меня есть требование, при котором мне нужно регулировать входящий трафик путем формирования (постановки в очередь) входящего трафика, когда клиентское приложение отправляет более 1000 запросов в течение 5 секунд.

Решение, которому я следовал: у меня есть верблюд: дроссельная заслонка, устанавливающая максимальное количество запросов на 1000 и временной интервал до 5 секунд. Когда порог превышен, я обнаруживаю исключение дроссельной заслонки, и в блоке onException я отправляю регулируемые сообщения в очередь запросов ActiveMQ для дальнейшей обработки позже, поскольку Camel перегружен на основе конфигурации 1000 запросов / 5 секунд.

Мне удалось реализовать вышеизложенное, однако я хотел бы, чтобы потребитель Camel продолжал обрабатывать позже не все сообщения из очереди запросов ActiveMQ за один раз, а не обрабатывать каждое сообщение с задержкой в ​​10 секунд, например,

Я не могу установить параметр в ActiveMQ, чтобы задержать сообщение потребителю или задержать потребителя Camel, вытаскивающего сообщение из очереди запросов.

Как мне удовлетворить мое указанное выше требование

Пожалуйста помоги

Спасибо Рамешу.


person Ramesh Mohan Reddy    schedule 07.03.2016    source источник


Ответы (2)


В другом потоке SO, победившие ответы продвигают следующее решение:

from("activemq:queueA").throttle(10).to("activemq:queueB")

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

from("activemq:queueA?&destination.consumer.prefetchSize=10").throttle(10).to("activemq:queueB")

Это основная причина, прямо из http://activemq.apache.org/what-is-the-prefetch-limit-for.html.

Таким образом, ActiveMQ использует ограничение предварительной выборки на количество сообщений, которые могут быть переданы потребителю в любой момент времени. По достижении предела предварительной выборки сообщения больше не отправляются потребителю, пока потребитель не начнет отправлять обратно подтверждения сообщений (чтобы указать, что сообщение было обработано). Фактическое значение предела предварительной выборки можно указать для каждого потребителя.

person Fritz Duchardt    schedule 07.03.2016
comment
Привет, Фриц ... спасибо за ответ ... Я бы хотел установить интервал задержки, а не получать x количество сообщений за раз. Не могли бы вы помочь в этом случае? - person Ramesh Mohan Reddy; 07.03.2016
comment
Просто установите для prefetchSize значение 1. Важной особенностью предварительной выборки, которую вы используете, является то, что потребитель ждет с дальнейшим потреблением, пока не будет подтверждено последнее полученное сообщение. - person Fritz Duchardt; 07.03.2016

Вы можете включить запланированную доставку ActiveMQ, а затем установить в своем Camel Route заголовок AMQ_SCHEDULED_DELAY, а затем отправить свой обмен в очередь. Это приведет к введению задержки AMQ_SCHEDULED_DELAY в миллисекундах до того, как сообщение появится в очереди (т.е. станет доступным для использования).

Проверьте это: http://activemq.apache.org/delay-and-schedule-message-delivery.html

person Vassilis    schedule 26.05.2016