我们正在使用带有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)中同步?
答案 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