2017-08-23 6 views
0

MassTransitでFinalize()がどのように機能しているか、特に初期状態で実行できるかどうかを理解する上で問題があります。セットアップ:私はHandleCrawlRequestCreatedで例外をキャッチした場合MassTransitの「ファイナライズ」の理解

public Event<ICrawlRequestCreated> CrawlCreated { get; private set; } 
public Event CrawlFailed { get; private set; } 

public State Executing { get; private set; } 
public State Completed { get; private set; } 
public State Failed { get; private set; } 

public WorkflowSaga() 
{ 
    InstanceState(x => x.CurrentState); 

    Initially(
     When(CrawlCreated) 
      .Then(HandleCrawlRequestCreated) 
      .TransitionTo(Executing), 
     When(CrawlFailed) 
      .Then(HandleCrawlFailed) 
      .TransitionTo(Failed) 
      .Finalize() 
    ); 

    ... 

    SetCompletedWhenFinalized(); 
} 

が、私はそうのように、CrawlFailedを上げる:正しくHandleCrawlFailedを発射、それは(リポジトリからステート・マシン・インスタンスを削除しません

context.Raise(CrawlFailed); 

EF経由のSQL Server)。しかし、実行中にCrawlFailedを呼び出すと、インスタンスはリポジトリから削除されます。私は何が欠けていますか?

答えて

2

メソッド内で例外をキャッチする代わりに.Catch()メソッドを使用し、Executing状態に移行する代わりに.Catch内でファイナライズする必要があります。

InitializeでFinalizeすると、ステートマシンをデータベースに永続させることはありませんが、EFリポジトリを作成していないため、テストカバレッジがそのようになるかどうかはわかりません。

+0

サガインスタンスは、すでに完了していない場合にのみコンテキストに追加されるようです。しかし、次の行はif内部でも取ることができます:https://github.com/MassTransit/MassTransit/blob/0ac2564e0225ff11b6f20f38a18d3b886cc2d7d3/src/Persistence/MassTransit.EntityFrameworkIntegration/Saga/EntityFrameworkSagaRepository.cs#L407 –

+0

こんにちはクリス、私は疑問に思っていた'Catch'メソッド内で' Finalize'することも可能ですか? 'TransactionExtensions'に' ExceptionActivityBinder 'の' Finalize'メソッドはなく、 'EventActivityBinder 'のみで 'EventActivityBinder 'メソッドを取得する方法はありません。 'Catch'メソッドで呼び出すことができます。 – Slowacki

+0

拡張メソッドを追加するだけでよいでしょう。キャッチブロックで「Final」状態に移行するのは完全に合法ですが、私はそれを追加するとは思わないと確信しています。 –

関連する問題