0

1日続く物語があります。

メッセージを受信したら、アクティブなサガを見つけて、Handle(message) メソッドで処理したいと考えています。

現在のメソッドが必要なため、ConfigureHowToFindSagas メソッドはありません。受信したすべてのメッセージは、タイムアウト メッセージが受信されるまで、1 つのサガに影響を与えます。新しいメッセージを受信すると、現在のサガが完了し、新しいサガが作成されます。しかし、私が読んだことから、これを行うには IFindSagas を実装する必要があり、おそらく私自身の Saga 永続化も必要です。

どこから始めればよいか、またこれが正しい方法かどうかについてアドバイスが必要です。私はまだインターフェイスの使用に比較的慣れていないため、コード例は役に立ちます。

   // fragment from Saga<PaymentSagaBase>
 public void Run()
        {

        ScheduleBatchIDForSession = Guid.NewGuid();

        // Message handlers aren't auto-subscribed in Saga scenarios so it needs to happen here.
        Bus.Subscribe<PaymentRequested>();
        Bus.Subscribe<PaymentCancelled>();

        Logger.Info(string.Format("Creating new Saga.");

        RequestUtcTimeout(DateTime.Now.AddHours(23), "End of batch");
    }
4

1 に答える 1

1

先日、似たような質問に答えたばかりだと思います。既存のサガを見つけるためにより複雑なロジックがある場合は、IFindSagas インターフェイスを実装します。それ以外の場合は、ConfigureHowToFindSaga メソッドをオーバーライドするだけで十分です。あなたがする必要があるのは、構成がサガを開始したメッセージにマップされていることを確認することだけです. このような並べ替え:

public class MySaga : Saga<MySagaData>, IAmStartedByMessages<Message1>
{
    public override void ConfigureHowToFindSaga()
    {
         ConfigureMapping<Message1>(s => s.SomeID, m => m.SomeID);
    }

    public void Handle(Message1 message)
    {
       if(Data.Id != Guid.Empty)
       {
           // handle existing saga
       }
       else // create new saga instance
       {
          this.Data.SomeID = message.SomeID;
          RequestUtcTimeout(DateTime.Now.AddHours(23), "End of batch");
       }

        // rest of the code to handle Message1
    }

    public override void Timeout(object state)
    {
        // some business action
    } 
}

HTH

于 2011-12-14T15:26:57.513 に答える