|
3 | 3 | using System.Threading.Tasks; |
4 | 4 | using Microsoft.Extensions.Diagnostics.HealthChecks; |
5 | 5 | using Microsoft.Extensions.Hosting; |
| 6 | +using Microsoft.Extensions.Logging; |
6 | 7 |
|
7 | 8 | namespace blog_zero_downtime_with_health_checks |
8 | 9 | { |
9 | 10 | public class ShuttingDownHealthCheck : IHealthCheck |
10 | 11 | { |
| 12 | + private readonly IHostEnvironment _hostEnvironment; |
| 13 | + private readonly ILogger<ShuttingDownHealthCheck> _logger; |
| 14 | + |
11 | 15 | private HealthStatus _status = HealthStatus.Healthy; |
12 | 16 |
|
13 | | - public ShuttingDownHealthCheck(IHostApplicationLifetime appLifetime) |
| 17 | + public ShuttingDownHealthCheck( |
| 18 | + IHostApplicationLifetime appLifetime, |
| 19 | + IHostEnvironment hostEnvironment, |
| 20 | + ILogger<ShuttingDownHealthCheck> logger) |
14 | 21 | { |
| 22 | + _hostEnvironment = hostEnvironment; |
| 23 | + _logger = logger; |
| 24 | + |
15 | 25 | appLifetime.ApplicationStopping.Register(() => |
16 | 26 | { |
17 | | - Console.WriteLine("Shutting down"); |
18 | 27 | _status = HealthStatus.Unhealthy; |
| 28 | + |
| 29 | + // We don't need to block on developer machines as there's no load balancers involved there. |
| 30 | + bool delayShutdown = _hostEnvironment.IsProduction(); |
| 31 | + if (delayShutdown) |
| 32 | + { |
| 33 | + var shutdownDelay = TimeSpan.FromSeconds(25); |
| 34 | + _logger.LogInformation("Delaying shutdown for {Seconds} seconds", shutdownDelay.TotalSeconds); |
| 35 | + |
| 36 | + // ASP.NET Core requests are processed on separate threads, so we can just put the main thread on sleep. |
| 37 | + Thread.Sleep(shutdownDelay); |
| 38 | + |
| 39 | + _logger.LogInformation("Shutdown delay completed"); |
| 40 | + } |
19 | 41 | }); |
20 | 42 | } |
21 | 43 |
|
|
0 commit comments