我很好奇,如果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」。
謝謝隊友。今天我會試一試。然而,我的問題在一個案例中仍然存在。如果在權力的一半中死去會怎麼樣?味精不再在隊列中。所以它失去了是的?因爲消費者永遠不會去'message.retrylater()'...有沒有辦法處理掛起的進程或完成的失敗,就像在那種情況下稍後重試消息一樣?還是我錯過了上面的東西?謝謝! –
您始終可以使用MSMQ的事務隊列,這可以確保在電源故障情況下郵件不會丟失。在URI上的tx = true可以讓你在那裏。 –
@ChrisPatterson是的,我已經在使用它。我不認爲這包括閱讀信息的情況。我認爲這只是保證,如果你'添加'到隊列中,它保證進入隊列,然後因爲可恢復設置爲真,持久。但是,事務設置是否也確保當我從隊列中讀取消息時,讀取它的進程完成其工作?我認爲不是或...? –