2

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

4

2 回答 2

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;
    }
}

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

于 2011-09-03T01:33:23.400 回答
0

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

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

于 2013-05-24T13:08:29.503 回答