2012-12-31 26 views
3

我知道,有RoleEnvironment事件檢測時一個角色實例被關閉或啓動,但是,有沒有辦法來檢測最後角色實例關閉時下? (即整個角色正在關閉)檢測現價*時*角色實例關閉在Azure上

我意識到這不會在硬件崩潰的情況下得到全面的證明,但是當角色被終止以消除不再需要的服務時,我有一些清理工作要做。巴士訂閱。

回答

1

一個想法:如果在角色實例中有一個OnStop()事件處理程序,則可以枚舉角色的實例(RoleEnvironment.CurrentRoleInstance.Role.Instances)以查看它是否是列表中唯一的實例。這可能會帶來一些問題,因爲兩個實例可能同時處理OnStop(),但至少應該讓您朝着正確的方向前進。

1

注意:這裏的初始選擇僅限於理論:我沒有嘗試過。

另一種選擇是讓代碼在啓動和關閉時獲得包含卷的所有實例名稱的BLOB的租約。當一個實例啓動時,它獲得一個租約並查看該列表是否已經包含它的名字。如果列表沒有添加到列表的實例名稱,則保存並釋放BLOB上的租約。

在運行OnStop時關閉每個實例都可以獲取列表,然後刪除它自己的名稱,並且可以使用David提到的「清理掉」的RoleEnvironment.CurrentRoleInstance.Role.Instances集合進行快速檢查「任何可能已經死亡但沒有機會自行清理的實例名稱。如果在完成時列表爲空,那麼您是最後一個實例。

我仍然認爲這不是傻瓜證明,但至少可以解決David提到的擔憂,因爲只有一個客戶端可以在BLOB上一次獲得租約。它仍然在很大程度上依賴於Instances集合,這些集合有時可能會變得不穩定。

在我看來,更好的方法是在角色本身之外完全使用服務管理API來確定角色是否正在運行,如果不是,則執行清理。當然,你需要做一些額外的檢查,在刪除訂閱前100%確定角色已關閉,因爲有些人不時報告來自API的不準確/衝突的數據。至少應該使用角色以外的某種機制來爲您提供警告,說明您關閉的代碼可能不起作用。某些第三方提供商爲您監控Azure服務甚至可能能夠檢測到已關閉的角色並讓您運行腳本。