using JT808.Gateway.Abstractions.Configurations; using JT808.Gateway.Session; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Threading.Tasks; namespace JT808.Gateway.Services { internal class JT808UdpReceiveTimeoutHostedService : BackgroundService { private readonly ILogger Logger; private readonly JT808SessionManager SessionManager; private readonly JT808Configuration Configuration; public JT808UdpReceiveTimeoutHostedService( IOptions jT808ConfigurationAccessor, ILoggerFactory loggerFactory, JT808SessionManager jT808SessionManager ) { SessionManager = jT808SessionManager; Logger = loggerFactory.CreateLogger("JT808UdpReceiveTimeout"); Configuration = jT808ConfigurationAccessor.Value; } protected override async Task ExecuteAsync(CancellationToken stoppingToken) { while (!stoppingToken.IsCancellationRequested) { try { List sessionIds = new List(); foreach (var item in SessionManager.GetUdpAll()) { if (item.ActiveTime.AddSeconds(Configuration.UdpReaderIdleTimeSeconds) < DateTime.Now) { sessionIds.Add(item.SessionID); } } foreach(var item in sessionIds) { SessionManager.RemoveBySessionId(item); } Logger.LogInformation($"[Check Receive Timeout]"); Logger.LogInformation($"[Session Online Count]:{SessionManager.UdpSessionCount}"); } catch (Exception ex) { Logger.LogError(ex, $"[Receive Timeout]"); } finally { await Task.Delay(TimeSpan.FromSeconds(Configuration.UdpReceiveTimeoutCheckTimeSeconds), stoppingToken); } } } } }