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

时间:2015-03-20 15:33:35

标签: c# nservicebus

我正试图在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处理程序,它会阻止整个处理器,我不能再发布Message1Message2。这种阻止可能发生的原因是什么?

我正在使用InMemoryPersistence进行开发。

1 个答案:

答案 0 :(得分:0)

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

Data.Id = message.Id;

通过这种方式,使用适当的Id设置创建sage,然后在我们下次访问它时,它实际上存在。