2014-10-29 81 views
0

我正在使用石英創建Windows服務。我想在3個地方部署這個服務,它應該像一個服務停止運行,然後第二個服務應該啓動,如果第二個服務失敗,那麼最後一個應該啓動。所有的服務都指向單個數據庫。我可以知道我該如何執行這些事情。處理多個窗口服務

@@更新問題

那麼,所有的服務都在做同樣的操作。我在我的數據庫中有一列作爲nextExecutionTime,如果超過當前時間,表示下一個服務將開始執行此作業。現在我面臨的主要問題是,如果所有三個服務都會同時觸發,那麼它將從數據庫獲取數據並嘗試同時更新。所以我需要減少併發性錯誤。我可以知道這個解決方案嗎?我是否需要實施一些鎖或類似的東西?

回答

0

這三個服務是否做同樣的工作?請詳細說明 !但是如果我將這些服務部署在不同的系統上,他們是如何意識到彼此的?我不知道你的具體要求,但我會做到這一點,如下所示: 假設:只有一個服務應該在一個時間做的工作休息的服務保持閒置。

我將在某個臨時表中創建一些主列。我將啓動任何一個服務,並將其名稱(pcname或位置名稱)作爲主副本以及此臨時表中的上次訪問時間。

其他服務讀取主人和最後訪問時間。如果最後訪問時間超過當前時間,那麼我認爲這項服務停止工作,所以我做了一些其他服務,這是在主人時間可用,並將他的詳細信息插入臨時表。

+0

問題已更新。 – 2014-11-14 07:43:43

+0

這與我已經應用的邏輯相同,我們有RowVersioning的邏輯,即使這樣做不起作用,它會使用相同的數據在該表中插入多個條目,因爲每個作業都插入它自己的數據。我想我在鎖定特定行時出錯了。 – 2014-11-14 12:14:05

0

我已經看到你的更新question.As我前面說我的答案在你的數據庫中創建一些鎖表,並創建鎖持有人(服務名稱/ pcname/locationname)和lastlockaccess時間戳(此服務lastaccesstime)列。手動插入詳細信息對於任何一項服務並在執行以下任務的每項服務中添加額外代碼:

1>每個窗口服務連接到db並讀取鎖表記錄 2>假設有3個服務即A,B,C並且最初輸入lockholder爲A意味着服務A正在訪問數據庫。 3>當服務B和C檢查鎖定表時,如果服務A的lastlockaccess時間超過當前時間一些大的餘量,則它們將知道A正在DB上工作,則這意味着服務A已停止。因此,爲服務B編程插入新條目並且C持有鎖的任何人都將開始執行。

希望這個解決方案可以幫助你,但它不是完美的解決方案。