在NServiceBus中,如何在没有匹配的传奇的情况下处理消息时如何处理?

时间:2011-09-03 00:12:26

标签: nservicebus saga

如果我有一个包含两种消息类型的传奇,比如由message1启动并由message2完成,如果message2在没有message1已经存在的情况下进入,我可以返回一个回调吗?我知道它会将它转储到错误队列中,但是我希望能够将状态返回给发送客户端,说明由于第一条消息不在那里而存在错误状态。

2 个答案:

答案 0 :(得分:3)

所以我想出来了,我只需要为消息类型实现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;
    }
}

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

答案 1 :(得分:0)

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

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