为什么我的 Saga 阻止访问事件处理程序?

Why is my Saga blocking access to the event handlers?

我正在尝试在 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,代码 运行s,传奇就完成了,我可以继续发布更多事件。但是,如果我先 运行 Message1 处理程序,它会阻塞整个处理器,我不能再发布 Message1Message2。出现这种阻塞的原因是什么?

我正在使用 InMemoryPersistence 进行开发。

问题是我没有意识到需要在 Handler 中设置与配置相关的 Data。我认为那是由 ConfigureHowToFindSaga 自动处理的。所以在我的 Message1 处理程序中,我只需要以下代码:

Data.Id = message.Id;

这样就创建了sage并设置了合适的Id,下次我们访问它的时候,它就真的存在了。