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

java How should implement concrete MQ GET & COMMIT/BACKOUT

下面我发布了一个 Java MQ GET 例程来从 MQ 获取信息并将其存储在数据库中。
但是当 GET 和 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 提交工作单元。

这意味着如果应用程序在 commit/backout 之前失去了与 MQ 服务器和数据库的连接(网络问题),MQ 会自动提交它们,结果我们失去了它!!!!

It means if application lost connection with MQ server & DB (network problem) before commit/backout, MQ automatically COMMIT them and in result we lost it !!!!

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

如果您在 Windows 或 Linux 或 Unix(AIX、HP-UX 或 Solaris)上 运行,则适用以下 2 条陈述:

  • 如果程序在有未提交的情况下发出 MQDISC 调用 请求,出现隐式同步点。

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

这有意义吗?

最后,您正在执行单阶段 UOW(工作单元),但您可能应该执行 2 阶段 UOW。