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