我知道有RoleEnvironment
个事件用于检测 角色实例何时关闭或启动,但是,有没有办法检测最后角色实例关闭? (即整个角色正在关闭)
我意识到在硬件崩溃的情况下这不会是完全证明,但是当一个角色被终止以摆脱不再需要的Service Bus订阅时,我需要做一些清理工作。
答案 0 :(得分:1)
一个想法:如果您的角色实例中有OnStop()
个事件处理程序,则可以枚举角色的实例(RoleEnvironment.CurrentRoleInstance.Role.Instances
)以查看它是否是列表中唯一的实例。这可能有点问题,因为两个实例可能同时处理OnStop()
,但它至少应该让你朝着正确的方向前进。
答案 1 :(得分:1)
注意:这里的初始替代方案仅限于理论:我没有尝试过。
另一种选择是在启动和关闭时使用代码获取包含卷的所有实例名称的BLOB的租约。当实例启动时,它会获得一个租约并查看列表是否已包含它的名称。如果列表没有实例名称,它将添加到列表中,保存然后在BLOB上释放租约。
在运行OnStop时关闭每个实例可以获取列表,然后删除它自己的名称,同样,它可以使用David提到“清理”的RoleEnvironment.CurrentRoleInstance.Role.Instances集合进行快速检查。任何可能已经死亡但没有机会自行清理的实例名称。如果列表在您完成时为空,那么您就是最后一个实例。
我仍然认为这不是万无一失的,但至少它解决了大卫提到的问题,因为只有一个客户可以在BLOB上一次获得租约。它还在很大程度上取决于Instances集合,它有时可能会不断变化。
在我看来,更好的方法是使用完全在角色本身之外的东西,使用服务管理API来确定角色是否正在运行,如果没有,则执行清理。当然,在删除订阅之前,您需要做一些额外的检查以100%确定角色已关闭,因为有些人不时会报告来自API的不准确/冲突的数据。至少应该使用角色本身之外的某种机制来向您发出警告,告知您关闭的代码可能无法正常工作。有些第三方提供商会为您监控您的Azure服务,甚至可以检测到该角色已关闭并让您运行脚本。