2014-01-20 6 views
0

Я новичок в использовании ActiveMQ и пытаюсь понять, как работает сеть брокеров. Я прочитал документацию activemq, а также просмотрел некоторые статьи в Интернете, такие как http://www.jakubkorab.net/2011/11/understanding-activemq-broker-networks.htmlСеть брокерских центров ActiveMQ:

У меня есть следующая настройка на моем локальном рабочем столе Windows. Существует 2 сервера tomcat, работающих на 8080 и 9080 соответственно, с веб-приложением, в которое включено активное приложение mq. Веб-приложение запускает брокер на старте вверх и, следовательно, у меня есть следующий 2 брокеров, когда оба сервера находятся на

Брокер A: Бег на 61616 брокер B: Бег на 61617

Брокер A имеет сетевой разъем установлен в есть подключение к брокеру B и брокер B имеет сетевое подключение к брокеру а как с конфигурации по умолчанию

Я наблюдаю следующее поведение

  1. При подключении к веб-приложение на сервере а, опубликовать сообщение, начать сотрудничество nsumer в веб-приложении на сервере B и попытайтесь получить сообщение. Я получаю сообщение, и оно удаляется из обоих брокеров A и B. Я тестирую, пытаясь получить сообщение с использованием метода receiveSelected впоследствии, и я не получаю никаких данных.
  2. Когда я подключаюсь к веб-приложению на сервере A, публикую сообщение, запускаю пользователя в веб-приложении на сервере A и пытаюсь получить сообщение, которое я получаю, и оно удаляется из обоих брокеров A и B. Те же тесты, что и в пункте 1, check

Мой вопрос: в какой момент сообщение удаляется из магазинов для обоих брокеров - я только после того, как потребитель запросил сообщение и подтвердил его? Означает ли это, что во время публикации сообщение находится в местных магазинах обоих брокеров?

ответ

2

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

Поскольку предварительная выборка по умолчанию равна 1000, это означает, что 750 сообщений должны пересекать мост (сетевое соединение между двумя брокерами) и быть уничтожены + подтверждены другим нисходящим клиентом до того, как один брокер поднимет сообщения другому брокеру, на в то время исходный производитель-брокер может удалить эти сообщения из постоянного хранилища.

Сообщение «одноразовый» только одним брокером за раз в сети таким образом.

На момент публикации издатель получает ответ от брокера, к которому он подключен. Обратите внимание, что ответ может задерживаться до тех пор, пока сообщение не будет сохранено на диске, или оно может не совпадать - в зависимости от нескольких факторов, включая тип адресата (очередь по сравнению с темой vs temp dest), режим сохранения сообщения (PERSISTENT vs NON_PERSISTENT), транзакционный режим сессии и многое другое. Чтобы ответить на вопрос напрямую, если сообщение сохраняется на диске синхронно, сообщение гарантируется только в постоянном хранилище брокера, непосредственно обслуживающего этого клиента после завершения вызова send() или commit().

Существует много взаимодействия между брокерами, а также между клиентами и брокерами, которые выполняются асинхронно, и многое, что выполняется синхронно.Получение сообщений отвечает требованиям JMS для локального брокера: вызовы send() и commit() синхронны между клиентом и брокером и выполняются только при выполнении гарантии. Выражения признательны асинхронно; клиенты всегда должны быть готовы к повторной доставке сообщения в случае потерянных подключений или сбоев брокера (при рассмотрении последовательности событий между клиентом и сервером это невозможно полностью исключить). Неисправные отправления() и commits(), вызванные потерянными подключениями, могут привести либо к отброшенному сообщению, либо к сохраненному сообщению (опять же, не полностью разрешимому), поэтому клиенты должны быть готовы обрабатывать дубликаты.

+0

Спасибо за подробное объяснение. Хотя он дает некоторую перспективу, он не отвечает на вопрос, который у меня есть, так это то, что в моей настройке брокеры, похоже, работают как набор. Поэтому независимо от того, какой брокер я публикую сообщение, я могу получить его от брокера только после того, как он будет получен, я не смогу его получить снова. Я использую шаблон JMS Spring со следующими свойствами: – user3215143

+0

<свойство name = "sessionTransacted" value = "true" /> <свойство name = "sessionAcknowledgeMode" value = "# {T (javax.jms.Session) .AUTO_ACKNOWLEDGE } "/> – user3215143

+0

Используется семантика JMS. Очереди - это одноразовое потребление сообщения для всех потребителей, независимо от местонахождения потребителя в сети брокеров (с упомянутыми выше предостережениями о доставке). Темы передают сообщения всем потребителям. – ash

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