Rebus:是否可以使用相同的IHandleMessages类型

时间:2016-07-12 21:26:02

标签: rebus

是否可以有两个或更多处理相同消息类型的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传奇实现。

1 个答案:

答案 0 :(得分:1)

是的,它是可能的,它适用于所有传奇存储(*)。

你需要记住,每个传奇的数据都是单独更新的,所以如果最后一次更新遇到ConcurrencyException,邮件将被回滚,并将再次收到。

如果这可能会给您带来问题,那么您一定要确保您的传奇是幂等的。

(*)当符文问这个问题时,它没有按预期工作。 Rebus版本中有一个微妙的错误< 0.99.68,当按ID关联时,不包括标准中的传奇数据类型。

在大多数情况下,这不会成为问题,因为它需要多个传奇处理程序来处理相同的消息才能公开错误。

对于所有受影响的传奇人物,它已固定在0.99.68。