2016-03-07 4 views
1

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

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

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

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

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

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

Благодаря Рамеш.

ответ

1

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

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

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

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

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

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

+0

Привет Fritz ... спасибо за ответ ... Я хотел бы установить интервал задержки, а не выборка х количество сообщений сразу Можете ли вы помочь для такого использования дело? –

+0

Просто установите prefetchSize на 1. Важная особенность предварительной выборки, которую вы используете, заключается в том, что потребитель ждет с дальнейшим потреблением до тех пор, пока не будет подтверждено последнее извлеченное сообщение. –

0

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

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

Смежные вопросы