C# 为什么我的传奇阻止了对事件处理程序的访问?
我正试图尝试在NServiceBus中讲述一个传奇故事。我有以下资料:C# 为什么我的传奇阻止了对事件处理程序的访问?,c#,nservicebus,C#,Nservicebus,我正试图尝试在NServiceBus中讲述一个传奇故事。我有以下资料: public class MyProcessor: Saga<MySaga>, IAmStartedByMessages<MyMessage1>, IAmStartedByMessages<MyMessage2>, IHandleTimeouts<MyTimeout> protected override void ConfigureHowToFindSaga(Sag
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();
}
公共类MyProcessor:Saga,IAmStartedByMessages,
我从留言开始,我把它删除了
受保护覆盖无效配置如何查找Saga(SagaPropertyMapper映射器){
配置映射(m=>m.Id).ToSaga(s=>s.Id);
配置映射(m=>m.Id).ToSaga(s=>s.Id);
}
公共无效句柄(MyMessage1消息){
//逻辑
请求超时(TimeSpan.FromMinutes(30));
}
公共无效句柄(MyMessage2消息){
//逻辑
MarkAsComplete();
}
公共无效超时(MyTimeout状态){
//逻辑
MarkAsComplete();
}
因此,体系结构是这样的:Message1
应该首先出现,但在一段时间后,我们放弃了等待Message2
。但是,如果超时后出现了Message2
,则仍然可以,因为这两个消息都标记为IAmStartedByMessages
。现在的问题是:如果我发布Message2
,代码就会运行,故事就完成了,我可以继续发布更多的事件。但是,如果我先运行Message1
处理程序,它会阻塞整个处理器,我将无法再发布Message1
或Message2
。发生这种阻塞的原因是什么
我正在使用
InMemoryPersistence
进行开发。问题是我没有意识到需要在处理程序中设置与配置相关的数据。我认为这是由配置howtofindsaga
自动处理的。因此,在我的Message1
处理程序中,我只需要以下代码:
Data.Id = message.Id;
通过这种方式,sage是使用适当的Id集创建的,下次我们访问它时,它实际上是存在的。提供的信息太少了。新邮件的message.Id值是多少?如果新消息的message.Id与开始传奇的消息中的相同,那么传奇将吞并它们。此外,当您首先发送具有相同Id的Message1,然后发送具有相同Id的Message2时,您的saga逻辑中存在一个缺陷。由于具有此Id的saga已经存在,因此不会调用Message2处理程序。我回答了下面的问题,但我很好奇,当您说如果Message1然后发送Message2,则不会调用Message2的处理程序时,您的意思是什么?它似乎在按预期工作,但我很好奇我是否错过了一个边缘案例或什么。我可能对此有错,但你的传奇故事可以从Message1和Message2开始。如果您的传奇是由某个Id标识的,并且您的传奇是由Message1启动的,例如Id=10,那么该传奇数据将在Id=10时可用。当Message2具有相同的id,并且您的saga类被配置为在Message2上启动新的saga时,它应该检查具有相同id的saga是否已经存在,如果已经存在,则不要启动新的saga。然而,可能是在这种情况下,IAmStartedByMessage与IHandleMessage完全相同,我从未尝试过这样做。在这种情况下,我会为Message2使用一个单独的处理程序,并从该处理程序发送一条消息来完成这一传奇。请记住,强烈建议不要在saga处理程序中包含任何业务逻辑。相反,saga充当流程管理器并发送其他消息,这些消息的处理程序执行逻辑并用状态更新回复saga。