我正在研究IBM MQ消息的使用者,我希望在阅读带有确认的消息后使每个消息处理都具有事务性。
一旦我从IBM MQ阅读了每条消息-我需要调用大约4到5个不同的rest服务。通过服务在不同的表中将有大约1500-2000个插入。
如果任何服务由于任何原因失败,我想回退在处理该特定消息时发生的先前插入,并将消息保留在Queue中。
我怎么能达到同样的目的?我对IBM MQs / Jms很陌生
我正计划通过使用以下内容浏览邮件来做到这一点
QueueBrowser queueBrowser = context.createBrowser(queue, "JMSCorrelationID='ID:c9d5e2d7c5c3e3c9d6d54040404040404040404040404040c9d5e2d7c5c3e3c9d6d54040404040404040404040404040'");
答案 0 :(得分:1)
如果所有这些队列都在同一MQ队列管理器上,则应为此使用“本地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();
}
}