没有交易的毒药消息

时间:2018-05-01 11:59:07

标签: transactions msmq

如果邮件是非交易性的,邮件是否会中毒?

文档似乎没有暗示,但我没有找到某种方式的直接陈述。

1 个答案:

答案 0 :(得分:2)

是的,在某些情况下,这是可能的。

毒药消息是一种留在队列之上的消息,阻止其他人通过。现在,是什么让交易消息中毒了?当我们回滚事务并且消息返回到之前的位置时,就在队列的顶部。所以它不是关于消息本身的东西(至少不是直接的),而是我们如何处理消息以及当处理失败时我们做什么的结果,即执行回滚。

如果队列是非事务性的,并且我们从队列顶部“接收”消息,则它是不可逆的。没有回滚可以将消息重新置于最高位置。如果我们想将该消息放回队列以便稍后重试,我们所能做的就是发送原始消息的副本。 MSMQ Send将它放在队列的末尾。所以它无法阻止其他消息。

有一种情况不适用,如果我们使用消息优先级并以优先级高于队列的其余部分发送回来。这会把它放回到顶部并创建有害消息场景。

另一种方法是,如果我们的处理包含“Peek”(不删除消息),如果处理正常,则返回“Receive”。如果Peek和Receive之间的处理失败,则消息将保留在队列的顶部。

所以,是的,可以使用非事务性消息来获取有害消息,但只有在以特定方式执行操作时才会出现。