2011-02-04 48 views
0

我將在C#中使用MSMQ來讀取消息;我把它放在Window服務中,OnStart我將開始使用queue.Receive方法讀取消息,這將是阻塞/同步調用。 OnEnd方法我想用queue.Close()停止隊列。 queue.Dispose()。MSMQ C#實現使用服務(ServiceBase)

這種方法有什麼缺點嗎?

感謝 海洋

回答

1

這是一個相當常見的模式,但它有一些缺點。

首先,您應該考慮使用線程池(或4.0中的.NET並行庫)來異步處理您的消息。您的隊列閱讀器是否可以異步取決於您的事務模式。處理是否是原子的?其次,你還應該考慮使用一個定時器(System.Timers.Timer),它在你的OnStart中開始,並在你的OnEnd中結束,並在每個定時器事件中從隊列中讀取一個或多個消息。第三,你應該認真考慮使用WCF MSMQ綁定,它處理了這個東西的很多複雜性。

請參閱:http://jamescbender.com/bendersblog/archive/2009/04/04/the-one-where-i-talk-about-the-msmq-binding.aspx

1

你的方法看起來好像沒什麼問題。我唯一的建議是確保您打算部署Windows服務的每臺計算機都位於同一個域中,或者位於互信域名爲的域中,並且位於相同的林內。我最近遇到了一個問題,那就是我繼承了一個使用MSMQ的解決方案,其工作方式與上面提出的方法大致相同。它被測試爲在沒有性能問題的單個域中工作。不幸的是,客戶正在進行合併,當在整個公司範圍內實施解決方案時,事實證明該解決方案必須在存在於不同森林的不同域中的機器上實施,在這種情況下,MSMQ根本不會工作,完全不得不使用另一種方法。

+0

我假設你的隊列是公開的而不是私人的。專用隊列不關心域/ Active Directory,但驗證訪問這些隊列的權限除外。 – RMD 2011-02-04 20:54:39

+0

「,但驗證訪問這些隊列的權限除外」 - 這是該聲明的關鍵部分。 – Rachel 2011-02-04 21:14:21

2

這是不正確的做法。服務啓動時調用OnStart,應該放置初始化邏輯。例如,啓動線程將在循環中調用Receive