Transactions 没有事务的有害消息

Transactions 没有事务的有害消息,transactions,msmq,Transactions,Msmq,如果消息是非事务性的,它会中毒吗 文档似乎暗示了这一点,但我并没有找到直接的说法。是的,在某些情况下,这是可能的 毒药消息是停留在队列顶部的消息,阻止其他消息通过。现在,是什么让事务性消息中毒?当我们回滚事务时,消息返回到它之前的位置,就在队列的顶部。所以这与消息本身无关(至少不是直接的),而是我们处理消息的方式以及处理失败时我们所做的事情(即执行回滚)的结果 如果队列是非事务性的,并且我们从队列顶部“接收”消息,那么它是不可逆的。不存在将消息放回顶部位置的回滚。如果我们想将该消息放回队列以便稍

如果消息是非事务性的,它会中毒吗


文档似乎暗示了这一点,但我并没有找到直接的说法。

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

毒药消息是停留在队列顶部的消息,阻止其他消息通过。现在,是什么让事务性消息中毒?当我们回滚事务时,消息返回到它之前的位置,就在队列的顶部。所以这与消息本身无关(至少不是直接的),而是我们处理消息的方式以及处理失败时我们所做的事情(即执行回滚)的结果

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

有一种情况不适用,那就是我们使用消息优先级,并以比队列其余部分更高的优先级将其发送回。这将使它回到顶部,并创建有毒消息场景

另一种方法是,如果我们的处理由“Peek”(不删除消息)组成,如果处理正常,则后跟“Receive”。若在Peek和Receive之间处理失败,消息将保持在队列的顶部


所以,是的,有可能在非事务性消息中包含有毒消息,但前提是以特定的方式执行操作。

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

毒药消息是停留在队列顶部的消息,阻止其他消息通过。现在,是什么让事务性消息中毒?当我们回滚事务时,消息返回到它之前的位置,就在队列的顶部。所以这与消息本身无关(至少不是直接的),而是我们处理消息的方式以及处理失败时我们所做的事情(即执行回滚)的结果

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

有一种情况不适用,那就是我们使用消息优先级,并以比队列其余部分更高的优先级将其发送回。这将使它回到顶部,并创建有毒消息场景

另一种方法是,如果我们的处理由“Peek”(不删除消息)组成,如果处理正常,则后跟“Receive”。若在Peek和Receive之间处理失败,消息将保持在队列的顶部


所以,是的,有可能在非事务性消息中包含有毒消息,但前提是以特定的方式执行操作。

如果在Peek和Receive之间处理失败,消息将保持在队列的顶部。
Hm,这正是我正在做的。我可以改为
Receive()
,如果处理失败(在本例中是发送到WCF服务),则将其放回(具有相同的优先级)。你有什么建议?没关系。如果您的进程在接收之后和处理完成之前失败,则可能会丢失消息。我希望您打开该队列的日志记录,所有接收到的消息都将在日志中结束,这样至少您不会丢失任何东西。虽然这不会阻止其他传入消息,但重试的消息可能会一次又一次出现。如果您想在10次重试后停止重试并通知某人检查,您可以在消息中放置一些“重试计数器”。如果您将计数器放在邮件的扩展名或“特定于应用程序”字段中会更容易,但您也可以修改正文。
如果您的处理在接收后和处理完成前失败,则可能会丢失邮件。
Aha!这里也提到了:-)在成功的队列
Send()
a
JSON.NET
-序列化文本文件被放置在文件系统的日志文件夹中,只有在成功的WCF
Send()
后才能删除。我可能最终也会做一些SQL插入的事情,作为额外的备份。这个日志功能看起来很有趣,但要决定清空该存储桶的频率似乎很棘手。谨慎当然是valor最好的部分。
如果您想在10次重试后停止重试,可以在消息中添加一些“重试计数器”,并通知某人检查。
好主意,我会这样做<代码>如果您将计数器放在消息的扩展名或“特定于应用程序”字段中会更容易…好提示,我会查看它。
如果在Peek和Receive之间处理失败,消息将保持在队列的顶部。
Hm,这正是我正在做的。我可以改为
Receive()
,如果处理失败(在本例中是发送到WCF服务),则将其放回(具有相同的优先级)。你有什么建议?没关系。如果您的进程在接收之后和处理完成之前失败,则可能会丢失消息。我希望您打开该队列的日志记录,所有接收到的消息都将在日志中结束,这样至少您不会丢失任何东西。虽然这不会阻止其他传入消息,但重试的消息可能会一次又一次出现。如果您想在10次重试后停止重试并通知某人检查,您可以在消息中放置一些“重试计数器”。如果您将计数器放在邮件的扩展名或“特定于应用程序”字段中会更容易,但您也可以修改正文。
如果您的处理在接收后和处理完成前失败,则可能会丢失邮件。
Aha!我也明白了:-)在suc上