Exemplo n.º 1
0
 public QueryClientsResponse QueryClients([FromBody] QueryClientsRequest request)
 {
     if (request == null)
     {
         return(ResponseBase.InvalidInput <QueryClientsResponse>("参数错误"));
     }
     try {
         if (!request.IsValid(User, Sign, Timestamp, base.ClientIp, out QueryClientsResponse response))
         {
             return(response);
         }
         var data = HostRoot.Instance.ClientSet.QueryClients(
             request.PageIndex,
             request.PageSize,
             request.GroupId,
             request.WorkId,
             request.MinerIp,
             request.MinerName,
             request.MineState,
             request.Coin,
             request.Pool,
             request.Wallet,
             request.Version,
             request.Kernel,
             out int total,
             out int miningCount) ?? new List <ClientData>();
         return(QueryClientsResponse.Ok(data, total, miningCount));
     }
     catch (Exception e) {
         Logger.ErrorDebugLine(e);
         return(ResponseBase.ServerError <QueryClientsResponse>(e.Message));
     }
 }
Exemplo n.º 2
0
 public QueryClientsResponse QueryClients([FromBody] QueryClientsRequest query)
 {
     if (query == null)
     {
         return(ResponseBase.InvalidInput <QueryClientsResponse>("参数错误"));
     }
     try {
         if (!IsValidUser(query, out QueryClientsResponse response, out UserData user))
         {
             return(response);
         }
         var data = WebApiRoot.ClientDataSet.QueryClients(
             user,
             query,
             out int total,
             out List <CoinSnapshotData> latestSnapshots,
             out int totalOnlineCount,
             out int totalMiningCount) ?? new List <ClientData>();
         return(QueryClientsResponse.Ok(data, total, latestSnapshots, totalMiningCount, totalOnlineCount));
     }
     catch (Exception e) {
         Logger.ErrorDebugLine(e);
         return(ResponseBase.ServerError <QueryClientsResponse>(e.Message));
     }
 }
Exemplo n.º 3
0
 public QueryClientsForWsResponseMqEvent(
     string appId, DateTime timestamp, string loginName,
     string sessionId, QueryClientsResponse response)
 {
     this.AppId     = appId;
     this.Timestamp = timestamp;
     this.LoginName = loginName;
     this.SessionId = sessionId;
     this.Response  = response;
 }
        public HttpResponseMessage QueryClients([FromBody] QueryClientsRequest request)
        {
            QueryClientsResponse response = ClientDataController.DoQueryClients(request, User);
            var httpResponseMessage       = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new ByteArrayContent(VirtualRoot.BinarySerializer.Serialize(response))
            };

            httpResponseMessage.Content.Headers.ContentType = WebApiRoot.BinaryContentType;
            return(httpResponseMessage);
        }
Exemplo n.º 5
0
 public QueryClientsForWsResponseMqEvent(
     string appId, string mqCorrelationId, DateTime timestamp, string loginName,
     Guid studioId, string sessionId, QueryClientsResponse response)
 {
     this.AppId           = appId;
     this.MqCorrelationId = mqCorrelationId;
     this.Timestamp       = timestamp;
     this.LoginName       = loginName;
     this.StudioId        = studioId;
     this.SessionId       = sessionId;
     this.Response        = response;
 }
 public void QueryClients(
     int pageIndex,
     int pageSize,
     Guid?mineWorkId,
     string minerIp,
     string minerName,
     MineStatus mineState,
     string mainCoin,
     string mainCoinPool,
     string mainCoinWallet,
     string dualCoin,
     string dualCoinPool,
     string dualCoinWallet,
     Action <QueryClientsResponse> callback)
 {
     Task.Factory.StartNew(() => {
         Guid messageId = Guid.NewGuid();
         try {
             using (var service = CreateService()) {
                 var request = new QueryClientsRequest {
                     LoginName      = LoginName,
                     PageIndex      = pageIndex,
                     PageSize       = pageSize,
                     MineWorkId     = mineWorkId,
                     MinerIp        = minerIp,
                     MinerName      = minerName,
                     MineState      = mineState,
                     MainCoin       = mainCoin,
                     MainCoinPool   = mainCoinPool,
                     MainCoinWallet = mainCoinWallet,
                     DualCoin       = dualCoin,
                     DualCoinPool   = dualCoinPool,
                     DualCoinWallet = dualCoinWallet,
                     Timestamp      = DateTime.Now
                 };
                 request.SignIt(Password);
                 QueryClientsResponse response = service.QueryClients(request);
                 callback?.Invoke(response);
             }
         }
         catch (CommunicationException e) {
             Global.DebugLine(e.Message, ConsoleColor.Red);
             callback?.Invoke(QueryClientsResponse.ClientError(messageId, e.Message));
         }
         catch (Exception e) {
             Global.Logger.Error(e.Message, e);
             callback?.Invoke(QueryClientsResponse.ClientError(messageId, e.Message));
         }
     });
 }
