using System; using System.Collections.Generic; using System.Configuration; using System.Linq; using System.Runtime.Remoting.MetadataServices; using System.Security.Policy; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Documents; using XdCxRhDW.App.Model; using XdCxRhDW.App.Service; using XdCxRhDW.Dto; using XdCxRhDW.Repostory; namespace XdCxRhDW.App { class ServerContext { public static ServerContext Instance { get; private set; } = new ServerContext(); readonly List list = new List(); public void Init() { Messenger.Defalut.Sub("服务状态改变", dto => { try { lock (this) { if (dto.ReportType == 0) { var find = list.Find(p => p.BaseHttpAddr == dto.BaseHttpAddr); if (find == null) { list.Add(new ModelSvr() { SvrType = dto.SvrType, DevID=dto.DevId, SvrID = dto.SvrID, BaseHttpAddr = dto.BaseHttpAddr, SwaggerAddr = dto.SwaggerAddr, ReportTime = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(SysConfig.Config.ZoneHours)), }); } else { find.DevID = dto.DevId; find.BaseHttpAddr = dto.BaseHttpAddr; find.SwaggerAddr = dto.SwaggerAddr; find.SvrType = dto.SvrType; find.SvrID = dto.SvrID; find.ReportTime = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(SysConfig.Config.ZoneHours)); } } else { var find = list.Find(p => p.BaseHttpAddr == dto.BaseHttpAddr); if (find == null) return; list.Remove(find); } Messenger.Defalut.Pub("服务集合改变", list); } } catch (Exception ex) { LogHelper.Error("处理服务状态上报异常", ex).Wait(1000); } }); CheckSvrState(); } public List GetAll() { var res= list.Skip(0).ToList(); return res.OrderBy(p=>p.BaseHttpAddr).ToList(); } public List GetAll(EnumSvrType type) { lock (this) { return list.FindAll(p => p.SvrType == type); } } public ModelSvr GetOne(EnumSvrType type, string svrID) { lock (this) { return list.FirstOrDefault(p => p.SvrType == type && p.SvrID == svrID); } } public ModelSvr GetRandomOne(EnumSvrType type) { ModelSvr svr = null; lock (this) { svr = list.Where(p => p.SvrType == type).OrderBy(p => Guid.NewGuid()).FirstOrDefault(); } return svr; } private void CheckSvrState() { Task.Run(() => { while (true) { try { lock (this) { List tmp = new List(); list.ForEach(t => { if ((DateTime.Now - t.ReportTime).TotalSeconds > 20) { tmp.Add(t); } }); if (tmp.Any()) { foreach (var item in tmp) { list.Remove(item); AutofacUtil.GetService().WriteStateRes(new SvrStateReportDto() { SvrID = item.SvrID, SvrType = item.SvrType, DevId =item.DevID, ModuleType = EnumModuleType.Soft, ModuleState = EnumModuleState.Error, }); } } } } catch (Exception ex) { LogHelper.Error("服务状态检测异常", ex).Wait(5000); } Thread.Sleep(10000); } }); } } }