| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 | 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{    /// <summary>    /// 注册到调度服务的Http服务(包含采集服务、GPU服务、CPU服务等)    /// </summary>    public class ServerContext    {        public static ServerContext Instance { get; private set; } = new ServerContext();        readonly List<ModelSvrRpt> list = new List<ModelSvrRpt>();        public void Init()        {            IpsMessenger.Default.Sub<ModelSvrRpt>("服务状态上报", 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<ModelSvrRpt> GetAll()        {            return list.Skip(0).ToList();        }        public List<ModelSvrRpt> 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<string> tmp = new List<string>();                            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);                }            });        }    }}
 |