天蓝云服务OnStop()和RoleEnvironmentStopping未调用缩放

时间:2014-02-11 17:53:58

标签: azure azure-web-roles

我有一个Azure云服务Web角色,需要在启动时调用REST服务,然后关闭以在启动时使用代理服务器注册角色实例并在停止时将其删除。我重写OnStart()和OnStop()方法来添加调用,它在所有实例中按预期工作,除非缩小。停止云服务或重新启动角色实例时,OnStop()方法中对REST服务的调用将成功运行并完成。向上扩展时,OnStart()方法运行,对REST服务的调用向代理注册新角色实例。但是,缩小时,看起来OnStop()方法永远不会运行。我也尝试使用RoleEnvironmentStopping事件处理程序,因为它没有时间限制但结果是相同的。在缩放操作期间,我找不到Microsoft关于角色实例的确切生命周期的任何详细文档。当我查看我的虚拟网络时,看起来角色实例在vm被销毁之前已经删除了它的ip地址。在扩展期间,当调用OnStop()方法时,角色实例没有网络访问权限是否有意义?还有其他地方我可以/应该做这次清理吗?

1 个答案:

答案 0 :(得分:1)

在缩小操作期间会调用OnStop。通常当我看到这种问题时,由于OnStop中的代码将日志记录写入诊断程序(即Diagnostics.Trace行),但Windows Azure诊断程序没有足够的时间在VM关闭之前将诊断数据传输到存储下。这使得看起来OnStop没有被调用,但实际上只是日志没有被存储。

有几种方法可以验证这一点:

  1. 在OnStop中手动将内容写入存储。您可以向队列添加消息,向表中写入条目等等。
  2. 在OnStop中强制进行按需诊断传输。您可以在http://www.packtpub.com/article/digging-into-windows-azure-diagnostics-tutotial的RequestOnDemandTransfer()函数中看到示例代码。
  3. 连接调试器并在OnStop方法上设置断点。如果您使用的是SDK 2.2,则可以使用Visual Studio中的Server Explorer工具中的远程调试器功能。如果您不是,那么您将需要在VM本身上使用WinDBG。