2012-12-21 72 views
4

我很好奇,如果MassTransit消費者可以真實的檢索味精之前PEEK()一個MSMQ隊列。Masstransit消費者死亡 - 皮克()

什麼步驟/過程是:

1)消息發送到隊列

2)消費者得到它,必須做一個數據庫更新 - 大約需要5秒鐘

3)消費者必須做第二輪更新如果第一次工作。

我的問題是,我該怎麼處理的情況下,如果第一DB更新失敗的消息停留在隊列(即網絡問題,無法得到分貝)。

目前只要它讀取它消除它,如果數據庫的更新失敗,那麼它只是消失在隊列中的味精..

此外,我怎麼能處理停電 - 我的意思是,如果一半通過「工作」,由消費者,不管它是什麼(DB更新或別的東西)和功率等死,我怎麼能在隊列中的味精重新運行的過程?讓我們說這份工作(無論如何,我目前的實例)正在推動一個新的表格。我的意思是,我可以編寫代碼來第一次檢查,如果該行是存在的,如果是則丟棄該消息,如果沒有的話運行任務,但我怎樣才能在第一時間就重新運行的全過程?

我已經讀了,我可以Peek()隊列,然後運行任務,然後閱讀真正的隊列消息,並刪除它,但我不能爲我的生活弄清楚,如果這與公共交通的工作... ...有點失落......

另外據我所知,Masstransit具有.RetryLater卻對我使用的過程中?它是Initially - >When - >Then - >.RetryLater的傳奇?

任何指針將appeciated

最親切的問候 羅賓

編輯

PS:我用的是傳奇....

Define(() => 
      { 
       RemoveWhen(saga => saga.CurrentState == Completed); 

       Initially(
        When(NewAC) 
         .Then((saga, message) => saga.ProcessPSM(message), 
          InCaseOf<Exception>() 
           .TransitionTo(Problem)         
           ) 
         .Then((saga, message) => saga.PostProcessPSM()) 
         .Complete() 
        ); 
       During(Problem, 
        When(Waiting) 
           // NOTE: THIS DOES NOT WORK!!!! 
         .RetryLater() 
        ); 
       }); 

的RetryLater拋出的錯誤:

「該消息不能由現有的傳奇接受的」 10

我不知道我還能怎麼訪問「RetryLater」。

回答

7

MassTransit抽象底層隊列的概念。所以Peek並不是解決方案,但它確實有其他方法來重試消息。如果您只是對處理錯誤和故障條件感興趣,以下機制就足夠了。

默認情況下如果消費者拋出異常的消息將被重試N次:

  • 其中n是總線,默認上配置爲5。它可以在 改變總線initilisation使用的ServiceBusConfigurator SetDefaultRetryLimit
  • 凡重試意味着信息將被添加到隊列

結束時,如果你想更細粒度的方法錯誤處理,你可以實現一個上下文消費者,捕獲可恢復或暫時的異常並手動調用RetryLater。根據我的理解,這可以做多少次沒有限制。

public class RetryConsumer : Consumes<AwesomeMessage>.Context 
{ 

    public void Consume(IConsumeContext<AwesomeMessage> message) 
    { 
     try 
     { 
      Console.WriteLine("This is Attempt " + message.RetryCount); 
      // Do Something 
     } 
     catch (SomeTransientException e) 
     { 
      message.RetryLater(); 
     } 
    } 
} 
+0

謝謝隊友。今天我會試一試。然而,我的問題在一個案例中仍然存在。如果在權力的一半中死去會怎麼樣?味精不再在隊列中。所以它失去了是的?因爲消費者永遠不會去'message.retrylater()'...有沒有辦法處理掛起的進程或完成的失敗,就像在那種情況下稍後重試消息一樣?還是我錯過了上面的東西?謝謝! –

+0

您始終可以使用MSMQ的事務隊列,這可以確保在電源故障情況下郵件不會丟失。在URI上的tx = true可以讓你在那裏。 –

+0

@ChrisPatterson是的,我已經在使用它。我不認爲這包括閱讀信息的情況。我認爲這只是保證,如果你'添加'到隊列中,它保證進入隊列,然後因爲可恢復設置爲真,持久。但是,事務設置是否也確保當我從隊列中讀取消息時,讀取​​它的進程完成其工作?我認爲不是或...? –

相關問題