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_SYNCPOINT
在MQGetMessageOptions
指定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中。 后一种方法的问题是它将提交所有其他处理,但如果在发送消息时出现问题,则不会回滚其他处理。