Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ibm mq 如何在接收Websphere MQ消息时执行显式确认?_Ibm Mq - Fatal编程技术网

Ibm mq 如何在接收Websphere MQ消息时执行显式确认?

Ibm mq 如何在接收Websphere MQ消息时执行显式确认?,ibm-mq,Ibm Mq,我有一个应用程序正在侦听IBM Websphere MQ队列上的消息。 一旦消息被使用,应用程序将执行一些处理逻辑。 如果处理完成正常,我希望应用程序确认消息并将其从队列中删除。 如果处理过程中发生错误,我希望消息保留在队列中。 这是如何实现的?(我正在使用.NETAPI) 谢谢。MQ支持单阶段提交协议。收到消息时指定同步点,然后根据需要发出COMMIT或ROLLBACK。如果连接丢失,则默认操作为回滚,如果程序故意结束而不解析事务,则假定为提交。(这取决于平台,因此通常的建议是显式调用COMM

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

MQ支持单阶段提交协议。收到消息时指定同步点,然后根据需要发出
COMMIT
ROLLBACK
。如果连接丢失,则默认操作为
回滚
,如果程序故意结束而不解析事务,则假定为
提交
。(这取决于平台,因此通常的建议是显式调用
COMMIT
,而不是依赖类析构函数为您执行此操作。)

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

当然,如果程序发出一个
ROLLBACK
,消息通常会再次被看到,因为它会返回到队列中的同一位置,对于FIFO队列,它是最上面的。如果消息的问题不是暂时的,那么这将导致读/回滚/重复的有害消息循环。为了避免应用程序可以检查退出计数,如果超出某个阈值,则将消息重新加入异常队列

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

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


请参见MQAPI参考中的和.Net类参考中的页面。

您可能希望查看

接收队列管理器可以请求到期、到达确认和传递确认,并通过响应队列将其发送回发送应用程序

如果接收应用程序使用消息描述符中的相关报告属性,则肯定和否定确认也可以由接收应用程序生成


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

1使用MQC.MQGMO_SYNCPOINT读取消息

2.处理它

3调用MQQueueManager.Commit()


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

Al;虽然有用,但它们对OP的确认从队列中删除消息的要求没有任何影响。问题似乎是在工作单元的上下文中讨论ack,而所有消息报告选项都至少涉及两个完全不同的工作单元。提交破坏性GET与我书中的ack不同。发送系统可以通过发送->接收->(已处理|失败)的不同阶段管理消息的状态。如果您愿意,可以使用您自己的书籍。JMS规范称之为确认,特别是
会话.getAcknowledgeMode
方法返回
会话.Session\u transactived
,如果确认是在
提交/回滚
处理中执行的。这完全符合OP的要求,即根据处理结果以原子方式消费或回滚消息。COA与信息消耗量没有相关性,COD与GET不在同一UOW中,因此两者都不符合任何人书中的OPs要求。嗨,你的答案是代码吗?写得很好T.Rob。