NServiceBus:文件&#39; <saganame>&#39;不再存在,可能已被删除</saganame>

时间:2014-06-30 14:20:16

标签: c# nservicebus nservicebus-sagas

我正在尝试:从端点获取消息。该消息将包含序列化的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);
}

以下是Saga数据:

 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的多个插入。

1 个答案:

答案 0 :(得分:2)

ConfigureHowToFindSaga()中,您告诉saga persister,您将根据2个唯一属性ReferenceKeyMessageIdentifier查找传奇,具体取决于传入的消息类型。但是,在TrackingSagaData中,您只将ReferenceKey标记为[Unique]

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

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

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

所以,你应该只修改Saga上的属性,而不是自己修改它()。

在其他方面要更清楚一点:

  • 您仍然会遇到[Unique]属性的问题,由于新的()问题,您可能还没有达到这一点。
  • ConfigureMapping()不会抛出错误。你的映射只是在失败时才能正常工作。你应该在找到一个旧的saga时创建一个新的saga,否则会忽略一条消息,因为它无法找到&#34;原始的传奇数据。

我的建议仍然是重新设计传奇以使用在所有消息类型中找到的一个常见标识属性,或者像Sean建议并创建自己的传奇查找器一样,尽管这需要非常深入地了解RavenDB如何工作,因为您需要这样做。 d本质上是直接与数据库通信。