using System.Net; using System.Net.Sockets; using Dlhis.Entity.Basic.Entity; using Dlhis.Entity.Device.Entities; using Kurisu.Core.DataAccess.Entity; using Kurisu.SqlSugar.Services; using Newtonsoft.Json; namespace Dlhis.ScheduledTask.CommonJobs; public class HeartbeatJob { private readonly IDbContext _dbContext; public HeartbeatJob(IDbContext dbContext) { _dbContext = dbContext; } public async Task RunAsync() { _dbContext.Client.QueryFilter.ClearAndBackup(); try { var devices = await _dbContext.Queryable().Where(x => x.Enable).Where(x => x.HeartbeatInterval > 0).ToListAsync(); foreach (var device in devices) { try { var ipInfo = JsonConvert.DeserializeObject(device.ConnectionInfo); //超时时间 var CancellationTokenSource = new CancellationTokenSource(300); await new TcpClient().ConnectAsync(IPAddress.Parse(ipInfo.IP), ipInfo.Port, CancellationTokenSource.Token); await _dbContext.Updateable().SetColumns(x => x.LastHeartbeatTime == DateTime.Now) .Where(x => x.DeviceUniqueNo == device.UniqueNo).ExecuteCommandAsync(); // _logger.LogInformation("心跳设备成功:{no}", device.UniqueNo); } catch (Exception) { //_logger.LogError(ex, "心跳设备失败:{no}. {message}", device.UniqueNo, ex.Message); } } } finally { _dbContext.Client.QueryFilter.Restore(); } } }