java websphere MQ

我的目标是使用WebSphere MQ java编程将n个消息放入for循环中到WebSphere MQ队列。

我的java程序将作为独立程序运行。

如果介于两者之间,我需要回滚所有消息。

如果没有exception,那么我应该提交所有消息。

在我完全完成之前,外部世界不应该在队列中看到我的消息。 我该如何实现这一目标?

根据T.Rob的回复更新了示例代码:

请检查示例代码是否正常?

设置MQGMO_SYNCPOINT只与我的程序调用有关吗? (因为并行运行的类似程序也会将消息放在同一队列中,并且这些消息不会受到程序的SYNCPOINT的影响。)

public void sendMsg() { MQQueue queue = null; MQQueueManager queueManager = null; MQMessage mqMessage = null; MQPutMessageOptions pmo = null; System.out.println("Entering.."); try { MQEnvironment.hostname = "xxxx"; MQEnvironment.channel = "xxx.SVRCONN"; MQEnvironment.port = 9999; queueManager = new MQQueueManager("XXXQMANAGER"); int openOptions = MQConstants.MQOO_OUTPUT; queue = queueManager.accessQueue("XXX_QUEUENAME", openOptions, null, null, null); pmo = new MQPutMessageOptions(); pmo.options = CMQC.MQGMO_SYNCPOINT; String input = "testing"; System.out.println("sending messages...."); for (int i = 0; i < 10; i++) { input = input + ": " + i; mqMessage = new MQMessage(); mqMessage.writeString(input); System.out.println("Putting message: " + i); queue.put(mqMessage, pmo); } queueManager.commit(); System.out.println("Exiting.."); } catch (Exception e) { e.printStackTrace(); try { System.out.println("rolling back messages"); if (queueManager != null) queueManager.backout(); } catch (MQException e1) { e1.printStackTrace(); } } finally { try { if (queue != null) queue.close(); if (queueManager != null) queueManager.close(); } catch (MQException e) { e.printStackTrace(); } } } 

WMQ支持本地和全球(XA)工作单元。 只需指定选项即可使用本地工作单元。 全局XA事务需要一个事务管理器,正如keithkreissl在另一个答案中所提到的那样。

对于您所描述的,POJO在同步点下进行消息传递, MQC.MQGMO_SYNCPOINTMQGetMessageOptions指定MQGetMessageOptions 。 准备好提交时,发出MQQManager.commit()MQQManager.backout()调用。

请注意,ggrandes提供的响应和doc是指JMS而不是Java类。 Java类使用Java等价的WMQ过程API,可以支持许multithreading( doc )甚至提供连接池( doc )。 有关正确的行为,请参阅Java文档而不是JMS文档。 另外,我已经链接到WMQ V7.5文档,该文档与最新的WMQ Java V7.5客户端一起使用 。 后来的客户端具有更多本地function(跟踪,灵活的安装路径,MQClient.ini等),并使用后端QMgrs。 强烈建议使用最新的客户端,免费下载。

您只需要创建一个启用了事务的会话。

 Session session; // ... boolean transacted = true; session = connection.createSession(transacted, Session.AUTO_ACKNOWLEDGE); try { // ...do things... session.commit(); } catch (Exception e) { session.rollback(); } // ... 

警告:会话不是线程安全的;-)

  • Doc Websphere MQ / JMS

如果您有权访问事务管理器,更重要的是可以访问连接到MQ访问的XATransaction,则可以在消息处理开始时启动事务,将所有消息放入队列,然后提交事务。 使用XATransactions,它不会在事务提交之前发出任何消息。 如果您没有访问权限,则可以通过将消息放在本地数据对象中来执行更多管道操作,如果没有exception迭代通过发送消息的本地数据对象,则将代码包装在try / catch中。 后一种方法的问题是它将提交所有其他处理,但如果在发送消息时出现问题,则不会回滚其他处理。