4

我正在将一些后台处理从 Azure Web 角色转移到辅助角色。我的工人需要每分钟左右完成一项任务,可能会产生任务:

while(true){
    //start some tasks

    Thread.Sleep(60000);
}

一旦我部署,它将永远开始运行。那么稍后,当我重新部署时,Azure 如何停止我的重新部署进程?

它会立即杀死它吗?有没有办法得到它正在关闭的警告?我只需要确保一切都是事务性的吗?

4

1 回答 1

10

当一个角色(worker 或 web)被要求正常关闭时(因为它正在缩小或因为您要求重新部署),将调用RoleEntryPoint类的 OnStop 方法。这是具有 Run 方法的同一类,该方法可能包含您的循环或调用包含该循环的代码。

这里需要注意几点: OnStop 有 5 分钟的实际停止时间,之后该进程被简单地终止。如果您必须调用其他东西来异步关闭,您将需要 OnStop 中的线程一直忙于等待,直到其他进程关闭。一旦执行离开 OnStop,平台就会假定机器可以关闭。

如果您需要正常停止处理但不需要关闭机器,那么您可以在服务配置文件中放置一个设置,您可以更新该设置以指示应该完成的工作或注意。因此,例如一个布尔值,上面写着“ProcessQueues”。然后在 RoleEntryPoint 的 onStart 中挂钩RoleEnvironmentChanging事件。然后,您的事件处理程序会查找要发生的 RoleEnvironmentConfigurationSettingChange,然后检查 ProcessQueues 布尔值。如果为真,则启动或继续处理,如果为假,则优雅地停止处理。然后,您可以进行配置更改以控制事情何时运行。这是处理此问题的一种选择,还有更多取决于您需要多快停止处理等。

于 2012-09-30T15:53:05.430 回答