Если все эти очереди находятся в одном MQ Queue Manager, вы должны использовать для этого «локальные транзакции JMS». Поэтому создайте соединение IBM MQ JMS и сделайте сеанс транзакцией (первый аргумент установлен на true ):
session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
Примечание. Второй аргумент игнорируется, если первый аргумент имеет значение true.
Создайте свои очереди JMS и получателя, а затем прочитайте ваше первое сообщение, например:
Message msg = msgConsumer.receive(100);
Это неявно запускает MQ-транзакцию для первого полученного сообщения, если нет текущей транзакции.
Затем выполните обработку и, если все прошло хорошо, вызовите commit.
Если нет, откатите транзакцию, и вы снова увидите все откатанные сообщения. Так что это может сработать примерно так:
Session session = connection.createSession(true, Session.AUTO_ACKNOWLEDGE);
MessageConsumer msgConsumer = session.createConsumer(destination, null);
while( !isStopped() ) {
try {
Message msg = msgConsumer.receive(100);
if( msg!=null ) {
... call your REST services ...
session.commit();
}
... test for end condition ...
}
catch (Exception e) {
... error handling ...
session.rollback();
}
}