在NServiceBus中,我如何处理没有匹配传奇的消息?

在NServiceBus中,我如何处理没有匹配传奇的消息?,nservicebus,saga,Nservicebus,Saga,如果我有一个由两种消息类型组成的传奇,比如说由message1开始,由message2完成,那么如果message2在不存在message1的情况下进入,我是否可以返回回调?我知道它会将其转储到错误队列中,但我希望能够向发送客户端返回一个状态,以表明由于第一条消息不在那里而存在错误状态。因此我找到了答案,我只需要为消息类型实现IFindSagas: public class MySagaFinder : IFindSagas<MySagaData>.Using<Message2

如果我有一个由两种消息类型组成的传奇,比如说由message1开始,由message2完成,那么如果message2在不存在message1的情况下进入,我是否可以返回回调?我知道它会将其转储到错误队列中,但我希望能够向发送客户端返回一个状态,以表明由于第一条消息不在那里而存在错误状态。

因此我找到了答案,我只需要为消息类型实现
IFindSagas

public class MySagaFinder : IFindSagas<MySagaData>.Using<Message2>
{
    public ISagaPersister Persister { get; set; }
    public IBus Bus { get; set; }

    public MySagaFinder FindBy(Message2 message)
    {
        var data = Persister.Get<MySagaData>("MessageIdProperty", message.MessageIdProperty);
        if (data == null)
        {
            Bus.Return(0);
        }
        return data;
    }
}
公共类MySagaFinder:IFindSagas.Using
{
公共ISagaPersister持久器{get;set;}
公共IBus总线{get;set;}
public MySagaFinder FindBy(Message2 message)
{
var data=Persister.Get(“MessageIdProperty”,message.MessageIdProperty);
如果(数据==null)
{
公共汽车返回(0);
}
返回数据;
}
}

我不知道这是否是正确的方法,但它是有效的

如果您有一个可以接收两条消息的传奇,但消息可以以任何顺序接收,请确保这两条消息都可以启动传奇。然后通过在saga本身中设置一些状态来验证这两条消息是否都已到达。如果两条消息都已到达,请将其标记为已完成


默认的NServicebBus行为是忽略任何没有相应saga的消息。例如,这是因为您可以设置超时。如果在24小时内没有任何事情发生,传奇可以向自身发送超时消息。但是,如果确实发生了什么事情,并且您将您的传奇标记为已完成,那么超时消息会发生什么情况?因此,NServiceBus忽略了这一点。

永远没有一个明确的正确方法,这取决于具体情况。问题中没有提供太多细节,但我猜你走错了方向。很有可能第一条消息尚未处理。很简单,因为第二条消息首先到达。这是异步消息传递,意味着消息并不总是以相同的顺序出现。看看我最初的回答。您在这里使用的是复杂的传奇发现,这是指传奇已经开始的时候。不适合你的场景。