【发布时间】:2013-01-03 18:39:55
【问题描述】:
我的目标是使用 WebSphere MQ Java 编程将 n 条消息放在一个 for 循环中的 WebSphere MQ 队列中。
我的 java 程序将作为独立程序运行。
如果中间有任何异常,我需要回滚所有消息。
如果没有例外,那么我应该提交所有消息。
在我完全完成之前,外界不应该看到我在队列中的消息。 我如何做到这一点?
根据 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 = "x.x.x.x";
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();
}
}
}
【问题讨论】:
-
一般QMgr环境和连接都是在程序中完成一次,在Send Message方法之外,但是循环是正确的。设置同步点选项,放置/获取消息,完成后提交。是的,同步点只是你的程序,实际上范围是拥有连接的线程。具有多个连接的单个程序可以同时具有多个独立的工作单元,所有这些都在一个队列上,并且可以按预期工作。
标签: java jakarta-ee ibm-mq