Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么我的传奇阻止了对事件处理程序的访问?_C#_Nservicebus - Fatal编程技术网

C# 为什么我的传奇阻止了对事件处理程序的访问?

C# 为什么我的传奇阻止了对事件处理程序的访问?,c#,nservicebus,C#,Nservicebus,我正试图尝试在NServiceBus中讲述一个传奇故事。我有以下资料: public class MyProcessor: Saga<MySaga>, IAmStartedByMessages<MyMessage1>, IAmStartedByMessages<MyMessage2>, IHandleTimeouts<MyTimeout> protected override void ConfigureHowToFindSaga(Sag

我正试图尝试在NServiceBus中讲述一个传奇故事。我有以下资料:

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。