接收Websphere MQ消息时如何进行显式确认?

时间:2016-12-20 14:32:54

标签: ibm-mq

我有一个应用程序在IBM Websphere MQ队列上侦听消息。 消息消耗后,应用程序执行一些处理逻辑。 如果处理完成正常,我希望应用程序确认该消息并将其从队列中删除。 如果处理时发生错误,我希望该消息保留在队列中。 这是如何实现的? (我使用的是.NET API) 感谢。

3 个答案:

答案 0 :(得分:3)

MQ支持单阶段提交协议。您在收到消息时指定了同步点,然后根据需要发出COMMITROLLBACK。如果连接丢失,则默认操作为ROLLBACK,如果程序故意结束而未解析事务,则假定为COMMIT。 (这是依赖于平台的,所以习惯性的建议是明确地调用COMMIT而不是依赖类析构函数来为你做这件事。)

无论消息是否持久,这都有效。但是,如果消息指定了过期并且在回滚后过期,则有可能再次看不到它。

当然,如果程序发出ROLLBACK,通常会再次看到该消息,因为它返回到队列中的相同位置以及顶部的FIFO队列。如果消息的问题不是暂时的,则会导致读取/回滚/重复的毒性消息循环。为避免应用程序可以检查回退计数,如果超过某个阈值,则将消息重新排列到异常队列。

使用JMS或XMS时,类库会为您完成。如果设置了输入队列的BOQNAMEBOQTHRESH属性,则重新排队到BOQNAME中的队列名称。否则,尝试重新排队到死队列。如果失败(如果系统得到适当保护,应该如此),监听器将停止接收消息。

通常的建议是总是指定一个回退队列,让它们使用它或编写应用程序来使用它。

请参阅MQAPI参考中的Usage Notes for MQGET和.Net类参考中的MQGetMessageOptions.NET页面。

答案 1 :(得分:-1)

您可能需要查看MQ Reporting Options

到期,确认到达和确认交付可以通过接收队列管理器请求并通过响应队列发送回发送应用程序。

正面和负面确认也可以由接收应用程序生成,前提是它们使用消息描述符中的相关报告属性。

异常可以通过传输链中的任何队列管理器请求并通过响应队列发送回发送应用程序,或者由接收应用程序生成。

答案 2 :(得分:-1)

1使用MQC.MQGMO_SYNCPOINT

读取消息

2处理它

3调用MQQueueManager.Commit()

如果未明确地或隐式地调用Commit()(例如抛出异常),则所有已排队的消息都将被重新入队。