2016-02-06 3 views
0

В режиме jpm (v1.0) клиентского клиента, message.acknowledge() - единственный способ отправить ответ на сервер (брокер). Фактическое поведение - если клиент ack to message3, то клиент отправителя сообщения (брокер) отвечает на все сообщения до сообщения3 [1].Как гарантированная доставка работает в режиме подтверждения клиента JMS?

i.e msg1, msg2, msg3 поставляется заказчику по порядку.

  1. Клиентские сообщения процесса ACK для каждого сообщения, msg1, msg2 и msg3. >> OK
  2. Зная реальное поведение клиента, как ACKs партий (размер партии = 3), поэтому просит msg3> OK (все сообщения ДО msg3 получить acked)

В сценарии 1 и 2, брокер получить уведомление этот клиент ACK для всех 3 отправленных сообщений. И клиент также фактически обрабатывает все 3 и ACK обратно.

Рассмотрите следующую ситуацию:

a. msg1 приходит к клиенту.

b. не удалось обработать msg1. Поэтому избегайте поддержки. (msg1 никогда не обрабатывается или не подкрепляется с клиентской стороны)

c. msg2 приходит и успешно обрабатывается. И ответьте на msg2.

Следовательно, в вышеуказанном сценарии клиент ack не гарантирует доставку msg1.

Пожалуйста, объясните, есть ли обходной путь к гарантированной доставке, когда пакетный процесс с клиентской программой через спецификацию JMS 1.0.

[1] http://docs.oracle.com/javaee/7/api/javax/jms/Message.html#acknowledge

ответ

1

Согласно спецификации:

Вызывая подтверждение на потребляемом сообщении, клиент признает все сообщения потребляемых сессий, что сообщение было поставлено.

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

Вместо этого, если вы обнаружили неисправность, вы можете либо:

  1. Сорвите сессии (или даже соединения).

  2. Вызвать recover на ваш Session. Это приведет к перезагрузке доставки сообщений с самым старым непризнанным сообщением.

+0

Спасибо за ответ. просто для уточнения. Таким образом, клиент отвечает за правильную обработку данных? Должен ли вызывать message.acknowledge(), если и только если все сообщения до этого сообщения обработаны правильно? – plr

+0

Да - клиент несет ответственность. Учитывая, что они используют сеанс. Я действительно рекомендую использовать транзакции и совершать/откатывать каждое сообщение в зависимости от результата обработки, если вы хотите более четкую семантику. –

+0

другой быстрый вопрос. насколько я понял, это не гарантирует отсутствие дубликатов сообщений. Поскольку Session.recover() будет повторно доставлять все сообщения из последнего записанного сообщения, могут быть дубликаты.Если это так, то почему у нас есть отдельный режим подтверждения как «duplicates_OK»? Пожалуйста, поправьте меня, если я неправильно понял спецификацию. – plr