0

我在 MSMQ 中创建了一个事务队列。然后我成功地将两条消息提交到该队列。第一条消息将导致处理器出错,MSMQ 事务将回滚;因此消息将被放回队列中。第二条消息在处理后将成功,MSMQ 事务将提交。

注意:我还没有将第一条消息移动到另一个/毒物队列的代码,这意味着它将继续被拾取进行处理,理论上消息 2 永远不会有机会被处理。

问题:如果我有 1 个侦听器/处理器处理来自该事务队列的消息,则消息 2 将永远不会被拾取。这是意料之中的。

但是,如果我有两个听众,消息#2 确实会被接收;这让我很困惑。我认为 MSMQ 事务队列只会让消息按照它们到达的顺序进行处理。

旁注:我如何确定无法进一步处理消息 1 并将其移动到另一个队列。MSMQ 是否记录处理器接收消息的次数?

4

1 回答 1

0

一条消息存在于队列中,直到它被读取。当您的第一个侦听器读取有害消息时,它会被标记为隐藏,直到事务中止并且消息再次可见。在此期间,第二个监听器看不到毒消息,只会看到第二个消息。

“我如何确定无法进一步处理消息 1 并将其移动到另一个队列。” - WCF/MSMQ 具有内置的有害消息处理功能。您可以自己模拟一些重试队列。在第一次失败时,总是移动到重试队列#1;再次尝试该消息,如果失败,则始终移动到重试队列#2;再次尝试该消息,如果失败,则移至最终队列进行调查。

“MSMQ 是否记录处理器接收消息的次数?” - 不。

于 2017-11-10T13:11:29.587 回答