我正试图在NServiceBus中尝试一个Saga。我有以下内容:
public class MyProcessor: Saga<MySaga>, IAmStartedByMessages<MyMessage1>,
IAmStartedByMessages<MyMessage2>, IHandleTimeouts<MyTimeout>
protected override void ConfigureHowToFindSaga(SagaPropertyMapper<MySaga> mapper) {
mapper.ConfigureMapping<MyMessage1>(m => m.Id).ToSaga(s => s.Id);
mapper.ConfigureMapping<MyMessage2>(m => m.Id).ToSaga(s => s.Id);
}
public void Handle(MyMessage1 message) {
// logic
RequestTimeout<MyTimeout>(TimeSpan.FromMinutes(30));
}
public void Handle(MyMessage2 message) {
// logic
MarkAsComplete();
}
public void Timeout(MyTimeout state) {
// logic
MarkAsComplete();
}
所以架构是这样的,Message1
应该首先出现,但是在一些超时后,我们放弃等待Message2
。但是,如果Message2
确实在超时后进入,那么它仍然可以,而且这两个都被标记为IAmStartedByMessages
。现在问题是:如果我发布Message2
,代码运行,传奇完成,我可以继续发布更多事件。但是,如果我首先运行Message1
处理程序,它会阻止整个处理器,我不能再发布Message1
和Message2
。这种阻止可能发生的原因是什么?
我正在使用InMemoryPersistence
进行开发。
答案 0 :(得分:0)
问题是我没有意识到需要在Data
内设置与配置相关的Handler
。我认为这是由ConfigureHowToFindSaga
自动处理的。所以在我的Message1
处理程序中,我需要的只是以下代码:
Data.Id = message.Id;
通过这种方式,使用适当的Id设置创建sage,然后在我们下次访问它时,它实际上存在。