2009-09-02 105 views
2

我們正在從MSMQ讀取數據的MVC應用程序。 我們試圖找出一種方法來從隊列中讀取消息,並且只有當用戶在隊列上成功完成操作時才從隊列中刪除消息。 消息應保留在隊列中,直到用戶完成處理爲止,只有處理消息對象的用戶完成了操作之後,該消息纔會對其他人可用。僅當用戶進行某些操作時才從隊列中刪除消息

是否有Message對象的屬性設置爲Peeked,它將不允許再次讀取此消息,直到ether被放回隊列或從隊列中移除爲止?

我們不確定在這種情況下使用MSMQ是否是一個好主意?

+0

這是類似的東西,我設置。我描繪它的方式是將項目添加到隊列中(隊列是數據庫表),然後當它們被進程拾取時,它們被標記爲「正在處理」並且已加時間戳,並且它們保留在表。一旦該過程完成,它將從該表中移除該項目。要從任何崩潰或孤立項目中恢復,另一個進程每分鐘都會出現,並清除任何時間戳超過15分鐘的「正在處理」標誌 - 比完成實際需要的時間更長。這就像你的建議? – SqlRyan 2009-09-02 21:14:08

+0

這就是我正在尋找的。另外如果進程不能夠成功完成,則應該將消息添加回隊列或者消息應該標記爲可在稍後階段被拾取。你能否建議如果在這種情況下使用MSMQ是一個不錯的選擇。您能否讓我知道您在設置中使用了什麼? – Balaji 2009-09-02 21:31:39

回答

1

聽起來你需要在交易模式下使用你的隊列。然後,您的客戶端可以收到一條消息,對其進行處理,然後提交該事務,此時郵件將最終出列。但是,在事務處於活動狀態時,其他客戶端將看不到該消息 - 它將保留在事務完成或中止之前。

這MSDN文章有使用模式的可靠消息傳遞一個體面的概述與MSMQ:

http://msdn.microsoft.com/en-us/library/ms978430.aspx

+0

在這種情況下,我將不得不將事務對象傳遞給UI層。這樣做是個好主意嗎?我們從未使用過MSMQ交易,因此任何投入都對我們有很大的幫助。 – Balaji 2009-09-03 08:42:39

+0

不知道更多關於您的應用程序的信息,我無法確定是否將事務邏輯放入您的視圖層是一個好主意,但我通常會建議您不要這樣做。 – rcoder 2009-09-03 16:59:37

+0

在我們的應用程序中,我們正在閱讀隊列中的消息。 消息對象顯示在用戶的視圖上。 用戶可能會更改保存時的值。 此時該消息被放置在另一個隊列中。 我們希望確保消息在從隊列中讀取數據並執行保存操作(由用戶觸發)的過程中不會丟失。 如果在這種情況下使用交易適合您,您能否建議? – Balaji 2009-09-03 22:54:28

0

隊列是正確的想法。 「把它放在隊列中,鎖定但仍然可用」的方法是錯誤的。

您可能需要多個隊列。

  1. 過程A排入東西在隊列從隊列1 1

  2. 方法B出列並開始工作。

    • 如果B成功,就是這樣。

    • 否則,它會在其他地方(可能是相同的隊列,或者可能是隊列2)排隊等待後續工作。

如果回到了隊列1,B會再次找到它,最終。如果它去了另一個隊列,那麼另一個進程會清理,記錄,錯誤修正或其他任何事情,可能會把東西放回隊列1.

隊列不是數據庫 - 沒有任何有狀態的看着我,我正在處理「)。

隊列是瞬態存儲。有人寫道,別人讀到,就是這樣。


如果你想可靠性,請閱讀本:http://msdn.microsoft.com/en-us/library/ms978430.aspx

這:http://blogs.msdn.com/shycohen/archive/2006/02/20/535717.aspx

這:http://www.request-response.com/blog/PermaLink,guid,03fb0e40-b446-42b5-ad90-3be9b0260cb5.aspx

可靠性是隊列的功能,而不是你的應用程序。你可以做一個「可恢復的閱讀」。這是隊列API的一部分。

+0

如果您反對「將其留在隊列中,但將其鎖定」方法,那麼在處理器停止工作的情況下,如何處理應用程序崩潰或連接丟失?我擔心我已經從隊列中刪除的項目,以便我可以處理這些項目,如果它沒有完成,它們將永遠不會將它重新放入隊列中。我可以編寫異常代碼並處理崩潰,但是我恐怕會錯過一些邊緣案例。 – SqlRyan 2009-09-02 21:20:44

+1

這正是我們遇到的問題。一旦我們從隊列中讀取消息,我們如何確保消息不會丟失。 – Balaji 2009-09-02 21:34:52

相關問題