NServicebus传奇赛况

时间:2011-06-21 13:15:53

标签: nservicebus

我在使用NServiceBus传奇时遇到了竞争条件。

问题是这个 -

我有一个派生自Saga的类,实现了IAmStartedByMessages并在sql server中保存了saga数据。此saga处理传入消息,创建新消息,将其发送到另一台服务器。此服务器处理消息并发回响应。然后将此回复消息作为saga处理的下一阶段处理。我正在使用saga id来配置映射。

当saga数据之前的回复消息已保存到数据库时出现问题。 由于尚未保存传奇数据,因此映射失败并且消息丢失。

为了说明下面的例子,假设我让这些处理程序监听不同的端点,我在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许可证版本)

此致

伊利亚斯

1 个答案:

答案 0 :(得分:4)

由于saga数据和bus.send的持久化将成为同一事务的一部分,因此我认为没有竞争条件的任何可能性。您是否100%确定在回复到来之前数据未被保留?