我正在运行一个通过 MsmqBinding 调用 WCF 服务的 WCF 客户端。框架为 .Net 4.0,客户端和服务器运行在 Windows Server 2008 R2 上。通道队列是事务性的。
该服务使用以下绑定参数托管:
receiveErrorHandling="Move"
receiveRetryCount="3"
retryCycleDelay="00:00:20"
maxRetryCycles="5"
鉴于 ((ReceiveRetryCount+1) * (MaxRetryCycles + 1)) 有效,这将导致任何给定消息在移动到毒子队列之前重试 4*6 = 24 次。
将 IErrorHandler 附加到我的服务中,我注意到在 wcf 子系统最终将消息移动到 ;poison 子队列之前,使用 MsmqPoisonMessageException 总共调用了 HandleError 6 次(对于有毒消息)。
我想记录重试消息完成并将消息移动到毒物队列的确切时间。在我看来,唯一的选择是计算某个消息错误的次数,并将此计数与绑定的 MaxRetryCycles 进行比较。这是尴尬且容易出错的。
我的问题是:
- 我有什么方法可以最终检测到 wcf 子系统将消息移动到毒物队列的事件?
我的参考资料是:http: //msdn.microsoft.com/en-us/library/aa395218.aspx