В 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 игнорирует это.

Другие вопросы по тегам