В NServiceBus, как я могу обработать, когда сообщение приходит без соответствующей саги? - PullRequest
2 голосов
/ 03 сентября 2011

Если у меня есть сага, состоящая из двух типов сообщений, скажем, начатая message1 и завершенная message2, могу ли я вернуть обратный вызов, если message2 приходит без уже существующего message1?Я знаю, что он выведет его в очередь ошибок, но я хочу иметь возможность вернуть состояние отправляющему клиенту, чтобы сказать, что существует состояние ошибки из-за отсутствия первого сообщения.

Ответы [ 2 ]

3 голосов
/ 03 сентября 2011

Так что я понял, мне просто нужно было реализовать 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;
    }
}

Я не знаю, является ли это правильным способом сделатьэто, но это работает!

0 голосов
/ 24 мая 2013

Если у вас есть сага, которая может принимать два сообщения, но сообщения можно получать в любом порядке, убедитесь, что сага может быть запущена обоими сообщениями.Затем проверьте, пришли ли оба сообщения, установив какое-то состояние в самой саге.Если оба сообщения получены, пометьте их как завершенные.

Поведение NServicebBus по умолчанию - игнорирование любого сообщения, которое не имеет соответствующей саги.Это потому, что вы можете установить тайм-аут, например.Если в течение 24 часов ничего не происходит, сага может отправить себе сообщение об истечении времени ожидания.Но если что-то случилось, и вы отметили свою сагу как завершенную, что должно произойти с сообщением Timeout?Поэтому NServiceBus игнорирует его.

...