Exemplo n.º 7
0
 protected override Dictionary <string, Action <BasicDeliverEventArgs> > GetPaths()
 {
     return(new Dictionary <string, Action <BasicDeliverEventArgs> > {
         [_queryClientsForWsResponseRoutingKey] = ea => {
             string appId = ea.BasicProperties.AppId;
             string mqCorrelationId = ea.BasicProperties.CorrelationId;
             string loginName = ea.BasicProperties.ReadHeaderString(MqKeyword.LoginNameHeaderName);
             string sessionId = ea.BasicProperties.ReadHeaderString(MqKeyword.SessionIdHeaderName);
             QueryClientsResponse response = MinerClientMqBodyUtil.GetQueryClientsResponseMqReceiveBody(ea.Body);
             if (response != null)
             {
                 VirtualRoot.RaiseEvent(new QueryClientsForWsResponseMqEvent(appId, mqCorrelationId, ea.GetTimestamp(), loginName, sessionId, response));
             }
         }
     });
 }
Exemplo n.º 8
0
 public void QueryClientsAsync(QueryClientsRequest query, Action <QueryClientsResponse, Exception> callback)
 {
     try {
         var data = _clientDataSet.QueryClients(
             user: null,
             query,
             out int total,
             out List <CoinSnapshotData> latestSnapshots,
             out int totalOnlineCount,
             out int totalMiningCount);
         callback?.Invoke(QueryClientsResponse.Ok(data, total, latestSnapshots, totalMiningCount, totalOnlineCount), null);
     }
     catch (Exception e) {
         callback?.Invoke(ResponseBase.ServerError <QueryClientsResponse>(e.Message), e);
     }
 }
Exemplo n.º 9
0
 public void QueryClientsAsync(QueryClientsRequest query)
 {
     try {
         var data = _clientDataSet.QueryClients(
             user: null,
             query,
             out int total,
             out List <CoinSnapshotData> latestSnapshots,
             out int totalOnlineCount,
             out int totalMiningCount);
         VirtualRoot.RaiseEvent(new QueryClientsResponseEvent(QueryClientsResponse.Ok(data, total, latestSnapshots, totalMiningCount, totalOnlineCount)));
     }
     catch (Exception e) {
         VirtualRoot.RaiseEvent(new QueryClientsResponseEvent(ResponseBase.ServerError <QueryClientsResponse>(e.Message)));
     }
 }
