为什么我的 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
处理程序,它会阻塞整个处理器,我不能再发布 Message1
和 Message2
。出现这种阻塞的原因是什么?
我正在使用 InMemoryPersistence
进行开发。
问题是我没有意识到需要在 Handler
中设置与配置相关的 Data
。我认为那是由 ConfigureHowToFindSaga
自动处理的。所以在我的 Message1
处理程序中,我只需要以下代码:
Data.Id = message.Id;
这样就创建了sage并设置了合适的Id,下次我们访问它的时候,它就真的存在了。
我正在尝试在 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
处理程序,它会阻塞整个处理器,我不能再发布 Message1
和 Message2
。出现这种阻塞的原因是什么?
我正在使用 InMemoryPersistence
进行开发。
问题是我没有意识到需要在 Handler
中设置与配置相关的 Data
。我认为那是由 ConfigureHowToFindSaga
自动处理的。所以在我的 Message1
处理程序中,我只需要以下代码:
Data.Id = message.Id;
这样就创建了sage并设置了合适的Id,下次我们访问它的时候,它就真的存在了。