2010-10-29 60 views
0

嘿 我遇到以下情況:WinService正在處理隊列中的某些內容,寫入其他表(在處理過程中)以及完成後它刪除條目並移動到下一條。如何確定服務的一個實例已關閉並啓動新實例

我需要一種機制來確定實例是否正在運行,如果不啓動或喚醒第二個實例。

我到目前爲止想過的是有兩個實例,每個嘗試從隊列中拾取東西並處理它(嘗試 - 如看看它是否可以 - 例如沒有設置keepAliveFlag或lastUpdateDate記錄太久以前)。當他們處理相同的記錄時可能會出現這種情況 - 這是缺點。

對於上面提出的這個解決方案,當實例試圖寫一個keepAliveFlag並且不能成功停止時,我還需要一種機制。

除了這個解決方案,還有一個解決方案,讓實例不斷寫入數據到db中,第二個實例檢查是否寫入新東西,如果沒有喚醒或啓動第二個實例。但是可能會出現幾個問題:如果前主人醒來會發生什麼?一般而言,第二種情況似乎難以正確實施。

現在的問題是:什麼纔是正確的模式來實現呢?

+0

我會問一個關於您的數據庫訪問模式的單獨問題 - 上面的標題不會從正確的人獲得關注。這真的是兩個不同的問題,是嗎? – 2010-10-29 13:32:54

回答

0

我的球隊之一呢,此刻這是什麼:

  • 在每臺計算機上安裝一個監視器(本身就是一個Windows服務)的一個實例。
  • 此監視器讀取(從中央數據庫)它應監視的列表local services
  • 它還讀取正在監視的每個本地服務的工作/非工作時間。
  • 然後它監視每個服務的定期心跳(和其他狀態消息)。
  • 如果本地服務在工作時間內未啓動,則顯示器將啓動它。
  • 如果本地服務正在運行但不是心跳,監視器將重新啓動它。
  • 監視器在數據庫中記錄每個服務的狀態,並根據需要發送信息/警告/警報消息。
1

服務在Windows系統中是單例。支持多個實例的唯一方法是安裝具有不同服務名稱的多個相同的二進制文件。

您可以使用[ServiceController][1]類,使用其Status property來監視任何給定服務的狀態,以確定當前狀態並採取相應措施。

+0

現在我一遍又一遍地想,問題在於我在考慮在兩臺獨立的機器上安裝兩個實例,以防出現硬件故障問題,因此我們再次回到2個獨立運行的實例機。如果一個人死亡或空閒,並從另一臺機器啓動或激活另一個機器,那麼設計模式會是什麼?對不起,誤導,但我不太清楚必須考慮哪些事情。硬件故障就是其中之一。謝謝 – Elena 2010-11-01 08:12:29

+0

@MadalinaA - 你可以使用'System.Management'來構建一些東西,但在這種情況下,我傾向於使用'ServiceController.Status'定期輪詢實例以確保它們仍然存在。如果沒有,你可以做任何你想補救的事情。如果您希望對停電事件做出最快反應,那麼通過WMI實施事件驅動的方法將更可取,但難度更大。 – 2010-11-01 13:20:15