我可以更改工作流服务的MSMQ消息错误处理行为吗?

时间:2011-05-12 10:53:41

标签: wcf .net-4.0 workflow-foundation-4

我有一个工作流服务,它有几个接收来监听MSMQ队列。我想实现以下行为:

  1. 如果发生关联异常(即 - 工作流实例消失),请丢弃该消息。
  2. 如果发生InstanceLockException(即 - 此工作流实例正在另一台服务器上执行某些操作),请将消息放入重试队列。
  3. 我已尝试将TransactedReceiveScope放在Receive活动周围,但它会将消息放入重试队列中的相关错误。另外,它会在重负荷下引发很多问题。

    如果没有TransactedReceiveScope,如果存在InstanceLockException,则会丢弃该消息。

    有没有办法实现这种行为(可能是通过行为扩展)?

3 个答案:

答案 0 :(得分:1)

您可以实现IErrorHandler for WCF来捕获应用程序或WCF抛出的所有未处理的异常。使用netMsmqBinding时必须注意的是,在此处理程序中抛出错误意味着消息已经“成功”处理并且将从队列中删除。在发生InstanceLockException的情况下,如果要进行内置的MSMQ 4重试处理,则必须让它保持未处理状态。您还需要允许PoisonMessageException保持未处理状态,以便正确进行MSMQ重试。

答案 1 :(得分:0)

我不熟悉使用Workflow,但是知道MSMQ和WCF如何工作你可以试试这个

发生CorrelationException时:

  • 抓住例外
  • 从您的服务方式返回

由于您的服务方法不会抛出异常,因此会认为消息已成功处理并将其从队列中删除。

发生InstanceLockException时:

  • 抓住例外
  • 重新抛出异常

由于您的服务方法抛出异常,它会认为消息未成功处理并将其移至重试队列。

答案 2 :(得分:0)

我认为您必须创建一个WCF自定义行为来捕获这些异常。