Использование запроса/ответа в SAGA NserviceBus

Я создаю SAGA в NServiceBus. Эта сага обрабатывает некоторую строку, которую необходимо преобразовать, затем проверить и, наконец, импортировать. Эти три действия являются отдельными услугами. Я хочу, чтобы действия были отдельными обработчиками в NServiceBus. Я использую функцию запроса/ответа в NServiceBus. Нравится:

 Bus.Send<TransformRequest>("Backend", m =>
    {
       m.string = string;
       m.MessageId = messageId;
    })
    .Register(i =>
    {
       Console.WriteLine("transform finished")
    });

Обработчик трансформации выглядит следующим образом.

 public void Handle(TransformRequest message)
    {
        var transformationResult = _transformationService.Transform(message.string);

        var response = new TransformResponse()
        {
            string= transformationResult,
            messageId = message.messageId,
        };

        Bus.Reply(response); 
    }

Мой вопрос заключается в следующем. Когда запрос отправляется в transformHandler. Сообщение отправляется в очередь сообщений. Затем гипотетически сервер падает. Сервер перезагружается, сервер подхватывает TransformationRequest, он работает и хочет сделать ответ Саге, но как? Сага больше не жива и не может справиться с .Register. Как мне справиться с этой проблемой?

Спасибо.


person StefanHa    schedule 02.09.2014    source источник
comment
Вы можете отказаться от регистрации и просто сделать bus.reply()   -  person Sean Farmar    schedule 02.09.2014


Ответы (1)


NServiceBus автоматически найдет экземпляр саги, используя заголовок в ответном сообщении.

Как упоминает Шон, вам нужно пропустить .Register и добавить обработчик для результата преобразования в вашей саге. Причина в том, что обратные вызовы с использованием .Register хранятся в памяти и поэтому не переживут перезапуск.

person Andreas Öhlund    schedule 02.09.2014
comment
Спасибо, теперь я использую IHandleMessages‹TransformResponse› с ConfigureHowToFindSaga(). Работает как шарм. - person StefanHa; 02.09.2014