如何停止在MQ上丢失消息

时间:2011-04-15 19:24:13

标签: java websphere ibm-mq mq

我正在编写一个在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上是否有任何我需要注意的事项?

2 个答案:

答案 0 :(得分:5)

在使用单阶段提交时,没有理由期望数字能够协调。程序将始终在WMQ和数据库提交调用之间,或者在您杀死它时在数据库和WMQ提交调用之间。

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

答案 1 :(得分:0)

您是在绑定模式还是客户端模式下连接或MQ?根据我的经验,交易在客户端模式下无法正常运行,但它们在绑定模式下完成。