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);
- }
- });
- }
- }
- }
|