В NServiceBus, как я могу обработать, когда сообщение приходит без соответствующей саги?
Если у меня есть сага, состоящая из двух типов сообщений, скажем, начатая message1 и завершенная message2, могу ли я вернуть обратный вызов, если message2 приходит без уже существующего message1? Я знаю, что он выведет его в очередь ошибок, но я хочу иметь возможность вернуть статус отправляющему клиенту, чтобы сказать, что существует состояние ошибки из-за отсутствия первого сообщения.
2 ответа
Так что я разобрался, мне просто нужно было реализовать 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;
}
}
Я не знаю, правильно ли это делать, но это работает!
Если у вас есть сага, которая может принимать два сообщения, но сообщения могут быть получены в любом порядке, убедитесь, что сага может быть запущена обоими сообщениями. Затем проверьте, пришли ли оба сообщения, установив какое-то состояние в самой саге. Если оба сообщения получены, отметьте их как завершенные.
Поведение NServicebBus по умолчанию - игнорировать любое сообщение, которое не имеет соответствующей саги. Это потому, что вы можете установить тайм-аут, например. Если в течение 24 часов ничего не происходит, сага может отправить себе сообщение об истечении времени ожидания. Но если что-то произошло, и вы отметили свою сагу как завершенную, что должно произойти с сообщением Timeout? Поэтому NServiceBus игнорирует это.