Exemplo n.º 10
0
        public HttpResponseMessage QueryClientsForWs([FromBody] QueryClientsForWsRequest request)
        {
            QueryClientsResponse response;

            if (request == null)
            {
                response = ResponseBase.InvalidInput <QueryClientsResponse>("参数错误");
            }
            else
            {
                request.PagingTrim();
                try {
                    var user = WebApiRoot.UserSet.GetUser(UserId.CreateLoginNameUserId(request.LoginName));
                    if (user == null)
                    {
                        response = ResponseBase.InvalidInput <QueryClientsResponse>("用户不存在");
                    }
                    else
                    {
                        var data = WebApiRoot.ClientDataSet.QueryClients(
                            user,
                            request,
                            out int total,
                            out CoinSnapshotData[] latestSnapshots,
                            out int totalOnlineCount,
                            out int totalMiningCount) ?? new List <ClientData>();
                        response = QueryClientsResponse.Ok(data, total, latestSnapshots, totalMiningCount, totalOnlineCount);
                    }
                }
                catch (Exception e) {
                    Logger.ErrorDebugLine(e);
                    response = ResponseBase.ServerError <QueryClientsResponse>(e.Message);
                }
            }
            var httpResponseMessage = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new ByteArrayContent(VirtualRoot.BinarySerializer.Serialize(response))
            };

            httpResponseMessage.Content.Headers.ContentType = WebApiRoot.BinaryContentType;
            return(httpResponseMessage);
        }
Exemplo n.º 11
0
 public override bool Go(BasicDeliverEventArgs ea)
 {
     if (ea.RoutingKey == _queryClientsForWsResponseRoutingKey)
     {
         DateTime             timestamp = Timestamp.FromTimestamp(ea.BasicProperties.Timestamp.UnixTime);
         string               appId     = ea.BasicProperties.AppId;
         string               loginName = ea.BasicProperties.ReadHeaderString(MqKeyword.LoginNameHeaderName);
         string               sessionId = ea.BasicProperties.ReadHeaderString(MqKeyword.SessionIdHeaderName);
         QueryClientsResponse response  = MinerClientMqBodyUtil.GetQueryClientsResponseMqReceiveBody(ea.Body);
         if (response != null)
         {
             VirtualRoot.RaiseEvent(new QueryClientsForWsResponseMqMessage(appId, timestamp, loginName, sessionId, response));
         }
         return(true);
     }
     else
     {
         return(false);
     }
 }
Exemplo n.º 12
0
 internal static QueryClientsResponse DoQueryClients(QueryClientsRequest request, UserData user)
 {
     if (request == null)
     {
         return(ResponseBase.InvalidInput <QueryClientsResponse>("参数错误"));
     }
     request.PagingTrim();
     try {
         var data = WebApiRoot.ClientDataSet.QueryClients(
             user,
             request,
             out int total,
             out List <CoinSnapshotData> latestSnapshots,
             out int totalOnlineCount,
             out int totalMiningCount) ?? new List <ClientData>();
         return(QueryClientsResponse.Ok(data, total, latestSnapshots, totalMiningCount, totalOnlineCount));
     }
     catch (Exception e) {
         Logger.ErrorDebugLine(e);
         return(ResponseBase.ServerError <QueryClientsResponse>(e.Message));
     }
 }
Exemplo n.º 13
0
        public void SendResponseClientsForWs(
            string wsServerIp,
            string loginName,
            string sessionId,
            string mqCorrelationId,
            QueryClientsResponse response)
        {
            if (response == null)
            {
                return;
            }
            var basicProperties = CreateWsBasicProperties(loginName, sessionId);

            if (!string.IsNullOrEmpty(mqCorrelationId))
            {
                basicProperties.CorrelationId = mqCorrelationId;
            }
            _mq.BasicPublish(
                routingKey: string.Format(MqKeyword.QueryClientsForWsResponseRoutingKey, wsServerIp),
                basicProperties: basicProperties,
                body: MinerClientMqBodyUtil.GetQueryClientsResponseMqSendBody(response));
        }
