我有一个工作流服务,它有几个接收来监听MSMQ队列。我想实现以下行为:
我已尝试将TransactedReceiveScope放在Receive活动周围,但它会将消息放入重试队列中的相关错误。另外,它会在重负荷下引发很多问题。
如果没有TransactedReceiveScope,如果存在InstanceLockException,则会丢弃该消息。
有没有办法实现这种行为(可能是通过行为扩展)?
答案 0 :(得分:1)
您可以实现IErrorHandler for WCF来捕获应用程序或WCF抛出的所有未处理的异常。使用netMsmqBinding时必须注意的是,在此处理程序中抛出错误意味着消息已经“成功”处理并且将从队列中删除。在发生InstanceLockException的情况下,如果要进行内置的MSMQ 4重试处理,则必须让它保持未处理状态。您还需要允许PoisonMessageException保持未处理状态,以便正确进行MSMQ重试。
答案 1 :(得分:0)
我不熟悉使用Workflow,但是知道MSMQ和WCF如何工作你可以试试这个
发生CorrelationException时:
由于您的服务方法不会抛出异常,因此会认为消息已成功处理并将其从队列中删除。
发生InstanceLockException时:
由于您的服务方法抛出异常,它会认为消息未成功处理并将其移至重试队列。
答案 2 :(得分:0)
我认为您必须创建一个WCF自定义行为来捕获这些异常。