Сообщение Jms подтверждается только до тех пор, пока сообщение не будет подтверждено - PullRequest
3 голосов
/ 06 декабря 2011

Как убедиться, что подтверждение сообщения удаляет только сообщения до сообщения, подтверждение которого вызывается в JMS-брокере.В настоящее время у меня есть система, которая использует очередь jms и частично обрабатывает ее. Иногда позже пакет этих сообщений сохраняется в другом потоке.Мне нужно подтвердить сообщения сейчас.Но проблема в том, что я должен прекратить потребление сообщений, в противном случае подтверждение ранее полученного сообщения также подтвердит все последующие полученные сообщения.

Другими словами, предположим, что в очереди 10 сообщений.Я потребляю 7 из них, а затем подтверждаю на 5-м сообщении.Это, в свою очередь, удаляет все 7 сообщений, полученных потребителем из очереди. Есть способ только подтверждать и удалять сообщения из очереди до 5-го сообщения.

РЕДАКТИРОВАТЬ: я попытался создать два сеанса и использовать из разных сеансов,но (с apache qpid atleast) это работает противоречиво.Под непоследовательностью я подразумеваю, что иногда во время теста случается так, что один потребитель может получать сообщения, а другой вообще не получает, независимо от того, как долго вы ждете.Это сработало бы для меня как решение, но из-за несогласованности не может использовать это как решение.

Ответы [ 2 ]

4 голосов
/ 21 февраля 2014

Я понимаю, что этот пост старый, но этот ответ должен принести пользу тем, кто наткнется на него позже.

Если вы хотите точно контролировать, какие сообщения вы хотите подтвердить, individualМетод подтверждения должен помочь вам.Используя этот режим подтверждения, вы можете подтверждать отдельные сообщения в сеансе.Сообщения, которые не были подтверждены, будут доставлены.

Это не является частью спецификации, но большинство поставщиков очереди поддерживают ее за пределами спецификации.

Oracle

Для большей гибкости очередь сообщений позволяет настроить режим подтверждения клиента JMS.В режиме подтверждения клиента клиент явно подтверждает потребление сообщения, вызывая метод Квитирования () объекта сообщения.

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

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

public interface com.sun.messaging.jms.Message {
          void acknowledgeThisMessage() throws JMSException;
          void acknowledgeUpThroughThisMessage() throws JMSException;
}

ActiveMQ

Можно представить и другие режимы подтверждения, которые также могут быть полезны, например: CONSUMER_ACKNOWLEDGEгде Message.acknowledge () будет подтверждать только сообщения, полученные на конкретном MessageConsumer, или CONSUMER_CHECKPOINT_ACKNOWLEDGE, где Message.acknowledge () будет подтверждать только сообщения, полученные до и включая экземпляр Message, для которого был вызван метод.

Но не рассматривая все эти различные возможности, можно ли было бы рассмотреть возможность добавления режима INDIVIDUAL_ACKNOWLEDGE?Уже одно это позволило бы многопоточным приложениям достигать любого поведения, которое им необходимо.

connection.createQueueSession(false, ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);

Я не использовал QPID лично, однако документация подсказывает о том, что отдельныевозможны подтверждения сообщений.

Examples
  # acknowledge all received messages
  session.acknowledge

  # acknowledge a single message
  session.acknowledge :message => message

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

1 голос
/ 08 декабря 2011

Подтверждение сообщения заставит администратора очередей удалить это сообщение, а также все другие сообщения, полученные до этого сообщения.Он не должен удалять сообщения, которые еще не были получены приложением.Вы можете проверить свое заявление о том, как вы подтверждаете сообщение.

...