Exemplo n.º 14
0
 public QueryClientsResponse QueryClients(QueryClientsRequest request)
 {
     if (request == null)
     {
         return(QueryClientsResponse.InvalidInput(Guid.Empty, "参数错误"));
     }
     try {
         if (string.IsNullOrEmpty(request.LoginName))
         {
             return(QueryClientsResponse.InvalidInput(request.MessageId, "登录名不能为空"));
         }
         if (!HostRoot.Current.UserSet.TryGetKey(request.LoginName, out IUser key))
         {
             return(QueryClientsResponse.Forbidden(request.MessageId));
         }
         if (!request.Timestamp.IsInTime())
         {
             return(QueryClientsResponse.Expired(request.MessageId));
         }
         if (request.Sign != request.GetSign(key.Password))
         {
             return(QueryClientsResponse.Forbidden(request.MessageId, "签名验证未通过"));
         }
         int total;
         var data = HostRoot.Current.ClientSet.QueryClients(
             request.PageIndex, request.PageSize, request.MineWorkId,
             request.MinerIp, request.MinerName, request.MineState,
             request.MainCoin, request.MainCoinPool, request.MainCoinWallet,
             request.DualCoin, request.DualCoinPool, request.DualCoinWallet, out total) ?? new List <ClientData>();
         return(new QueryClientsResponse(data)
         {
             Total = total
         });
     }
     catch (Exception e) {
         Global.Logger.ErrorDebugLine(e.Message, e);
         return(QueryClientsResponse.ServerError(request.MessageId, e.Message));
     }
 }
Exemplo n.º 15
0
        public static QueryClientsResponse QueryClientsForWs(QueryClientsForWsRequest request)
        {
            QueryClientsResponse response;

            if (request == null)
            {
                response = ResponseBase.InvalidInput <QueryClientsResponse>("参数错误");
            }
            else
            {
                request.PagingTrim();
                try {
                    var user = UserSet.GetUser(UserId.CreateLoginNameUserId(request.LoginName));
                    if (user == null)
                    {
                        response = ResponseBase.InvalidInput <QueryClientsResponse>("用户不存在");
                    }
                    else
                    {
                        var data = ClientDataSet.QueryClients(
                            user,
                            request,
                            out int total,
                            out CoinSnapshotData[] latestSnapshots,
                            out int totalOnlineCount,
                            out int totalMiningCount) ?? new List <ClientData>();
                        response = QueryClientsResponse.Ok(data, total, latestSnapshots, totalMiningCount, totalOnlineCount);
                    }
                }
                catch (Exception e) {
                    Logger.ErrorDebugLine(e);
                    response = ResponseBase.ServerError <QueryClientsResponse>(e.Message);
                }
            }
            return(response);
        }
