Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检测Azure上的*最后一个*角色实例何时关闭_Azure_Servicebus_Azure Role Environment - Fatal编程技术网

检测Azure上的*最后一个*角色实例何时关闭

检测Azure上的*最后一个*角色实例何时关闭,azure,servicebus,azure-role-environment,Azure,Servicebus,Azure Role Environment,我知道有RoleEnvironment事件用于检测角色实例何时关闭或启动,但是,有没有方法检测最后一个角色实例何时关闭?(即,整个角色正在关闭) 我意识到这在硬件崩溃的实例中并不能完全证明,但当角色被终止时,我需要做一些清理工作,以摆脱不再需要的服务总线订阅。一个想法:如果您的角色实例中有一个OnStop()事件处理程序,您可以枚举该角色的实例(RoleEnvironment.CurrentRoleInstance.Role.Instances)查看它是否是列表中唯一的实例。这可能有点问题,因为

我知道有
RoleEnvironment
事件用于检测角色实例何时关闭或启动,但是,有没有方法检测最后一个角色实例何时关闭?(即,整个角色正在关闭)


我意识到这在硬件崩溃的实例中并不能完全证明,但当角色被终止时,我需要做一些清理工作,以摆脱不再需要的服务总线订阅。

一个想法:如果您的角色实例中有一个
OnStop()
事件处理程序,您可以枚举该角色的实例(
RoleEnvironment.CurrentRoleInstance.Role.Instances
)查看它是否是列表中唯一的实例。这可能有点问题,因为两个实例可能正在处理
OnStop()
同时进行,但至少应该让你朝着正确的方向前进。

注意:这里最初的选择只是理论上的:我没有尝试过

另一个选项是在启动和关闭中包含代码,该代码在包含卷的所有实例名称的BLOB上获取租约。当实例启动时,它将获取租约,并查看列表是否已包含其名称。如果列表没有添加到列表中的实例名称,则保存并释放BLOB上的租约

在关闭时,运行OnStop时的每个实例都可以获取列表,然后删除它自己的名称,还可以使用David提到的RoleEnvironment.CurrentRoleInstance.Role.Instances集合进行快速检查以“清除”任何实例名称现在可能已经死了,但是没有机会清理它们。如果在您完成时列表为空,那么您就是最后一个实例

我仍然认为这不是万无一失的,但至少它解决了David提到的问题,因为一次只有一个客户可以在BLOB上获得租约。它还很大程度上取决于实例集合,而实例集合有时可能会发生变化

在我看来,更好的方法是使用完全超出角色本身的东西,它使用服务管理API来确定角色是否正在运行,如果没有,则执行清理。当然,您需要做一些额外的检查,以确保在删除订阅之前100%确保角色已关闭,正如一些人报告的那样n不时对来自API的数据进行准确/冲突。至少应使用角色本身之外的某种机制向您发出警告,说明您的关闭代码可能不起作用。为您监控Azure服务的某些第三方提供商甚至可以检测到角色已关闭并关闭不要运行脚本