首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java如何实现具体的MQ & COMMIT/BACKOUT

java如何实现具体的MQ & COMMIT/BACKOUT
EN

Stack Overflow用户
提问于 2016-10-15 10:58:36
回答 1查看 376关注 0票数 1

下面我发布了一个Java例程,从MQ获取信息并将其存储在DB上。

但是,当GET和COMMIT之间的连接丢失时,就会出现问题。

连接丢失被解释为提交!那么数据就丢失了。

如何实现具体的获取和提交/退出模型?

代码语言:javascript
复制
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将自动提交它们,结果导致我们失去了它!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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)上运行,那么应用以下两个语句:

  • 如果程序在未提交请求时发出MQDISC调用,则会出现隐式同步点。
  • 如果程序异常结束,则会发生隐式回退。

这有意义吗?

最后,您正在执行单相UOW (工作单元),但是您可能应该执行两个阶段的UOW。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40058174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档