2011-11-04 127 views
2

我有一個WCF service可以接收幾個請求/分鐘(或秒),需要寫入信息到數據庫。我不想將這些請求同步寫入,而是將這些請求放在服務器上的某種隊列中,以便另一個進程可以出現並處理它們。客戶只需要確認收到了請求。我讀了很多關於MSMQWCF等的內容,但似乎是用MSMQ從客戶端寫入隊列,而不是寫入Web服務,這不是我想要的。排隊請求與WCF服務

有沒有辦法在不涉及數據庫的WCF方法內執行以下操作。也許我還沒有理解MSMQ的概念吧。

public bool ProcessMessage(string message) 
    { 
     if(IsValid(message)) 
     return AddToQueue(message); 

     return false; 
    } 

編輯:我需要寫入隊列之前驗證消息。

+2

是否有原因讓你不想從客戶端寫入隊列? –

+0

抱歉,忘記提及我需要在寫入隊列之前驗證消息。 –

回答

3

我目前在我創建的應用程序中執行此操作。 WCF服務在IIS上作爲HTTP服務託管。它接受調用和數據包,我接收這些數據,驗證它(告訴調用者它是否錯誤),然後將數據發送到使用netMSMQ綁定的另一個WCF服務,然後該服務將最終寫入數據庫。關於這一點的好處是它將在一個MSMQ上排隊,並且綁定到此MSMQ的WCF服務一次彈出一條消息並對其進行處理。然後,HTTP WCF服務可以處理儘可能多的請求,並且不必擔心集中消息,因爲這是WCF/MSMQ綁定服務的工作。這種模式的通用名稱是一個Bridge框架。

ETA:第二個服務(綁定MSMQ的WCF服務)始終作爲Windows服務運行。它也處理顧慮的分離。 HTTP服務驗證並不關心數據庫,另一個服務處理寫入數據庫的操作。

+0

有沒有辦法做到這一點與單個WCF服務? –

0

使用MSMQ的要點應該是消除您的服務需要擔心排隊任何事情。 MSMQ將保證您的郵件按照正確的順序發送,並且您的服務按照正確的順序處理它們。

如果您正確設置,您的服務不應該維護一個隊列。

+0

好吧,我不想一定要使用MSMQ,一些其他的排隊機制,爲我想要的是很好的。我不希望對MSMQ的客戶端有任何依賴性。客戶端應該只知道WCF服務,因爲它可以是任何平臺。另外,在寫入隊列之前驗證消息就會變得棘手。 –

+0

我真的很喜歡Mark W的回答。我想也許這就是你真正想要的......將排隊中的驗證分開。單一職責原則和所有這一切。 :) –

+0

MSMQ仍然支持?我覺得這是一種不再使用的舊技術。這種模式能夠真正幫助我們的團隊努力實現。我們希望我們的web服務能夠接受請求,並且我們希望我們的代理爲這些請求訪問和更新數據庫,但我們很難找到一種線程安全的方式來完成這項任務。 – SoftwareSavant