В режиме jpm (v1.0) клиентского клиента, message.acknowledge() - единственный способ отправить ответ на сервер (брокер). Фактическое поведение - если клиент ack to message3, то клиент отправителя сообщения (брокер) отвечает на все сообщения до сообщения3 [1].Как гарантированная доставка работает в режиме подтверждения клиента JMS?
i.e msg1, msg2, msg3 поставляется заказчику по порядку.
- Клиентские сообщения процесса ACK для каждого сообщения, msg1, msg2 и msg3. >> OK
- Зная реальное поведение клиента, как 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
Спасибо за ответ. просто для уточнения. Таким образом, клиент отвечает за правильную обработку данных? Должен ли вызывать message.acknowledge(), если и только если все сообщения до этого сообщения обработаны правильно? – plr
Да - клиент несет ответственность. Учитывая, что они используют сеанс. Я действительно рекомендую использовать транзакции и совершать/откатывать каждое сообщение в зависимости от результата обработки, если вы хотите более четкую семантику. –
другой быстрый вопрос. насколько я понял, это не гарантирует отсутствие дубликатов сообщений. Поскольку Session.recover() будет повторно доставлять все сообщения из последнего записанного сообщения, могут быть дубликаты.Если это так, то почему у нас есть отдельный режим подтверждения как «duplicates_OK»? Пожалуйста, поправьте меня, если я неправильно понял спецификацию. – plr