当我的应用程序消费一个 MSMQ 消息但是失败时会发生什么?

3
如果我让鲍勃给我买个三明治,鲍勃说“好的”,但是他在回来的路上被公交车撞了,那么我永远得不到我的三明治-而且我不知道我得不到我的三明治!所以我不会告诉任何人,“嘿,我饿了!”
在MSMQ中有没有处理这个问题的方法?我能预留一条消息,这样它就不会传递给任何其他人,但是我又不会消费它,这样如果我吃不下它,我可以稍后将其放回队列中吗?
我甚至不知道该怎么称呼它。:|
澄清一下:我正在使用事务性队列。但是,如果消费者接收到一条消息(并且消息被删除),那么当消费者无法执行消息要求它执行的操作时会发生什么?唯一的选择是让消费者将其放回队列吗?

我喜欢称之为 MSMQ 的最大缺陷……个人看法。 - Bill Blankenship
您可以将MSMQ设置为事务性。 - Paul Abbott
2个回答

1
这被称为“仅一次语义”,对于任何分布式进程来说都很难实现;它不是特定于MSMQ的。
处理它的典型方式是使用滑动传递窗口;告诉Bob“在下午1点之前给我一个三明治,否则就算了”。然后,如果你在1点之前没有得到三明治,告诉Claire“在下午2点之前给我一个三明治,否则就算了”。如果Bob正在赶回来送你三明治,并且他看到已经过了1点,他必须决定如何处理三明治,但他不能把它给你。
实际上,关于这个主题有相当多的研究;谷歌搜索“exactly once”。我看到微软声称通过MQMgmtGetInfo支持MSMQ。

1

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

实际上,我在StackOverflow上找到了这个答案(MSMQ receive with transaction - rollback not making message available again),但那里提出的问题完全不同,所以很难定位。

我保留这个问题,以防语义更接近其他人的Google搜索。


非常有趣!这就像是一个数据库事务,如果出现问题,我们可以回滚。 - Bilal Fazlani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接