是否可以有两个或更多处理相同消息类型的Sagas?
例如两个实施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 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'的对象无法转换为类型'Unipluss。 Sign.Notification.Queue.Saga.SendSMSSagaData”。
关于我做错的任何提示? 我已经尝试过SQL和新的AzureStorage传奇实现。
答案 0 :(得分:1)
是的,它是可能的,它适用于所有传奇存储(*)。
你需要记住,每个传奇的数据都是单独更新的,所以如果最后一次更新遇到ConcurrencyException
,邮件将被回滚,并将再次收到。
如果这可能会给您带来问题,那么您一定要确保您的传奇是幂等的。
(*)当符文问这个问题时,它没有按预期工作。 Rebus版本中有一个微妙的错误< 0.99.68,当按ID关联时,不包括标准中的传奇数据类型。
在大多数情况下,这不会成为问题,因为它需要多个传奇处理程序来处理相同的消息才能公开错误。
对于所有受影响的传奇人物,它已固定在0.99.68。