gpt4 book ai didi

java - 如何停止在 MQ 上丢失消息

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:56:44 24 4
gpt4 key购买 nike

我正在编写一个在 LINUX 环境中运行的 Java 应用程序,它使用 SYNCPOINT 在 MQ 上执行事务。它使用 Websphere MQ Java 类与 MQ 服务进行交互。我在我的代码中所做的是以下(伪):

MQGetMessageOptions gmo = new MQGetMessageOptions();
gmo.options = MQConstants.MQGMO_FAIL_IF_QUIESCING | MQConstants.MQGMO_SYNCPOINT;

MQMessage message = new Message();
queue.get(message, gmo);

// process the message, save to database

databaseConnection.commit();
queueManager.commit();

我基本上是抓取消息、处理它、保存到数据库,然后在 queueManager 上调用提交。该进程监听 TIBRV 上的消息,以便正常关闭。

我一直在测试该过程以确保没有消息丢失。我将 20k 条消息放在一个队列中,然后运行该过程。我在处理过程中执行了一个正常的关机调用。然后我将队列中的消息量与数据库中的消息量进行比较。当通过 TIBRV 消息发生优雅关闭时,MQ 消息数 + DB 消息数 = 队列中最初的消息总数。

但是,当我执行 killkill -9 时,我看到一条消息丢失了。我总是以 19999 条消息的结果结束。

有什么方法可以调查我是如何丢失这条消息的?在 Websphere App Server 上发生了什么我需要注意的事情吗?

最佳答案

在使用单阶段提交时,没有理由期望数字能够协调一致。该程序将始终在 WMQ 和 DB Commit 调用之间,或者在您终止它时在 DB 和 WMQ Commit 调用之间。

您所要求的将需要两阶段 (XA) 提交。对于 WMQ,2PC 将要求应用程序使用绑定(bind)模式,并要求 WMQ 成为资源协调器。然后您将调用 MQBEGIN,执行您的 WMQ 和 DB 更新,然后调用 MQCOMMIT。这样,WMQ 和 DB 事务将同时成功或失败。

关于java - 如何停止在 MQ 上丢失消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5681384/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com