繁体   English   中英

当我的应用程序消耗MSMQ消息然后失败时会发生什么?

[英]What happens when my application consumes an MSMQ message but then fails?

如果我让鲍勃给我一个三明治,鲍勃说“好的”,但是他在从商店回来的路上遇到一辆公共汽车,我永远不会得到我的三明治 - 我不知道我不是得到我的三明治! - 所以我不告诉其他人,“嘿,我饿了!”

有没有办法在MSMQ中处理这个问题? 我可以保留一条消息,以便它不会被传递给其他任何人,但不会消耗它,以便我可以稍后将其放回队列中,如果我呛到它的话吗?

我甚至都不知道你叫什么。 :|

澄清:我正在使用事务性队列。 但是,如果消费者收到消息(并且消息被删除),当消费者无法做消息要求它做的事情时会发生什么? 让消费者把它放回队列的唯一选择是什么?

这被称为“完全一次语义”,并且很难实现任何分布式进程; 它不是MSMQ特有的。

处理它的典型方法是使用滑动交付窗口; 告诉鲍勃“在下午1点之前递给我一个三明治或忘记它”。 然后,如果你在下午1点之前没有吃三明治,告诉克莱尔“在下午2点之前递给我一个三明治或者忘掉它”。 如果鲍勃用你的三明治冲回来,他看到它是在下午1点后,他必须决定如何处理三明治,但他不能把它给你。

实际上对这一主题进行了相当多的研究; 谷歌“一次”。 我看到微软声称MSMQ通过MQMgmtGetInfo支持它。

好的,所以我终于找到了答案:您可以像在Send()调用上一样在Receive()调用上使用事务。 然后,您可以中止事务并将其回滚,将消息留在队列中(当然,前提是您使用事务性队列)。

我实际上在StackOverflow上找到了这个答案( MSMQ接收带有事务 - 回滚没有使消息再次可用 ),但问的问题完全不同,所以找到它并不是那么容易。

我将离开这个问题,以防语义更接近其他人的谷歌搜索。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM