0

Unit of Work の End メソッドで例外が発生した場合に、Saga データが NServiceBus の RavenDB に保存されるのを回避する方法 (分散トランザクションに登録する以外) はありますか?

DTC を使用しないように NSB 4.1 をセットアップしました

NServiceBus.Configure.Transactions
                     .Enable()
                     .Advanced(action => action.DisableDistributedTransactions());

データベースへの変更をコミットするときに、制約やタイムアウト、またはデータベースで予期しない何かが原因で失敗する可能性がある SqlUnitOfWork があります。

public class SqlUnitOfWork : IManageUnitsOfWork
{
  ...
  public void End(Exception ex = null)
  {
    if (ex == null)
      datacontext.SubmitChanges(); //this could throw an exception
  }
}

そこで例外が発生すると、メッセージは再試行されますが、saga は既に ravendb に保存されています。私が見つけた回避策は、Unit of Work を使用せず、メッセージ ハンドラーの Handle メソッドの最後に変更を送信することでしたが、トランスポート メッセージに複数の論理メッセージがある場合はうまく機能しません。

これを達成する賢い方法はありますか?

4

0 に答える 0