68 lines
2.1 KiB
C#
68 lines
2.1 KiB
C#
using System.Net.Sockets;
|
|
|
|
namespace Dlhis.Middle.Services.Implements;
|
|
|
|
public class HealthCheckService : IHealthCheckService
|
|
{
|
|
private bool _isOffline;
|
|
private readonly string _hostName;
|
|
private readonly ILogger<HealthCheckService> _logger;
|
|
private int _successRetry;
|
|
private int _retry;
|
|
|
|
public HealthCheckService(ILogger<HealthCheckService> logger, IConfiguration configuration)
|
|
{
|
|
_logger = logger;
|
|
_hostName = configuration.GetSection("HostName").Value;
|
|
}
|
|
|
|
public bool GetIsOffline()
|
|
{
|
|
return _isOffline;
|
|
}
|
|
|
|
public async Task DoHealthCheckAsync()
|
|
{
|
|
var cancellationTokenSource = new CancellationTokenSource(1000);
|
|
var tcpClient = new TcpClient();
|
|
|
|
try
|
|
{
|
|
_logger.LogDebug("tcp connecting {host} {port}", _hostName, 443);
|
|
await tcpClient.ConnectAsync(_hostName, 443, cancellationTokenSource.Token);
|
|
_retry++;
|
|
_logger.LogDebug("retry {retry}", _retry);
|
|
if (tcpClient.Connected)
|
|
{
|
|
_successRetry++;
|
|
_logger.LogDebug("success connected {count}", _successRetry);
|
|
if (_successRetry == 4)
|
|
{
|
|
_isOffline = false;
|
|
_successRetry = 0;
|
|
_retry = 0;
|
|
_logger.LogInformation("current is {status}", "healthy");
|
|
}
|
|
else
|
|
{
|
|
_logger.LogDebug("wait next check in {waitTime}", _successRetry * 1000);
|
|
await Task.Delay(_successRetry * 1000, cancellationTokenSource.Token);
|
|
}
|
|
}
|
|
else
|
|
{
|
|
_successRetry = 0;
|
|
_isOffline = true;
|
|
_logger.LogDebug("current is {status}", "unavailable");
|
|
await Task.Delay(500);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
_logger.LogError("fail cause :{reason}", ex.Message);
|
|
_isOffline = true;
|
|
|
|
await Task.Delay(5000);
|
|
}
|
|
}
|
|
} |