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