Я понимаю, что этот пост старый, но этот ответ должен принести пользу тем, кто наткнется на него позже.
Если вы хотите точно контролировать, какие сообщения вы хотите подтвердить, individual
Метод подтверждения должен помочь вам.Используя этот режим подтверждения, вы можете подтверждать отдельные сообщения в сеансе.Сообщения, которые не были подтверждены, будут доставлены.
Это не является частью спецификации, но большинство поставщиков очереди поддерживают ее за пределами спецификации.
Для большей гибкости очередь сообщений позволяет настроить режим подтверждения клиента JMS.В режиме подтверждения клиента клиент явно подтверждает потребление сообщения, вызывая метод Квитирования () объекта сообщения.
Стандартное поведение этого метода - заставить сеанс подтверждать все сообщения, которые были использованы любым потребителем в сеансе с момента последнего вызова метода.(То есть сеанс подтверждает текущее сообщение и все ранее неподтвержденные сообщения независимо от того, кто их использовал.)
В дополнение к стандартному поведению, указанному JMS, очередь сообщений позволяет использовать режим подтверждения клиента для подтвержденияодно сообщение за раз.
public interface com.sun.messaging.jms.Message {
void acknowledgeThisMessage() throws JMSException;
void acknowledgeUpThroughThisMessage() throws JMSException;
}
Можно представить и другие режимы подтверждения, которые также могут быть полезны, например: 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
Во время обработки пакета вы можете подтверждать каждое полученное и обработанное сообщение.Если вы столкнулись с исключением, не подтверждайте сообщение.