2014-06-30 56 views
0

我試圖:從端點獲取消息。該消息將包含序列化的MessageClass。我只想在MessageClass.MessageIdentifier是唯一的時候開始一個新的傳奇。NServiceBus:文檔'<SagaName>'不再存在,可能已被刪除

我的傳奇是這樣的:

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; 

那麼整個應用程序運行正常,但對於相同的消息是越來越創造了新的傳奇。我知道這是因爲RecordNewMessage()會在數據庫中寫入,並且我看到多個插入的MessageClass.MessageIdentifier。

+0

你可以提供一些背景知道你想做什麼? –

+0

每隔1分鐘(例如)一條消息將顯示在端點的隊列中。該消息將包含多個屬性,成員變量對於顯示的每條消息都會有所不同。只有MessageIdentifier可能會/可能不會相同。 我只想在MessageIdentifier不是新的時候開始新的傳奇。 希望這能更清楚地說明情況。 – user3344591

回答

2

ConfigureHowToFindSaga()您正在告訴傳奇持有人,您將根據2個獨特屬性ReferenceKeyMessageIdentifier查找傳奇,具體取決於傳入的消息類型。但是,在TrackingSagaData中,您僅將ReferenceKey標記爲[Unique]

這是一個問題,因爲在RavenDB中,只有ID加載/存儲是ACID操作。 Raven Saga Persister根據您未提供的[Unique]屬性使用身份證件。

現在更大的問題是,我不認爲你可以有兩個[Unique]屬性爲相同的傳奇數據。有沒有一種方法可以重新設計這個傳奇故事,以便這兩個信息都具有相同的獨特屬性? (或者說,相同的價值相同的類型 - 消息上的屬性名稱不需要相同。)

您在評論中提到您正在做Data = new TrackingSaga()並且您是正確的,您不應該那樣做! NServiceBus將爲您創建該類,以及NServiceBus需要控制Saga生命週期的3個屬性。如果你自己創新,你會吹走這些屬性,沒有任何東西可以工作。

所以,你應該只修改佐賀的屬性,而不是新的()它自己。

要對其他點更清晰一點:

  • 你還是得與[Unique]性質的問題,你可能只是甚至沒有到這一步又由於新的()問題。
  • ConfigureMapping()不會拋出錯誤。您的映射在失敗時不會正常工作。當發現一箇舊的應用程序時,你會得到一個新的事件,或者一個消息將被忽略,因爲它「無法找到」原始的事件數據。

我的建議仍然有效,重新設計的傳奇使用的所有信息類型中發現一個共同的識別性能,還是肖恩建議,並創建自己的傳奇取景器,雖然這需要RavenDB是如何工作的,你很親密的理解本質上是直接與數據庫進行通信。

+0

另一個選擇是編寫你自己的Saga finder,實現IFindSagas [這裏是一個例子](https://github.com/sfarmar/supportcode/tree/master/ComplexSagaFindingLogic) –

+0

我的ConfigureMapping()工作正常。至少我還沒有意識到任何錯誤。 問題出在Handler()中。我在做 Data = new TrackingSaga(message.MessageClass)。我不知道我是如何錯過這一點的。 – user3344591

+0

我改變了我的Handle()來檢查Data.MessageClass是否爲null。如果沒有,那麼我在Handle()中沒有做任何事情。不知道這個解決方法有多好。 – user3344591