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