Сообщение Jms подтверждается только до тех пор, пока сообщение не будет подтверждено
Как убедиться, что подтверждение сообщения удаляет только сообщения до сообщения, подтверждение которого вызывается в JMS-брокере. В настоящее время у меня есть система, которая использует очередь jms и частично обрабатывает ее. Иногда позже пакет этих сообщений сохраняется в другом потоке. Мне нужно подтвердить сообщения сейчас. Но проблема в том, что я должен прекратить потребление сообщений, в противном случае подтверждение ранее полученного сообщения также подтвердит все последующие полученные сообщения.
Другими словами, предположим, у меня есть 10 сообщений в очереди. Я потребляю 7 из них, а затем подтверждаю на 5-м сообщении. Это, в свою очередь, удаляет все 7 сообщений, полученных потребителем из очереди. Есть способ только подтверждать и удалять сообщения из очереди до 5-го сообщения.
РЕДАКТИРОВАТЬ: я пытался создать два сеанса и использовать из разных сеансов, но (с Apache qpid по крайней мере) это работает противоречиво. Под непоследовательностью я подразумеваю, что иногда во время теста случается так, что один потребитель может получать сообщения, а другой вообще не получает, независимо от того, как долго вы ждете. Это сработало бы для меня как решение, но из-за несогласованности не может использовать это как решение.
2 ответа
Я понимаю, что этот пост старый, но этот ответ должен помочь тем, кто наткнется на него позже.
Если вы хотите точно контролировать, какие сообщения вы хотите подтвердить, individual
Метод подтверждения должен помочь вам. Используя этот режим подтверждения, вы можете подтверждать отдельные сообщения в сеансе. Сообщения, которые не были подтверждены, будут доставлены.
Это не является частью спецификации, но большинство поставщиков очереди поддерживают ее за пределами спецификации.
оракул
Для большей гибкости очередь сообщений позволяет настроить режим подтверждения клиента 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() будет подтверждать только сообщения, полученные до и включая Экземпляр сообщения, для которого был вызван метод.
Но не рассматривая все эти различные возможности, можно ли было бы рассмотреть возможность добавления режима INDIVIDUAL_ACKNOWLEDGE? Уже одно это позволило бы многопоточным приложениям достигать любого поведения, в котором они нуждаются.
connection.createQueueSession(false, ActiveMQSession.INDIVIDUAL_ACKNOWLEDGE);
Я не использовал QPID лично, однако документация намекает на то, что отдельные сообщения могут быть подтверждены.
Examples
# acknowledge all received messages
session.acknowledge
# acknowledge a single message
session.acknowledge :message => message
При обработке пакета вы можете подтверждать каждое полученное и обработанное сообщение. Если вы столкнулись с исключением, не подтверждайте сообщение.
Подтверждение сообщения заставит администратора очередей удалить это сообщение, а также все другие сообщения, полученные до этого сообщения. Он не должен удалять сообщения, которые еще не были получены приложением. Вы можете проверить свое заявление о том, как вы подтверждаете сообщение.