下面我发布了一个Java例程,从MQ获取信息并将其存储在DB上。
但是,当GET和COMMIT之间的连接丢失时,就会出现问题。
连接丢失被解释为提交!那么数据就丢失了。
如何实现具体的获取和提交/退出模型?
String hostName = "192.168.163.63";
int port = 1418;
String userId = "mq";
String password = "mq";
String queueManagerName = "QueueManager1418";
String channelName = "ServerChannel";
String queueName = "TestQueue";
MQEnvironment.hostname = hostName;
MQEnvironment.port = port;
MQEnvironment.userID = userId;
MQEnvironment.password = password;
MQEnvironment.channel = channelName;
try {
MQQueueManager qMgrIn1 = new MQQueueManager(queueManagerName);
int openOptionsIn1 = CMQC.MQOO_INPUT_SHARED | CMQC.MQOO_INQUIRE;
MQQueue queueIn1 = qMgrIn1.accessQueue(queueName, openOptionsIn1);
MQMessage getMessage1 = new MQMessage();
MQGetMessageOptions mqGetMessageOptions1 = new MQGetMessageOptions();
mqGetMessageOptions1.options = CMQC.MQGMO_SYNCPOINT;
queueIn1.get(getMessage1, mqGetMessageOptions1);
String txt1 = getMessage1.readLine();
System.out.println("get1 << " + txt1);
//////////// make problem point like network disconnect with MQ server
DoSaveInfo2DB();
qMgrIn1.commit();
if (queueIn1 != null)
queueIn1.close();
if (qMgrIn1 != null)
qMgrIn1.disconnect();
} catch (Exception ex) {
System.out.println("ex.getMessage() = " + ex.getMessage());
}在IBM MQ文档中,我注意到了下面的文本
除了使用RRS的z/OS批处理之外,如果程序在未提交请求时发出MQDISC调用,则会出现隐式同步点。如果程序异常结束,则会发生隐式回退。在z/OS上,如果程序正常结束而不首先调用MQDISC,则会出现隐式同步点。如果连接到MQ的TCB正常结束,则程序被视为已正常结束。在z/OS UNIX系统服务和语言环境(LE)下运行时,对abends或信号调用默认条件处理。LE条件处理程序处理错误条件,TCB正常结束。在这些条件下,提交了工作单元.。
这意味着如果应用程序在提交/退出之前失去了与MQ服务器& DB (网络问题)的连接,MQ将自动提交它们,结果导致我们失去了它!
发布于 2016-10-17 16:29:44
这意味着如果应用程序在提交/退出之前失去了与MQ服务器& DB (网络问题)的连接,MQ将自动提交它们,结果导致我们失去了它!
您是否在z/OS UNIX系统服务上运行程序?因为如果你不是,那就不适用了。很少有公司实际在z/OS UNIX系统服务上运行应用程序--通常是z/OS (批处理、CICS或IMS)或System上的Linux。
如果您正在Windows、Linux或Unix (AIX、HP-UX或Solaris)上运行,那么应用以下两个语句:
这有意义吗?
最后,您正在执行单相UOW (工作单元),但是您可能应该执行两个阶段的UOW。
https://stackoverflow.com/questions/40058174
复制相似问题