Exemplo n.º 16
0
        public ClientDataSet(IMinerRedis minerRedis, ISpeedDataRedis speedDataRedis, IMinerClientMqSender mqSender) : base(isPull: false, getDatas: callback => {
            var getMinersTask = minerRedis.GetAllAsync();
            var getSpeedsTask = speedDataRedis.GetAllAsync();
            Task.WhenAll(getMinersTask, getSpeedsTask).ContinueWith(t => {
                NTMinerConsole.UserInfo($"从redis加载了 {getMinersTask.Result.Count} 条MinerData,和 {getSpeedsTask.Result.Count} 条SpeedData");
                var speedDatas = getSpeedsTask.Result;
                List <ClientData> clientDatas = new List <ClientData>();
                DateTime speedOn = DateTime.Now.AddMinutes(-3);
                foreach (var minerData in getMinersTask.Result)
                {
                    var clientData = ClientData.Create(minerData);
                    // 该属性没有持久化而只在内存中,启动时将该属性值视为当前日期的前一天的零时加上CreatedOn
                    // 的时间从而将数据分散开来从而滑动清理,后面有个周期清理7天不活跃矿机的任务。WebApiServer启动后第6天才会进行第一次清理。
                    clientData.MinerActiveOn = DateTime.Today.AddDays(-1) + minerData.CreatedOn.TimeOfDay;
                    clientDatas.Add(clientData);
                    var speedData = speedDatas.FirstOrDefault(a => a.ClientId == minerData.ClientId);
                    if (speedData != null && speedData.SpeedOn > speedOn)
                    {
                        clientData.Update(speedData, out bool _);
                    }
                }
                callback?.Invoke(clientDatas);
            });
        }) {
            _minerRedis     = minerRedis;
            _speedDataRedis = speedDataRedis;
            _mqSender       = mqSender;
            VirtualRoot.BuildEventPath <Per1MinuteEvent>("周期清理Redis中不活跃的来自挖矿端上报的算力记录", LogEnum.DevConsole, path: message => {
                DateTime time     = message.BornOn.AddSeconds(-130);
                var toRemoveSpeed = _dicByClientId.Where(a => a.Value.MinerActiveOn != DateTime.MinValue && a.Value.MinerActiveOn <= time).ToArray();
                _speedDataRedis.DeleteByClientIdsAsync(toRemoveSpeed.Select(a => a.Key).ToArray());

                // 删除一段时间没有活跃过的客户端
                const int nDay       = 7;
                DateTime netActiveOn = message.BornOn.AddSeconds(-30);
                time = message.BornOn.AddDays(-nDay);
                var toRemoveClient = _dicByObjectId.Where(a => a.Value.MinerActiveOn <= time && a.Value.NetActiveOn <= netActiveOn).ToArray();
                if (toRemoveClient.Length > 0)
                {
                    NTMinerConsole.UserOk($"{toRemoveClient.Length.ToString()} 台矿机因 {nDay.ToString()} 天没有活跃,删除对应记录");
                    foreach (var kv in toRemoveClient)
                    {
                        base.RemoveByObjectId(kv.Key);
                    }
                }
            }, this.GetType());
            // 收到Mq消息之前一定已经初始化完成,因为Mq消费者在ClientSetInitedEvent事件之后才会创建
            VirtualRoot.BuildEventPath <SpeedDataMqMessage>("收到SpeedDataMq消息后更新ClientData内存", LogEnum.None, path: message => {
                if (message.AppId == ServerRoot.HostConfig.ThisServerAddress)
                {
                    return;
                }
                if (message.ClientId == Guid.Empty)
                {
                    return;
                }
                if (IsOldMqMessage(message.Timestamp))
                {
                    NTMinerConsole.UserOk(nameof(SpeedDataMqMessage) + ":" + MqKeyword.SafeIgnoreMessage);
                    return;
                }
                speedDataRedis.GetByClientIdAsync(message.ClientId).ContinueWith(t => {
                    ReportSpeed(t.Result.SpeedDto, message.MinerIp, isFromWsServerNode: true);
                });
            }, this.GetType());
            VirtualRoot.BuildEventPath <MinerClientWsOpenedMqMessage>("收到MinerClientWsOpenedMq消息后更新NetActiveOn和IsOnline", LogEnum.None, path: message => {
                if (IsOldMqMessage(message.Timestamp))
                {
                    NTMinerConsole.UserOk(nameof(MinerClientWsOpenedMqMessage) + ":" + MqKeyword.SafeIgnoreMessage);
                    return;
                }
                if (_dicByClientId.TryGetValue(message.ClientId, out ClientData clientData))
                {
                    clientData.NetActiveOn = message.Timestamp;
                    clientData.IsOnline    = true;
                }
            }, this.GetType());
            VirtualRoot.BuildEventPath <MinerClientWsClosedMqMessage>("收到MinerClientWsClosedMq消息后更新NetActiveOn和IsOnline", LogEnum.None, path: message => {
                if (IsOldMqMessage(message.Timestamp))
                {
                    NTMinerConsole.UserOk(nameof(MinerClientWsClosedMqMessage) + ":" + MqKeyword.SafeIgnoreMessage);
                    return;
                }
                if (_dicByClientId.TryGetValue(message.ClientId, out ClientData clientData))
                {
                    clientData.NetActiveOn = message.Timestamp;
                    clientData.IsOnline    = false;
                }
            }, this.GetType());
            VirtualRoot.BuildEventPath <MinerClientWsBreathedMqMessage>("收到MinerClientWsBreathedMq消息后更新NetActiveOn", LogEnum.None, path: message => {
                if (IsOldMqMessage(message.Timestamp))
                {
                    NTMinerConsole.UserOk(nameof(MinerClientWsBreathedMqMessage) + ":" + MqKeyword.SafeIgnoreMessage);
                    return;
                }
                if (_dicByClientId.TryGetValue(message.ClientId, out ClientData clientData))
                {
                    clientData.NetActiveOn = message.Timestamp;
                    clientData.IsOnline    = true;
                }
            }, this.GetType());
            VirtualRoot.BuildCmdPath <ChangeMinerSignMqMessage>(path: message => {
                if (_dicByObjectId.TryGetValue(message.Data.Id, out ClientData clientData))
                {
                    clientData.Update(message.Data, out bool isChanged);
                    if (isChanged)
                    {
                        var minerData = MinerData.Create(clientData);
                        _minerRedis.SetAsync(minerData).ContinueWith(t => {
                            _mqSender.SendMinerSignChanged(minerData.Id);
                        });
                    }
                }
                else
                {
                    clientData = ClientData.Create(MinerData.Create(message.Data));
                    Add(clientData);
                }
                clientData.NetActiveOn        = DateTime.Now;
                clientData.IsOnline           = true;
                clientData.IsOuterUserEnabled = true;
            }, this.GetType(), LogEnum.None);
            VirtualRoot.BuildCmdPath <QueryClientsForWsMqMessage>(path: message => {
                QueryClientsResponse response = AppRoot.QueryClientsForWs(message.Query);
                _mqSender.SendResponseClientsForWs(message.AppId, message.LoginName, message.SessionId, response);
            }, this.GetType(), LogEnum.None);
        }
