保存了NServiceBus数据但没有保存传奇

时间:2018-01-26 11:16:26

标签: nservicebus saga

我们正在使用带有Oracle数据库的NServiceBus 4.6.5,对于特定请求,间歇性地将数据保存到我们的数据库中,但相应的sagaData不会保存到数据库中。

我查看了日志,找不到解释。

如果您需要我在这里发布更多信息,请告诉我,因为我不知道从哪里开始。

谢谢, 米格尔

  

EDIT1:我们的传奇被保存到大多数消息的数据库中,   这只是针对特定消息发生的事情。

     

间歇性地发生(仅对某些消息发生)   类型)。

     

该消息类型的正常CRUD操作是持久的,   只是SagaData不是。)

     

分布式事务处理协调器可能有问题,或者可能是NServiceBus 4.6.5错误?

EDIT2: The code is a little offuscated:
public partial class MySaga : IHandleMessages<IAddMyCommand>
{
    public void Handle(IAddMyCommand cmd) {
        ...
        cmd.ExternalCombinedIdentifier = ...;
        Data.ExternalCombinedIdentifier = cmd.ExternalCombinedIdentifier;
        ...
        var myId = SagaUtilities.GetById(cmd.ExternalCombinedIdentifier, ...);
        ...
        var response = Repository.AddObject(...);
        ...
        Data.MyData.Add(new MyData { ... MyId = response.MyId, Timestamp = response.Timestamp, ... });
        ...
    }
    ...
[SagaIndex("ExternalCombinedIdentifier")]
public class MySagaData : IContainSagaData
{

    public long ExternalCombinedIdentifier { get; set; }

    ...
}
  

编辑3:我们有一个Master和2个Worker服务器。可能是这样的   1服务器中的SagaData与SagaData不同步   另一台服务器我们将SagaData持久化到Oracle。

     

NServiceBus如何在我们的情况下保证SagaData   在3台服务器(Master和Workers)中同步?

1 个答案:

答案 0 :(得分:1)

在持久化传奇数据时,您需要具备一些元素。包含saga实现的类应继承自Saga基类。为此,您需要指定将使用持久层存储的自定义类(下例中的YourSagaDataClass):

public class MySagaClass : Saga<YourSagaDataClass>

YourSagaDataClass必须实现IContainSagaData接口,因为它将用于持久化saga数据,并通常使用CorrelationId将消息处理与其正确的传奇相关联。实际上,实现IContainSagaData接口可以为您提供以下三个属性:

public Guid Id { get; set; }
public string Originator { get; set; }
public string OriginalMessageId { get; set; }

要在消息或事件处理程序中使用持久化的saga数据,请使用Data作为对持久化saga数据的引用:

Data.OrderId = message.OrderId;

使用NServiceBus保存saga数据时,还要确保已指定saga persistence.

可以在此处找到特定软件本身的更多信息: https://docs.particular.net/nservicebus/sagas/?version=core_4