Ребус: Возможно ли иметь несколько саг с одним и тем же типом IHandleMessages
Возможно ли иметь две или более саг, которые обрабатывают один и тот же тип сообщения?
Например, две саги, которые обе реализуют IHandleMessages? Это работает для всех хранилищ саги или только для некоторых из них?
Обновить:
Я проверил, у меня есть две саги (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 защищенное переопределение void CorrelateMessages(ICorrelationConfig config) { config.Correlate(x => x.SagaId, y => y.Id); config.Correlate(x => x.SagaId, y => y.Id); } //SendEmailSaga защищенное переопределение 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' не может быть преобразован в тип 'Unipluss.Sign.Notification.Queue.Saga.SendSMSSagaData.
Любые советы о том, что я делаю не так? Я пробовал и SQL, и новые реализации саги AzureStorage.
1 ответ
Да, это возможно, и это работает для всех хранилищ саги (*).
Вы должны помнить, что данные каждой саги обновляются отдельно, поэтому, если, например, последнее обновление имеет ConcurrencyException
, сообщение откатывается и будет получено снова.
Если это может вызвать проблемы для вас, вы должны сделать свои саги идемпотентными.
(*) В тот момент, когда Руне задал вопрос, он НЕ работал должным образом. В версиях Rebus < 0.99.68 была незначительная ошибка, которая не включала тип саги в критерии при корреляции по ID.
Это не было бы проблемой в большинстве случаев, потому что требовалось несколько обработчиков саги для обработки одного и того же сообщения, чтобы выявить ошибку.
Это было исправлено в 0.99.68 для всех пострадавших саг.