java应该如何实现具体的MQ GET& COMMIT / BACKOUT

时间:2016-10-15 10:58:37

标签: ibm-mq commit

下面我发布了一个Java MQ GET例程来从MQ获取信息并将其存储在DB上 但是当GET和COMMIT之间的连接丢失时,就会出现问题 连接丢失被解释为COMMIT !!!然后数据丢失。

我应该如何实施具体的GET& COMMIT / BACKOUT模型???

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)下运行时,将对异常终止或信号调用默认条件处理。 LE条件处理程序处理错误条件,TCB正常结束。 在这些条件下,MQ提交工作单元。

这意味着如果应用程序与MQ服务器失去连接&amp;在提交/退出之前DB(网络问题),MQ自动COMMIT它们,结果我们丢失了它!!!!

1 个答案:

答案 0 :(得分:2)

  

这意味着如果应用程序与MQ服务器失去连接&amp; DB(网络   问题)在提交/回退之前,MQ会自动将它们委托给它们   结果我们失去了它!!!!

您是否在z / OS UNIX系统服务上运行程序?因为如果你不是那么不适用。实际上很少有公司在z / OS UNIX系统服务上运行应用程序 - 通常是z / OS(批处理,CICS或IMS)或Linux on System Z.

如果您在Windows或Linux或Unix(AIX,HP-UX或Solaris)上运行,则应用以下两个语句:

  • 如果程序在未提交时发出MQDISC调用 请求,发生隐式同步点。

  • 如果程序异常结束,则会发生隐式退出。

这有意义吗?

最后,你正在做单阶段UOW(工作单位),但你可能应该做两期UOW。