2016-07-12 1 views
1

Возможно ли иметь два или более сага, которые обрабатывают один и тот же тип сообщения?Ребус: Возможно ли иметь Mulitple Sagas с тем же IHandleMessages, тип

Например, две саги, которые реализуют IHandleMessages? Это работает для всех хранилищ саг или только для некоторых из них?

Update:

Я проверил у меня есть две саги (SendSMSSaga и SendEmailSaga) и реализует те же IHandleMessages (команды) индивидуальный IAmInitiatedBy единственное, что происходит в первой ручки является:

 
    if (!IsNew) return; 

      Data.Command = message; 
      Data.Id = message.SagaId ?? Guid.NewGuid(); 
      Data.Status = Status.INIT; 
      Data.LogRecordId = Extensions.CreateLogRecordId(); 

      await Bus.SendLocalWithHeader(new CreateLogCompleteCommand() { SagaId = Data.Id, LogRecordId = Data.LogRecordId }); 

//SendSMSSaga 
protected override void CorrelateMessages(ICorrelationConfig config) 
     { 
      config.Correlate(x => x.SagaId, y => y.Id); 
      config.Correlate(x => x.SagaId, y => y.Id); 
     } 
//SendEmailSaga 
protected override void CorrelateMessages(ICorrelationConfig config) 
     { 
      config.Correlate(x => x.SagaId, y => y.Id); 
      config.Correlate(x => x.SagaId, y => y.Id); 
     } 

Тогда я получаю следующее исключение:

5 необработанных исключений: 13.07.2016 10:26:30 +02: 00: System.ArgumentException: Объект типа «Unipluss.Sign.Notification.Queue.Saga.Email.SendEmailSagaData 'не может быть преобразован в тип' Un ipluss.Sign.Notification.Queue.Saga.SendSMSSagaData.

Любые советы о том, что я делаю неправильно? Я пробовал как SQL, так и новые реализации саги AzureStorage.

+0

Я боюсь, что это ошибка. Думаю, я никогда не предполагал, что один раз ударил несколько экземпляров саги разных типов с помощью одного сообщения ....... – mookid8000

+0

Я поднял его как проблему здесь: https: //github.com/rebus-org/Rebus/issues/486 он будет исправлен некоторое время завтра - надеюсь, вы сможете добраться до – mookid8000

+0

Спасибо, я могу подождать до завтра –

ответ

0

Да, это возможно, и оно работает для всех хранилищ саг (*).

Необходимо помнить, что данные каждой саги обновляются отдельно, поэтому, если, например, последнее обновление имеет ConcurrencyException, сообщение откатывается и будет получено снова.

Если это может стать причиной для вас, вы должны быть уверены, что делаете свои саги идемпотентными.


(*) В то время, когда Руна задала вопрос, он НЕ работал так, как должен. В версиях Rebus < 0.99.68 была тонкая ошибка, которая не включала бы тип данных саги в критерии при сопоставлении по идентификатору.

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

Он исправлен в 0.99.68 для всех затронутых саги.

+0

Когда возникает ConcurrencyException? Что может быть причиной этого? –

+0

Ребус выдает «ConcurrencyException», когда обнаружен конфликт при обновлении данных саги. Он использует поле 'Revision' данных саги для реализации оптимистического параллелизма. – mookid8000

+0

есть что-то в вашем предыдущем комментарии? – mookid8000

Смежные вопросы