using Ips.Library.Basic; using Ips.Library.Entity; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Windows.Documents; namespace Ips.Sps.Scheduling { /// /// 注册到调度服务的Http服务(包含采集服务、GPU服务、CPU服务等) /// public class ServerContext { public static ServerContext Instance { get; private set; } = new ServerContext(); readonly List list = new List(); public void Init() { IpsMessenger.Default.Sub("服务状态上报", dto => { try { lock (this) { if (dto.SvrRptType == EnumSvrRptType.Online) { var find = list.Find(p => p.BaseHttpAddr == dto.BaseHttpAddr); if (find == null) { list.Add(new ModelSvrRpt() { SvrType = dto.SvrType, SvrNo = dto.SvrNo, Features = dto.Features, CapDevType = dto.CapDevType, SvrRptType = dto.SvrRptType, BaseHttpAddr = dto.BaseHttpAddr, SwaggerAddr = dto.SwaggerAddr, ReportTime = DateTime.Now, }); } else { find.CapDevType = dto.CapDevType; find.SvrRptType = dto.SvrRptType; find.Features = dto.Features; find.BaseHttpAddr = dto.BaseHttpAddr; find.SwaggerAddr = dto.SwaggerAddr; find.SvrType = dto.SvrType; find.SvrNo = dto.SvrNo; find.ReportTime = DateTime.Now; } } else { var find = list.Find(p => p.BaseHttpAddr == dto.BaseHttpAddr); if (find == null) return; list.Remove(find); } IpsMessenger.Default.Pub("服务集合改变", list); } } catch (Exception ex) { IpsLogger.Error("处理服务状态上报异常", ex); } }); CheckSvrState(); } public List GetAll() { return list.Skip(0).ToList(); } public List GetAll(EnumSvrType type) { lock (this) { return list.FindAll(p => p.SvrType == type); } } public ModelSvrRpt GetOne(EnumSvrType type, string svrID) { lock (this) { return list.FirstOrDefault(p => p.SvrType == type && p.SvrNo == svrID); } } public ModelSvrRpt GetRandomOne(EnumSvrType type) { ModelSvrRpt svr = null; lock (this) { svr = list.Where(p => p.SvrType == type).OrderBy(p => Guid.NewGuid()).FirstOrDefault(); } if (svr == null) throw new Exception($"找不到【{type.GetEnumDisplayName()}】"); 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.BaseHttpAddr); } }); list.RemoveAll(p => tmp.Contains(p.BaseHttpAddr)); } } catch (Exception ex) { IpsLogger.Error("服务状态检测异常", ex); } Thread.Sleep(10000); } }); } } }