0

我正在尝试:从端点获取消息。该消息将包含序列化的 MessageClass。只有当 MessageClass.MessageIdentifier 是唯一的时,我才想开始一个新的传奇。

我的传奇是这样的:

public class TrackingSaga:Saga<TrackingSagaData>,IAmStartedByMessages<InsertMessgae>,IHandleMessages<DeleteMessage>
{
    private IBusinessService _trackingBusinessService;
    public override void ConfigureHowToFindSaga()
    {
        ConfigureMapping<DeleteMessage>(s => s.ReferenceKey, p => p.ReferenceKey);
        ConfigureMapping<InsertMessage>(s=>s.MessageIdentifier,p=>p.MessageIdentifier);
    }
}

public void Handle(InsertMessage message)
{
 Data=new TrackingSagaData(message.MessageClass)
          {
            MessageIdentifier = message.MessageClass.MessageIdentifier;
          }

 var trackingBusinessService = <<spring will provide me>> ;
 trackingBusinessService.RecordNewMessage(message.MessageClass);
}

这是佐贺数据:

 public class TrackingSagaData : ParentSagaData
{

    public MessageClass MessageClass { private set; get; }
    [Unique]
    public Guid ReferenceKey { get { return MessageClass.ReferenceKey; } }
    public string MessageIdentifier { get { return MessageClass.MessageIdentifier; } }
    public bool IsMessageDeleted { set; get; }

    public TrackingSagaData()
    {

    }
    public TrackingSagaData(MessageClass messageClass)
    {
        MessageClass= messageClass;
        IsMessageDeleted = false;
    }

这是总线配置:

Configure.With()
                 .Log4Net()
                 .DefaultBuilder()
                 .XmlSerializer()
                 .RavenSubscriptionStorage()
                 .MsmqTransport()
                 .IsTransactional(true)
                 .PurgeOnStartup(false)
                 .RavenPersistence()
                 .UnicastBus();

当我运行我的端点时,控制台会显示警告:

2014-06-27 18:17:10,040 [Worker.14] WARN  NServiceBus.Unicast.UnicastBus [(null)
] <(null)> - IncidentTrackingSaga failed handling message.
System.InvalidOperationException: Document 'trackingsagadata/1fcfd00d-6b97-4
dc2-aa09-18a1bd0631e2' no longer exists and was probably deleted

2014-06-27 18:17:10,070 [Worker.14] WARN  NServiceBus.Unicast.Transport.Transact
ional.TransactionalTransport [(null)] - Failed raising 'transport message receiv
ed' event for message with ID=88d86af8-5925-4975-ac72-7e68885070ab\18218
NServiceBus.Unicast.Transport.TransportMessageHandlingFailedException: Exception
of type 'NServiceBus.Unicast.Transport.TransportMessageHandlingFailedException'
was thrown.

但是,如果我删除语句:

ConfigureMapping<InsertMessage>(s=>s.MessageIdentifier,p=>p.MessageIdentifier);

MessageIdentifier = message.MessageClass.MessageIdentifier;

然后整个应用程序运行良好,但新的 Saga 正在为相同的消息创建。我知道这一点,因为 RecordNewMessage() 将写入 DB,并且我看到同一 MessageClass.MessageIdentifier 的多个插入。

4

1 回答 1

2

在您告诉 saga 持久化者您将根据 2 个唯一属性或ConfigureHowToFindSaga()查找 saga ,具体取决于传入的消息类型。但是,在您仅标记为.ReferenceKeyMessageIdentifierTrackingSagaDataReferenceKey[Unique]

这是一个问题,因为在 RavenDB 中,只有按 ID 加载/存储才是 ACID 操作。Raven Saga Persister 使用基于[Unique]您未提供的属性的身份证明文件。

现在更大的问题是,我认为你不能[Unique]为同一个传奇数据拥有两个属性。有没有一种方法可以重新设计 saga,使两条消息都具有相同的独特属性?(或者更确切地说,相同类型的相同值 - 消息上的属性名称不必相同。)

您在您所做的评论中提到Data = new TrackingSaga()并且您是正确的,您不应该这样做!NServiceBus 将为您创建该类,以及 NServiceBus 控制 Saga 生命周期所需的 3 个属性。如果你自己更新它,你会吹走这些属性,没有任何东西可以工作。

因此,您应该只修改 Saga 上的属性,而不是自己修改 new()。

在其他方面更清楚一点:

  • 您仍然会遇到[Unique]属性问题,由于 new() 问题,您可能还没有到那一点。
  • ConfigureMapping() 不会抛出错误。您的映射在失败时无法正常工作。当应该找到一个旧的 saga 时,您会创建一个新的 saga,或者一条消息将被忽略,因为它“找不到”原始 saga 数据。

我的建议仍然是重新设计 saga 以使用在所有消息类型中发现的一个通用标识属性,或者按照 Sean 的建议创建自己的 saga finder,尽管这需要非常深入地了解 RavenDB 的工作原理,因为你基本上是在直接通信与数据库。

于 2014-06-30T20:08:29.387 回答