2010-06-04 76 views
2

我在困境中是否爲我的應用程序使用Windows服務,下面是關於我的應用程序的描述,請任何人都可以建議什麼是我的需求的最佳方法,如果可能與專業人士和也是如此。Windows服務或任何其他替代

有一個應用程序「A」,它是一個封閉的應用程序,我需要從該應用程序獲得的任何數據僅通過WCF服務公開。我的應用程序「M」必須調用由「A」公開的WCF服務之一,然後獲取數據並處理它並丟棄文件。同樣,如果某些文件被注入我的應用程序「M」,那麼我需要處理它並使用其WCF服務將該信息推送到應用程序「A」中。這是簡要的要求。

problems-

1)這裏我的應用程序「M」需要不間斷的調查申請「A」 WCF服務來檢查,如果事情是availabel它處理。我不喜歡投票,但有其他選擇,請提出建議。 我想到了MSMQ,每當有新數據進入時,應用程序「A」都會向我的應用程序「M」發送消息。然後,我的應用程序「M」處理來自隊列的消息。不知道該怎麼做。請告知這是否正確。

2)另一件事是,如果一個新文件進入某個服務器文件夾,那麼我的應用程序「M」必須將其接收並處理並將其發送到應用程序「A」。所以爲了實現這個目標,我可能必須有一個文件系統監視器,只要有東西可用,就必須啓動我的應用程序。再次敲擊使用什麼技術(僅在.Net中)。 MSMQ最好的方法是?

所以,現在我需要用哪些技術(只有在.Net中)纔能有效地完成我的需求。通過不斷輪詢應用程序「A」並與其一起實施MSMQ,是Windows服務的最佳方法。請指教。

在此先感謝
西

+0

WCF具有可用於代替輪詢的回調​​接口。 – 2010-06-04 16:20:59

+0

感謝亞歷克斯,你能提供一些關於回調接口的更多細節..你的意思是雙工綁定? – Sai 2010-06-04 16:24:00

回答

0

對於要求1,我會使用通過Windows進程激活服務託管的WCF服務(WAS) - 看到MSDN reference。這需要WAS(Windows Vista/7或Windows Server 2008/2008R2),但是,如果這些不可用,那麼定期的NT服務將是適當的後備。

對於需求2,可以實現使用FileSystemWatcher類的NT服務(MSDN reference)。

所以,你可以實現一個單一的NT服務與FileSystemWatcher的輪詢線程,或者你可以同時實現NT服務與FileSystemWatcher的,並且通過MSMQ監聽一個單獨的WAS託管WCF服務。

後者或許有點清潔,因爲它遵循分離關注原則。但只有當應用程序「A」可以配置爲通過MSMQ發送消息(即,您的服務「M」將成爲「服務器」並且應用程序「A」將充當客戶端)。所以,前一種選擇(單一的NT服務可以做到這一點)可能會更好地適應你的情況,但我不完全確定你對「A」的描述。

至於發送消息應用程序「A」,MSMQ可能是也可能不是合適的選擇。兩個應用程序都在同一臺機器上嗎?然後使用命名管道。他們在不同的機器上?如果應用程序「A」始終在運行(即正在運行的服務),則使用TCP綁定,但如果需要保證傳遞消息並且應用程序「A」可能在應用程序「M」正在發送時偶爾脫機,則使用MSMQ綁定它的消息。(另外請注意,使用MSMQ要求將MSMQ Windows組件安裝在接收機上。)

+0

謝謝Ton Lars的回覆!我一定會探索WAS選項並檢查是否適合我。所以對於要求2,那麼我很好用NT服務。關於您的最後一段 - 將消息發送到應用程序「A」 - 是否意味着將消息發送到應用程序「M」?因爲我不會將消息發送到應用程序「A」。我的應用程序「M」將調用應用程序「A」公開的wcf服務來推送它從文件系統監視程序獲得的已處理數據。 關於應用程序「A」 - 它是一個silverlight 2應用程序,並具有wcf服務來獲取和更新某些數據到應用程序中。 – Sai 2010-06-04 17:19:16

+0

我想我們在談論同樣的事情。 :)「發送消息到」和「呼叫」是等同的。 – 2010-06-04 17:21:31

+0

我在想「A」是一個沒有msmq的常規wcf服務,所以應該清除發送(調用)「A」服務方法的問題。 – Sai 2010-06-04 17:30:11

0

聽起來像選項A是不可變的,因此您無法更改它。 (「關閉」)

應用程序M應該是一個windows服務,正如Lars所描述的。但是,不要使用文件系統監視器,除非您稍後想要剔除代碼並用輪詢機制替換它。最好的辦法是啓動一個線程來輪詢應用程序A,另一個線程輪詢文件系統。

投票沒有問題。使用Thread.Sleep(10),你會沒事的。 FileSystemWatcher經常會給你一個'已被修改'但尚未完成寫入的文件。這會導致你得到一個截斷的文件。

不要打擾MSMQ,除非你絕對需要。這只是另一個維護,並且不能處理複雜的檢索操作。

+0

謝謝stingyjack!點指出.. MSMQ是一個頭痛,只有當沒有其他選擇時去... ...你提到,輪詢是不是一個問題..如果somthing調查服務每5分鐘左右,它不會導致服務器上的開銷? – Sai 2010-06-04 17:26:57

+0

對於忽略FileSystemWatcher我會傾向於不同意......我沒有提及過早提及的經驗,但我懷疑它可能是文件寫入方式的一種症狀。 – Reddog 2010-06-04 17:26:57

+0

這是關於FileSystemWatcher的公正警告 - 只有在知道文件的源代碼將以原子方式(一次全部)將其置於該目錄中時才使用它。如果文件將逐個寫入,並且在文件真正「完成」之前保存多個片段,那麼您將需要不同的機制來告訴您文件是否「完成」。例如,我經常看到的一種做法是,一旦確保完全寫入,將文件從「* .temp」重命名爲其最終擴展名。 – 2010-06-04 17:28:16

相關問題