Exemplo n.º 17
0
 public QueryClientsResponseEvent(QueryClientsResponse response)
 {
     this.Response = response;
 }
Exemplo n.º 18
0
        public ClientDataSet(
            IMinerDataRedis minerRedis, IClientActiveOnRedis clientActiveOnRedis,
            ISpeedDataRedis speedDataRedis, IMinerClientMqSender mqSender)
            : base(isPull: false, getDatas: callback => {
            var getMinersTask          = minerRedis.GetAllAsync();
            var getClientActiveOnsTask = clientActiveOnRedis.GetAllAsync();
            var getSpeedsTask          = speedDataRedis.GetAllAsync();
            Task.WhenAll(getMinersTask, getClientActiveOnsTask, getSpeedsTask).ContinueWith(t => {
                NTMinerConsole.UserInfo($"从redis加载了 {getMinersTask.Result.Count} 条MinerData,和 {getSpeedsTask.Result.Count} 条SpeedData");
                Dictionary <Guid, SpeedData> speedDataDic       = getSpeedsTask.Result;
                Dictionary <string, DateTime> clientActiveOnDic = getClientActiveOnsTask.Result;
                List <ClientData> clientDatas = new List <ClientData>();
                DateTime speedOn = DateTime.Now.AddMinutes(-3);
                foreach (var minerData in getMinersTask.Result)
                {
                    var clientData = ClientData.Create(minerData);
                    if (clientActiveOnDic.TryGetValue(minerData.Id, out DateTime activeOn))
                    {
                        clientData.MinerActiveOn = activeOn;
                    }
                    clientDatas.Add(clientData);
                    if (speedDataDic.TryGetValue(minerData.ClientId, out SpeedData speedData) && speedData.SpeedOn > speedOn)
                    {
                        clientData.Update(speedData, out bool _);
                    }
                }
                callback?.Invoke(clientDatas);
            });
        }) {
            _minerRedis          = minerRedis;
            _clientActiveOnRedis = clientActiveOnRedis;
            _speedDataRedis      = speedDataRedis;
            _mqSender            = mqSender;
            VirtualRoot.BuildEventPath <Per100MinuteEvent>("周期将矿机的MinerActiveOn或NetActiveOn时间戳持久到redis", LogEnum.DevConsole, message => {
                var minerCients = _dicByObjectId.Values.ToArray();
                DateTime time   = message.BornOn.AddSeconds(-message.Seconds);
                int count       = 0;
                foreach (var minerClient in minerCients)
                {
                    // 如果活跃则更新到redis,否则就不更新了
                    DateTime activeOn = minerClient.GetActiveOn();
                    if (activeOn > time)
                    {
                        clientActiveOnRedis.SetAsync(minerClient.Id, activeOn);
                        count++;
                    }
                }
                NTMinerConsole.DevWarn($"{count.ToString()} 条活跃矿机的时间戳被持久化");
            }, this.GetType());
            // 上面的持久化时间戳到redis的目的主要是为了下面那个周期找出不活跃的矿机记录删除掉的逻辑能够在重启WebApiServer服务进程后不中断
            VirtualRoot.BuildEventPath <Per2MinuteEvent>("周期找出用不活跃的矿机记录删除掉", LogEnum.DevConsole, message => {
                var clientDatas = _dicByObjectId.Values.ToArray();
                Dictionary <string, List <ClientData> > dicByMACAddress = new Dictionary <string, List <ClientData> >();
                DateTime minerClientExpireTime = message.BornOn.AddDays(-7);
                // 因为SpeedData尺寸较大,时效性较短,可以比CientData更早删除
                DateTime minerSpeedExpireTime = message.BornOn.AddMinutes(-3);
                int count = 0;
                foreach (var clientData in clientDatas)
                {
                    DateTime activeOn = clientData.GetActiveOn();
                    // 如果7天都没有活跃了
                    if (activeOn <= minerClientExpireTime)
                    {
                        RemoveByObjectId(clientData.Id);
                        count++;
                    }
                    else if (activeOn <= minerSpeedExpireTime)
                    {
                        _speedDataRedis.DeleteByClientIdAsync(clientData.ClientId);
                    }
                    else if (!string.IsNullOrEmpty(clientData.MACAddress))
                    {
                        if (!dicByMACAddress.TryGetValue(clientData.MACAddress, out List <ClientData> list))
                        {
                            list = new List <ClientData>();
                            dicByMACAddress.Add(clientData.MACAddress, list);
                        }
                        list.Add(clientData);
                    }
                }
                if (count > 0)
                {
                    NTMinerConsole.DevWarn($"{count.ToString()} 条不活跃的矿机记录被删除");
                }
                List <string> toRemoveIds = new List <string>();
                foreach (var kv in dicByMACAddress)
                {
                    if (kv.Value.Count > 1)
                    {
                        toRemoveIds.AddRange(kv.Value.Select(a => a.Id));
                    }
                }
                if (toRemoveIds.Count > 0)
                {
                    count = 0;
                    foreach (var id in toRemoveIds)
                    {
                        RemoveByObjectId(id);
                        count++;
                    }
                    NTMinerConsole.DevWarn($"{count.ToString()} 条MAC地址重复的矿机记录被删除");
                }

                NTMinerConsole.DevDebug($"QueryClients平均耗时 {AverageQueryClientsMilliseconds.ToString()} 毫秒");
            }, this.GetType());
            // 收到Mq消息之前一定已经初始化完成,因为Mq消费者在ClientSetInitedEvent事件之后才会创建
            VirtualRoot.BuildEventPath <SpeedDatasMqEvent>("收到SpeedDatasMq消息后更新ClientData内存", LogEnum.None, path: message => {
                if (message.AppId == ServerRoot.HostConfig.ThisServerAddress)
                {
                    return;
                }
                if (message.ClientIdIps == null || message.ClientIdIps.Length == 0)
                {
                    return;
                }
                if (IsOldMqMessage(message.Timestamp))
                {
                    NTMinerConsole.UserOk(nameof(SpeedDatasMqEvent) + ":" + MqKeyword.SafeIgnoreMessage);
                    return;
                }
                speedDataRedis.GetByClientIdsAsync(message.ClientIdIps.Select(a => a.ClientId).ToArray()).ContinueWith(t => {
                    if (t.Result != null && t.Result.Length != 0)
                    {
                        foreach (var item in t.Result)
                        {
                            string minerIp = string.Empty;
                            var clientIdIp = message.ClientIdIps.FirstOrDefault(a => a.ClientId == item.ClientId);
                            if (clientIdIp != null)
                            {
                                minerIp = clientIdIp.MinerIp;
                            }
                            ReportSpeed(item.SpeedDto, minerIp, isFromWsServerNode: true);
                        }
                    }
                });
            }, this.GetType());
            VirtualRoot.BuildEventPath <MinerClientWsClosedMqEvent>("收到MinerClientWsClosedMq消息后更新NetActiveOn和IsOnline", LogEnum.None, path: message => {
                if (IsOldMqMessage(message.Timestamp))
                {
                    NTMinerConsole.UserOk(nameof(MinerClientWsClosedMqEvent) + ":" + MqKeyword.SafeIgnoreMessage);
                    return;
                }
                if (_dicByClientId.TryGetValue(message.ClientId, out ClientData clientData))
                {
                    clientData.NetActiveOn = message.Timestamp;
                    clientData.IsOnline    = false;
                }
            }, this.GetType());
            VirtualRoot.BuildEventPath <MinerClientsWsBreathedMqEvent>("收到MinerClientsWsBreathedMq消息后更新NetActiveOn", LogEnum.None, path: message => {
                if (IsOldMqMessage(message.Timestamp))
                {
                    NTMinerConsole.UserOk(nameof(MinerClientsWsBreathedMqEvent) + ":" + MqKeyword.SafeIgnoreMessage);
                    return;
                }
                if (message.ClientIds != null && message.ClientIds.Length != 0)
                {
                    foreach (var clientId in message.ClientIds)
                    {
                        if (_dicByClientId.TryGetValue(clientId, out ClientData clientData))
                        {
                            clientData.NetActiveOn = message.Timestamp;
                            clientData.IsOnline    = true;
                        }
                    }
                }
            }, this.GetType());
            VirtualRoot.BuildEventPath <MinerSignSetedMqEvent>("更新内存中的MinerData的MinerSign部分", LogEnum.None, path: message => {
                if (_dicByObjectId.TryGetValue(message.Data.Id, out ClientData clientData))
                {
                    clientData.Update(message.Data);
                }
                else
                {
                    clientData = ClientData.Create(message.Data);
                    Add(clientData);
                }
                clientData.NetActiveOn        = DateTime.Now;
                clientData.IsOnline           = true;
                clientData.IsOuterUserEnabled = true;
            }, this.GetType());
            VirtualRoot.BuildCmdPath <QueryClientsForWsMqCommand>(path: message => {
                QueryClientsResponse response = AppRoot.QueryClientsForWs(message.Query);
                _mqSender.SendResponseClientsForWs(message.AppId, message.LoginName, message.SessionId, message.MqMessageId, response);
            }, this.GetType(), LogEnum.None);
        }
Exemplo n.º 19
0
 public static byte[] GetQueryClientsResponseMqSendBody(QueryClientsResponse response)
 {
     return(Encoding.UTF8.GetBytes(VirtualRoot.JsonSerializer.Serialize(response)));
 }
Exemplo n.º 20
0
        public void SendResponseClientsForWs(string wsServerIp, string loginName, string sessionId, QueryClientsResponse response)
        {
            if (response == null)
            {
                return;
            }
            var basicProperties = CreateWsBasicProperties(loginName, sessionId);

            _mq.MqChannel.BasicPublish(
                exchange: MqKeyword.NTMinerExchange,
                routingKey: string.Format(MqKeyword.QueryClientsForWsResponseRoutingKey, wsServerIp),
                basicProperties: basicProperties,
                body: MinerClientMqBodyUtil.GetQueryClientsResponseMqSendBody(response));
        }
Exemplo n.º 21
0
 public static byte[] GetQueryClientsResponseMqSendBody(QueryClientsResponse response)
 {
     return(VirtualRoot.BinarySerializer.Serialize(response));
 }