0

我有一个持续一天的传奇。

收到消息后,我想找到活动的 saga 并在 Handle(message) 方法中执行操作。

我没有 ConfigureHowToFindSagas 方法,因为我想要当前的方法,如果有的话。收到的所有消息都将影响一个 saga,直到收到超时消息。当前的 saga 完成,并在收到新消息后创建一个新的。但是从我读到的内容来看,我需要实现 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

我想我前几天刚刚回答了一个类似的问题。如果您有更复杂的逻辑来查找现有的 saga,则实现 IFindSagas 接口,否则重写 ConfigureHowToFindSaga 方法就足够了。您需要做的就是确保配置映射到启动 saga 的消息。有点像这样:

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
    } 
}

高温高压

于 2011-12-14T15:26:57.513 回答