我有一个运行一天的传奇。
收到消息后,我想找到活动的传奇并在Handle(message)方法中执行操作。
我没有ConfigureHowToFindSagas方法,因为我想要当前的方法,如果有的话。收到的所有消息都将影响一个传奇,直到收到超时消息。当前的saga完成,并在收到新消息时创建一个新的saga。但是从我读过的内容来看,我需要实现IFindSagas才能做到这一点,也可能是我自己的Saga persister。
我需要建议从哪里开始,以及这是否是正确的方法。代码示例会有所帮助,因为我对使用接口仍然相对较新。
// 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");
}
答案 0 :(得分:1)
我想我前几天answered a similar question。如果你有更复杂的逻辑来找到你现有的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
}
}
HTH