2017-08-15 29 views
2

我目前正在使用Masstransit和Courier模式。帶參數的MassTransit活動錯誤

我設置了一個可能失敗的活動,我希望能夠訂閱此故障並採取相應的行動。

我的問題是,即使我可以訂閱失敗,甚至看到導致失敗的異常,但我無法將任何參數傳遞給它。

出於測試目的,supose我有以下活動:

public class MyActivity : ExecuteActivity<MyMessage> 
{ 
    public Task<ExecutionResult> Execute(ExecuteContext<MyMessage> context) 
    { 
     try 
     { 
      // .... some code 
      throw new FaultException<RegistrationRefusedData>(
       new RegistrationRefusedData(RegistrationRefusedReason.ItemUnavailable)); 
      // .... some code 
     } 
     catch (Exception ex) 
     { 
      return Task.FromResult(context.Faulted(ex)); 
     } 
    } 
} 

的問題是在我傳遞作爲異常的參數的原因(RegistrationRefusedReason)。如果我訂閱一個RoutingSlipActivityFaulted消費者,我可以幾乎得到我所需要的所有信息:(?也許濫用模式)

public class ActivityFaultedConsumer : IMessageConsumer<RoutingSlipActivityFaulted> 
{ 
    public void Consume(RoutingSlipActivityFaulted message) 
    { 
     string exceptionMessage = message.ExceptionInfo.Message; // OK 
     string messageType = message.ExceptionInfo.ExceptionType; // OK 
     RegistrationRefusedReason reason = ??????; 
    } 
} 

我覺得我缺少的東西在這裏很重要。

是否有任何其他方式從故障活動中獲取參數?

+0

我想如果我有一個'context.FaultedWithVariables'在活動將工作... –

回答

3

所以,你所描述的情況不是Fault。這是一個無法滿足商業條件。在這種情況下,您不想重試交易,您想要終止交易。要通知發貨人發送傳送單,您會發現一個業務事件,表示由於業務條件導致交易未完成。

例如,在你的情況,你可以這樣做:

context.Publish<RegistrationRefused>(new { 
    CustomerId = xxx, 
    ItemId = xxxx, 
    Reason = "Item was unavailable" 
    }); 

context.Terminate(); 

這將終止傳送名單(後續活動將不會被執行),併產生RoutingSlipTerminated事件。

這是由於業務條件或規則而結束傳票單的正確方法。例外情況僅適用於特殊行爲,因爲您可能需要重試它們以處理失敗。

+0

我想這是有道理的。但是,「Terminate」方法是否會開始補償以前的活動?我需要整個傳送單有一個一致的交易... –

+0

剛剛測試...它不是。我應該發送消息,在這種情況下使用Faulted(),還是我濫用? (很好的工作在MT BTW) –

+0

是的,如果你想補償,拋出一個異常,仍然發佈你的事件有業務上下文。 –