IBM MQ-消息读取和调用事务性下线服务

时间:2019-05-30 16:30:26

标签: transactions jms ibm-mq message-queue spring-jms

我正在研究IBM MQ消息的使用者,我希望在阅读带有确认的消息后使每个消息处理都具有事务性。

一旦我从IBM MQ阅读了每条消息-我需要调用大约4到5个不同的rest服务。通过服务在不同的表中将有大约1500-2000个插入。

如果任何服务由于任何原因失败,我想回退在处理该特定消息时发生的先前插入,并将消息保留在Queue中。

我怎么能达到同样的目的?我对IBM MQs / Jms很陌生

我正计划通过使用以下内容浏览邮件来做到这一点

QueueBrowser queueBrowser = context.createBrowser(queue, "JMSCorrelationID='ID:c9d5e2d7c5c3e3c9d6d54040404040404040404040404040c9d5e2d7c5c3e3c9d6d54040404040404040404040404040'");

1 个答案:

答案 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();
  }
}