2016-01-20 3 views
1

Упрощенный:
У меня есть очередь в activemq. Когда определенное сообщение считывается из очереди, я хочу заблокировать очередь, пока этот процесс не закончит работу над полученным сообщением.Как заблокировать очередь сообщений

Дополнительная информация:
У меня есть система с большим количеством пользователей. Каждый раз, когда пользователь меняет свое состояние в системе (профиль, роль, доступ, право собственности на актив и т. Д.), Мне также необходимо обновить сторонний сервер с этими изменениями. Эта третья сторона отдельно от нас, и api, которую они выставляют, позволяет мне обновлять только одного пользователя за раз и занимает около секунды.
Я использую ActiveMQ для отсоединения основного процесса обновления от обновления сторонней системы.

Однажды ночью я получаю файл фида, который может содержать тысячи пользовательских изменений. Поскольку это критическая задача, и обновление третьей стороны не так чувствительно к времени, и, поскольку обновление третьей стороны может потребоваться для чтения из той же таблицы, основной процесс - массовое обновление, мне нужно заблокировать очередь. Смысл, я хочу, чтобы activeMQ получал сообщения для каждого пользователя, которого я изменил в основном процессе, но также хочу, чтобы ActiveMQ поддерживал эти сообщения до тех пор, пока основной процесс не будет выполнен.

Любой встроенный механизм в ActiveMQ для этого?

+0

Если я правильно понял, у вас есть система, которая [процесс обновления] -AMQ-> [адаптер] -> [сторонний API], и вы не хотите, чтобы адаптер работал до тех пор, пока не будет загружен процесс обновления все сообщения в? –

ответ

0

Обычно вы читаете сообщение за раз для каждого потребителя.

Вы, как правило, есть слушатель, который выглядит следующим образом:

void onMessage(Message message) { 

    // .. 
    updateExternalAPI(); // Sync. call to external API 

} 

Так что, когда ваш метод onMessage заканчивается, сообщение привержен и что потребитель будет приступить к следующему сообщению. Таким образом, только одно сообщение будет обрабатываться одновременно - ЕСЛИ есть только один потребитель.

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

Если вы не можете сделать это и/или иметь несколько узлов - ActiveMQ предлагает решение. Добавьте ?consumer.exclusive=true в свою очередь в клиенте, чтобы заставить ActiveMQ выбрать одного потребителя для отправки сообщений.

Пример UPDATE.USER.INFO?consumer.exclusive=true.

+0

Есть один потребитель. Но то, что он потерял, когда выполняется произвольный процесс, ActiveMQ не будет выпускать больше сообщений, которые он имеет в своей очереди. Он хочет, чтобы ActiveMQ поддерживал эти сообщения, пока AMQ не получит «зеленый свет» –

+0

Это правильно. Я реализовал свое собственное решение для блокировки, но задавался вопросом, есть ли способ сигнализировать AMQ о блокировке одной темы/очереди –

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

  • Нет связанных вопросов^_^