2011-06-21 73 views
2

我在使用NServiceBus傳奇時遇到了競賽狀況。NServicebus傳奇賽事條件

的問題是這個 -

我有一個從佐賀派生,實現IAmStartedByMessages並持續佐賀數據在SQL Server的類。這個傳奇處理傳入的消息,創建一個新的消息,並將其發送到另一個服務器。該服務器處理消息併發迴響應。這個答覆信息然後作爲傳奇處理的下一個階段處理。我正在使用傳奇ids來配置映射。

問題出現時,緊接在傳奇數據保存到數據庫之前的回覆消息。 由於傳奇數據尚未保存,因此映射失敗並且消息丟失。

爲了說明下面的例子,假設我有這些處理程序在不同的端點上偵聽,我在SagaData被持久化之前得到AnotherMessage。 -

public class MySaga : Saga<SagaData>, 
         IAmStartedByMessages<StartMesssage> 
         HandleMessage<AnotherMessage> 
{ 

    public override void ConfigureHowToFindSaga() 
    { 
     ConfigureMapping<AnotherMessage>(s => s.Id, x => x.SagaId); 
    } 

    void Handle(StartMessage message) 
    { 
     var sendMsg = new SendMessage(){SagaId=this.Data.Id} 
     bus.Send(sendMsg) 
    } 

    void Handle(AnotherMessage message) 
    { 
    } 
} 


public class NextStage : IHandleMessages<SendMessage> 
{ 
    void Handle(SendMessage message) 
    { 
    var anotherMsg = new AnotherMessage() {SagaId=message.SagaId}; 
    bus.Send(anotherMsg); 
    } 
} 

(順便說一句,我使用NServiceBus 2.X(Apache許可證版)

問候,

伊利亞斯

+0

這個問題的解決方案是什麼他們嗎?我將IsTransactional設置爲true,但我仍然遇到同樣的問題。 – Castrohenge

回答

4

由於佐賀數據和總線的持續存在。發送將成爲同一交易的一部分我沒有看到競爭條件的任何可能性您是否100%確信數據在回覆到達之前不會持續?

+0

謝謝安德烈亞斯,我正在用IsTransactional(false)配置Nsb。我希望對我的NHibernate事務進行更細化的控制。從你的回答我認爲我需要重新考慮我目前的方法,並開始使用Nsb交易。 – ilias

+1

是的,更好的控制也意味着你需要照顧你自己的細節細節:)喜歡比賽條件例如 –

+0

確實!謝謝你指出我正確的方向。 – ilias