我有一个应用程序正在侦听 IBM Websphere MQ 队列上的消息。
一旦消息被使用,应用程序就会执行一些处理逻辑。
如果处理完成正常,我希望应用程序确认该消息并将其从队列中删除。
如果处理时发生错误,我希望该消息保留在队列中。
这是如何实施的? (我正在使用.NET API)
谢谢。
MQ 支持单阶段提交协议。您在收到消息时指定同步点,然后发出COMMIT
or ROLLBACK
按要求。连接丢失时的默认操作是ROLLBACK
如果程序故意结束而不解决事务COMMIT
假设。 (这是依赖于平台的,因此习惯的建议是显式调用COMMIT
而不是依赖类析构函数来为您完成此操作。)
无论消息是否持久,这都有效。但是,如果消息指定了过期时间并且在回滚后过期,则有可能不会再次看到该消息。
当然,如果程序发出ROLLBACK
该消息通常会再次出现,因为它会返回到队列中的同一位置,对于 FIFO 队列来说,该位置位于顶部。如果消息的问题不是暂时的,那么这会导致读取/回滚/重复的有害消息循环。为了避免应用程序可以检查回退计数,如果超过某个阈值,则将消息重新排队到异常队列。
当使用 JMS 或 XMS 时,这是由类库为您完成的。如果输入队列的BOQNAME
and BOQTHRESH
属性设置为队列名称中的重新排队BOQNAME
。否则,将尝试重新排队到死队列。如果失败(如果系统受到适当保护,则应该如此)侦听器将停止接收消息。
通常的建议是always指定一个回退队列,然后让类使用它或编写应用程序来使用它。
请参见使用说明MQGET http://www.ibm.com/support/knowledgecenter/en/SSFKSJ_7.0.1/com.ibm.mq.csqzak.doc/fr17310_.htm在 MQAPI 参考和MQGetMessageOptions.NET http://www.ibm.com/support/knowledgecenter/en/SSFKSJ_9.0.0/com.ibm.mq.ref.dev.doc/q111200_.htm.Net 类参考中的页面。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)