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

时间:2014-11-20 23:21:44

标签: c# .net message-queue msmq

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

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

关于这个话题实际上有相当多的研究;谷歌“一次”。我看到微软声称MSMQ通过MQMgmtGetInfo支持它。

答案 1 :(得分:1)

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

我实际上在StackOverflow(MSMQ receive with transaction - rollback not making message available again)上找到了这个答案,但问的问题完全不同,所以找到它并不容易。

我将离开这个问题,以防语义与其他人的谷歌搜索更加匹配。