MSMQ 毒信息是什么意思?

MSMQ poison message means what?

我对这个队列服务还很陌生,我不知道中毒消息的真正含义。

我读到这是一条您无法使用的消息,但这意味着您可以 Peek() 并查看详细信息,但不能查看 Receive() 或什么?

从我的角度来看,我会说中毒消息是位于队列顶部的消息,由于其格式甚至损坏的格式而无法使用,因为负责处理它的业务无法做到这一点它可能会生成一个异常,在事务场景中会被捕获并通过回滚进行处理,因此消息永远保持在最前面。

你怎么看?我完全错了吗?

我以前不得不处理有毒的 MSMQ 消息,呃!我会说你的定义很接近。

毒消息基本上是当读取消息的服务由于异常或某些其他问题而无法处理消息并终止读取消息的事务时从队列中重复读取的消息。在这种情况下,保留在队列中的消息会在下次从队列中读取时再次重试。如果消息有问题,理论上这可以永远持续下去。

例如,邮件包含违反数据库约束的数据。我有时会创建一个错误队列,并让服务处理消息,如果在处理过程中发生异常,则将 "poison" 消息抛入其中。这至少会从队列中删除消息,并让我有机会稍后查看它,而不会影响主生产队列。

Here is some advice and information on poison message handling.