2011-01-19 76 views
4

我正在開發一個示例應用程序來測試使用NserviceBus的saga中的超時管理。NServiceBus TimeOut Manager

我試着實現以下

當一個傳奇開始設置它的超時時間爲1分鐘 超時之前發生,如果更新來到nessage 我的代碼是像下面

更新超時5分鐘
public class OrderSaga : Saga<OrderSagaData>, 
     IAmStartedByMessages<SampleMessage>, 
     IHandleMessages<UpdateMessage> 
    { 
     public override void ConfigureHowToFindSaga() 
     { 
      ConfigureMapping<UpdateMessage>(s => s.PurchaseOrderNumber, m => m.Update); 
     } 

     public void Handle(SampleMessage message) 
     { 
      this.Data.PurchaseOrderNumber = message.Name; 
      RequestTimeout(DateTime.Now.AddMinutes(1), message.Name); 
     } 


     private void Complete() 
     { 
      MarkAsComplete(); 
     } 

     public override void Timeout(object state) 
     { 
      Complete(); 
     } 


     #region IMessageHandler<UpdateMessage> Members 

     public void Handle(UpdateMessage message) 
     { 
      this.Data.PurchaseOrderNumber = message.NewValue;  
      RequestTimeout(DateTime.Now.AddMinutes(5), message.Update); 
     } 

     #endregion 
    } 
} 

但是,這裏的問題是超時沒有更新到5分鐘。超時仍然適用於1分鐘。

您能否讓我知道這裏做錯了什麼?

由於提前, Ajai

回答

4

佐賀超時無法更新。無論你做什麼,他們都會開火。在你的情況下,你會收到兩個超時,並給你在超時處理程序中調用完成你的傳奇將在一分鐘後結束。你需要添加一些邏輯來考慮這一點。

像這樣的東西可能會做到這一點:

 
if(!updateReceived or state == ThisTimeoutWasRequestedByMyUpdateHandler) 
    Complete(); 

希望這有助於!

+0

嗨安德烈亞斯,感謝您的快速回復。我給了MarkComplete那裏因爲我預計5分鐘後完成的傳奇。解決方案還提供了將創建一些問題,如果我更新值超過兩次,因爲它可以上升到n級更新。那麼,如何保持saga db這樣的更新數呢? – Ajai 2011-01-19 08:39:18