2011-06-21 12 views
2

NServiceBusサガを使用しているときに競合状態に遭遇しています。NServicebusサガ競争条件

問題は、私は佐賀から派生するクラスを持っているthis-

で、IAmStartedByMessagesを実装し、SQL Serverでサガデータを永続化します。このサガは、着信メッセージを処理し、新しいメッセージを作成し、別のサーバーに送信します。このサーバーは、メッセージを処理し、応答を返します。この返信メッセージは、次の段階のサガ処理として処理されます。私はマッピングを設定するためにsaga 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

このproblの解決策は何ですか?そう?私はIsTransactionalをtrueに設定していますが、私はまだ同じ問題を経験しています。 – Castrohenge

答えて

4

を使用しています。返信が到着する前にデータがパースされていないことを100%保証していますか?

+0

ありがとうAndreas、私はIsTransactional(false)でNsbを設定しています。 NHibernateのトランザクションをより詳細に制御したいと思っていました。あなたの答えから、私は現在のアプローチを考え直し、Nsbトランザクションを使い始める必要があると思います。 – ilias

+1

はい、より良いコントロールはまた、あなた自身のナッツ砂の細かい細部の世話をする必要があることを意味します:)例えば、競争条件のように –

+0

確かに!正しい方向に私を指摘してくれてありがとう。 – ilias

関連する問題