using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using Sers.Core.Module.Env; using Sers.Gover.Base.Model; using Sers.Gover.Service.SersEvent; using Sers.Hardware.Usage; using Sers.ServiceCenter.Entity; using Vit.Extensions; namespace Sers.Gover.Base { public class ServiceStationMng { GoverApiCenterService goverManage; public ServiceStationMng Init(GoverApiCenterService goverManage) { this.goverManage = goverManage; return this; } public ICollection serviceStationCollection => serviceStation_ConnKey_Map.Values; /// /// connKey 和 服务站点 的映射 /// readonly ConcurrentDictionary serviceStation_ConnKey_Map = new ConcurrentDictionary(); /// /// serviceStationKey 和 服务站点 的映射 /// /// readonly Reference serviceStationKey_UsageStatus_Map = new Reference(); public void SaveUsageInfo(EnvUsageInfo item) { lock (this) { serviceStationKey_UsageStatus_Map.Get(item.serviceStationKey)?.CopyFrom(item.usageStatus); } } public List ServiceStation_GetAll() { return serviceStation_ConnKey_Map.Values .Select( m => new ServiceStationData { connKey = "" + m.connection.GetHashCode(), startTime = m.startTime, deviceInfo = m.deviceInfo, serviceStationInfo = m.serviceStationInfo, status = "" + m.Status_Get(), usageStatus = m.usageStatus, counter = m.counter, qps = m.qps, apiNodeCount = m.apiNodes.Count, activeApiNodeCount = m.ActiveApiNodeCount_Get(), apiStationNames = m.ApiStationNames_Get() } ).OrderBy(m => m?.serviceStationInfo?.serviceStationName) .ThenBy(m => m.startTime) .ToList(); } #region action /// /// 添加并启用站点 /// /// public void ServiceStation_Add(ServiceStation serviceStation) { lock (this) { serviceStation.startTime=DateTime.Now; serviceStation_ConnKey_Map[serviceStation.connection.GetHashCode()] = serviceStation; if (string.IsNullOrEmpty(serviceStation.serviceStationInfo.serviceStationKey)) serviceStation.serviceStationInfo.serviceStationKey = "tmp" + serviceStation.GetHashCode(); serviceStation.usageStatus = serviceStationKey_UsageStatus_Map.Add(serviceStation.serviceStationKey, serviceStation.usageStatus ?? new UsageStatus()); serviceStation.Status_Set(EServiceStationStatus.正常); goverManage.apiStationMng.ServiceStation_Add(serviceStation); //发布 Sers Event SersEventService.Publish(SersEventService.Event_ServiceStation_Add, serviceStation); } } /// /// 更新服务站点设备硬件信息 /// /// public bool ServiceStation_UpdateStationInfo(ServiceStation newServiceStation) { lock (this) { if (!serviceStation_ConnKey_Map.TryGetValue(newServiceStation.connection.GetHashCode(),out var serviceStation)) { return false; } serviceStationKey_UsageStatus_Map.Remove(serviceStation.serviceStationKey); if (newServiceStation.serviceStationInfo != null) { serviceStation.serviceStationInfo = newServiceStation.serviceStationInfo; if (string.IsNullOrEmpty(serviceStation.serviceStationInfo.serviceStationKey)) serviceStation.serviceStationInfo.serviceStationKey = "tmp" + serviceStation.GetHashCode(); } if (newServiceStation.deviceInfo != null) serviceStation.deviceInfo = newServiceStation.deviceInfo; serviceStation.usageStatus = serviceStationKey_UsageStatus_Map.Add(serviceStation.serviceStationKey, serviceStation.usageStatus ?? new UsageStatus()); return true; } } public ServiceStation ServiceStation_Remove(string connKey) { lock (this) { if (!serviceStation_ConnKey_Map.TryRemove(int.Parse(connKey), out var serviceStation)) { return null; } serviceStationKey_UsageStatus_Map.Remove(serviceStation.serviceStationKey); goverManage.apiStationMng.ServiceStation_Remove(serviceStation); //发布 Sers Event SersEventService.Publish(SersEventService.Event_ServiceStation_Remove, serviceStation); return serviceStation; } } public ServiceStation ServiceStation_Pause(string connKey) { lock (this) { if (!serviceStation_ConnKey_Map.TryGetValue(int.Parse(connKey), out var serviceStation)) { return null; } if (serviceStation.Status_Get() == EServiceStationStatus.暂停) { return serviceStation; } serviceStation.Status_Set(EServiceStationStatus.暂停); goverManage.apiStationMng.ServiceStation_Pause(serviceStation); //发布 Sers Event SersEventService.Publish(SersEventService.Event_ServiceStation_Pause, serviceStation); return serviceStation; } } public ServiceStation ServiceStation_Start(string connKey) { lock (this) { if (!serviceStation_ConnKey_Map.TryGetValue(int.Parse(connKey), out var serviceStation)) { return null; } if (serviceStation.Status_Get() == EServiceStationStatus.正常) { return serviceStation; } serviceStation.Status_Set(EServiceStationStatus.正常); goverManage.apiStationMng.ServiceStation_Start(serviceStation); //发布 Sers Event SersEventService.Publish(SersEventService.Event_ServiceStation_Start, serviceStation); return serviceStation; } } #endregion #region Reference /// /// 线程不安全 /// /// /// class Reference { class Item { public int count = 1; public ValueType value; } SortedDictionary map = new SortedDictionary(); public ValueType Get(KeyType key) { if (map.TryGetValue(key, out var item)) { return item.value; } return default; } public ValueType Add(KeyType key, ValueType value) { if (map.TryGetValue(key, out var item)) { item.count++; return item.value; } map.Add(key, new Item { value = value }); return value; } public ValueType Remove(KeyType key) { if (map.TryGetValue(key, out var item)) { if ((--item.count) <= 0) { map.Remove(key); } return item.value; } return default; } } #endregion } }