[英]Extend timeout for graceful shutdown in Azure App Service
我正在使用IHostApplicationLifetime.ApplicationStopping.Register()
注冊一種方法,以便在使用 Azure 門戶中的停止按鈕停止時正常關閉 Azure 應用程序服務(.NET 6.0、Windows 64 位、托管管道版本:“集成”)。 出於測試目的,我在回調方法中添加了以下循環來模擬緩慢關機:
for (int i = 0; i < 300; i++) // wait 5 mins
{
Thread.Sleep(TimeSpan.FromSeconds(1));
Console.WriteLine($"Waited {(i + 1) * 1} s.");
}
在Azure Portal的App Service頁面點擊停止按鈕正確調用了回調,但仍然在大約30s后殺死了進程,從日志中可以看出。 期望的行為是在進程退出之前看到 output 中記錄的完整 300 秒。
在Program.Main
中增加關閉超時:
WebHost.CreateDefaultBuilder(args)
.UseShutdownTimeout(TimeSpan.FromMinutes(10)) // give enough time for graceful shutdown
.UseStartup<Startup>();
在web.config
中增加關機時間限制:
<aspNetCore shutdownTimeLimit="600" processPath=".\MyService.exe" hostingModel="inprocess" />
這些解決方案均無效。
我幾乎可以肯定該系統不是為您簡單地放置一個在關機時停止的循環而設計的。 它會在某個時候意識到完成線程沒有意義,並終止它。
嘗試制作一個響應時間較長的 API,或者其他不是簡單循環的東西。 然后改用它。
您決定在這里嘗試的是浪費資源,並且沒有適當的過程文檔; 您應該嘗試其他方法,如果問題仍然存在,請提出問題。
有一天我遇到了同樣的問題,並通過配置托管服務解決了這個問題。 使用此代碼:
WebHost.ConfigureServices((hostContext, services) => {
services.Configure<HostOptions>(options => options.ShutdownTimeout = TimeSpan.FromSeconds(600));
});
如果刪除它,請添加此代碼:
WebHost.CreateDefaultBuilder(args)
.UseShutdownTimeout(TimeSpan.FromMinutes(10))
.UseStartup<Startup>();
您可以在此處嘗試答案。 IApplicationRuntime
注入您的Configure
方法並在其中使用以下行:
applicationLifetime.ApplicationStopping.Register(OnShutdown);
在方法OnShutdown
中,您可以完成緩慢的工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.