예제 #1
0
        public async Task <bool> DelayedTaskExecute(Guid sid)
        {
            ServerNodeEntity node = _nodeService.GetAvaliableWorkerByPriority(sid).FirstOrDefault();

            _delayedTaskServiceClient.Server = node;
            return(await _delayedTaskServiceClient.Execute(sid));
        }
예제 #2
0
        public async Task <bool> ScheduleRunOnce(Guid sid)
        {
            ServerNodeEntity node = _nodeService.GetAvaliableWorkerByPriority(sid).FirstOrDefault();

            _scheduleClient.Server = node;
            return(await _scheduleClient.RunOnce(sid));
        }
        /// <summary>
        /// 根据权重选择一个worker执行操作
        /// </summary>
        /// <param name="sid"></param>
        /// <param name="router"></param>
        /// <returns></returns>
        private bool WorkerSelectOne(Guid sid, string router)
        {
            //根据节点权重来选择一个节点运行
            var list = _repositoryFactory.ServerNodes.Where(m => m.NodeType == "worker" && m.Status == 2).OrderBy(x => x.Priority).ToList();

            int[] arry = new int[list.Count + 1];
            arry[0] = 0;
            for (int i = 0; i < list.Count; i++)
            {
                arry[i + 1] = list[i].Priority + arry[i];
            }
            var sum = list.Sum(x => x.Priority);
            int rnd = new Random().Next(0, sum);
            ServerNodeEntity selectedNode = null;

            for (int i = 1; i < arry.Length; i++)
            {
                if (rnd >= arry[i - 1] && rnd < arry[i])
                {
                    selectedNode = list[i - 1];
                    break;
                }
            }
            if (selectedNode != null)
            {
                Dictionary <string, string> param = new Dictionary <string, string> {
                    { "sid", sid.ToString() }
                };
                return(NodeRequest(selectedNode, router, "post", param));
            }
            return(false);
        }
        private bool NodeRequest(ServerNodeEntity node, string router, string method, Dictionary <string, string> param)
        {
            //var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get,
            //$"{node.AccessProtocol}://{node.Host}/{router}");
            //request.Headers.Add("sm_secret", node.AccessSecret);
            //if (param != null)
            //{
            //    request.Content = new System.Net.Http.FormUrlEncodedContent(param.AsEnumerable());
            //}
            //var client = new System.Net.Http.HttpClient();

            //var response = await client.SendAsync(request);
            //if (response.IsSuccessStatusCode) { }
            Dictionary <string, string> header = new Dictionary <string, string> {
                { "sm_secret", node.AccessSecret }
            };
            string url     = $"{node.AccessProtocol}://{node.Host}/{router}";
            var    result  = HttpRequest.Send(url, method, param, header);
            var    success = result.Key == HttpStatusCode.OK;

            if (!success)
            {
                Log.LogHelper.Warn($"响应码:{result.Key.GetHashCode()},请求地址:{url},响应消息:{result.Value}");
            }
            return(success);
        }
        public static void Register()
        {
            var setting = ConfigurationCache.NodeSetting;

            using (var scope = new Core.ScopeDbContext())
            {
                bool isCreate = false;
                var  db       = scope.GetDbContext();
                var  node     = db.ServerNodes.FirstOrDefault(x => x.NodeName == setting.IdentityName);
                if (node == null)
                {
                    isCreate = true;
                    node     = new ServerNodeEntity();
                }
                node.NodeName       = setting.IdentityName;
                node.NodeType       = setting.Role;
                node.MachineName    = Environment.MachineName;
                node.AccessProtocol = setting.Protocol;
                node.Host           = $"{setting.IP}:{setting.Port}";
                node.AccessSecret   = Guid.NewGuid().ToString("n");
                node.Status         = 2;
                node.LastUpdateTime = DateTime.Now;
                if (isCreate)
                {
                    db.ServerNodes.Add(node);
                }
                db.SaveChanges();
            }
        }
예제 #6
0
 public ActionResult NodeSave(ServerNodeEntity entity)
 {
     if (ModelState.IsValid)
     {
         string savetype = Request.Form["savetype"].ToString();
         if (savetype == "edit")
         {
             var result = _nodeService.EditNode(entity);
             if (result)
             {
                 return(SuccessTip("编辑节点成功!", Url.Action("Node")));
             }
             return(DangerTip("编辑节点失败!"));
         }
         else if (savetype == "add")
         {
             if (_nodeService.GetNodeByName(entity.NodeName) != null)
             {
                 return(DangerTip("节点名称已存在!"));
             }
             var result = _nodeService.AddNode(entity);
             if (result)
             {
                 return(SuccessTip("新增节点成功!", Url.Action("Node")));
             }
             return(DangerTip("新增节点失败!"));
         }
     }
     return(DangerTip("数据验证失败!"));
 }
예제 #7
0
        /// <summary>
        /// 更新节点状态
        /// </summary>
        /// <param name="isStarted"></param>
        /// <param name="isOnStop"></param>
        private static void MarkNode(bool isStarted, bool isOnStop = false)
        {
            var setting = ConfigurationCache.NodeSetting;

            using (var scope = new Core.ScopeDbContext())
            {
                bool isCreate = false;
                var  db       = scope.GetDbContext();
                var  node     = db.ServerNodes.FirstOrDefault(x => x.NodeName == setting.IdentityName);
                if (isStarted)
                {
                    if (node == null)
                    {
                        isCreate = true;
                        node     = new ServerNodeEntity();
                    }
                    string secret = Guid.NewGuid().ToString("n");
                    node.NodeName       = setting.IdentityName;
                    node.NodeType       = setting.Role;
                    node.MachineName    = setting.MachineName;
                    node.AccessProtocol = setting.Protocol;
                    node.Host           = $"{setting.IP}:{setting.Port}";
                    node.Priority       = setting.Priority;
                    node.MaxConcurrency = setting.MaxConcurrency;
                    node.Status         = 2;
                    node.AccessSecret   = secret;
                    if (isCreate)
                    {
                        db.ServerNodes.Add(node);
                    }
                    else
                    {
                        db.ServerNodes.Update(node);
                    }
                    if (db.SaveChanges() > 0)
                    {
                        AccessSecret = secret;
                    }
                }
                else
                {
                    if (node != null)
                    {
                        node.Status       = isOnStop ? 0 : 1;
                        node.AccessSecret = null;
                        db.ServerNodes.Update(node);
                        if (db.SaveChanges() > 0)
                        {
                            AccessSecret = string.Empty;
                        }
                    }
                    //释放锁
                    db.Database.ExecuteSqlRaw(
                        $"update schedulelocks set status=0,lockedtime=null,lockednode=null where status=1 and lockednode='{setting.IdentityName}'");
                }
            }
        }
예제 #8
0
 /// <summary>
 /// 修改节点
 /// </summary>
 /// <param name="entity"></param>
 /// <returns></returns>
 public bool EditNode(ServerNodeEntity entity)
 {
     entity.LastUpdateTime = DateTime.Now;
     _repositoryFactory.ServerNodes.UpdateBy(x => x.NodeName == entity.NodeName, new
     {
         entity.AccessProtocol,
         entity.Host,
         entity.LastUpdateTime,
         entity.MachineName,
         //entity.NodeType,
         entity.Priority
     });
     return(_unitOfWork.Commit() > 0);
 }
예제 #9
0
        private bool NodeRequest(ServerNodeEntity node, string router, string method, Dictionary <string, string> param)
        {
            Dictionary <string, string> header = new Dictionary <string, string> {
                { "sm_secret", node.AccessSecret }
            };
            string url     = $"{node.AccessProtocol}://{node.Host}/{router}";
            var    result  = HttpRequest.Send(url, method, param, header);
            var    success = result.Key == HttpStatusCode.OK;

            if (!success)
            {
                Log.LogHelper.Warn($"响应码:{result.Key.GetHashCode()},请求地址:{url},响应消息:{result.Value}");
            }
            return(success);
        }
예제 #10
0
        /// <summary>
        /// 更新节点状态
        /// </summary>
        /// <param name="isStarted"></param>
        /// <param name="isOnStop"></param>
        private static void MarkNode(bool isStarted, bool isOnStop = false)
        {
            var setting = ConfigurationCache.NodeSetting;

            using (var scope = new Core.ScopeDbContext())
            {
                bool isCreate = false;
                var  db       = scope.GetDbContext();
                var  node     = db.ServerNodes.FirstOrDefault(x => x.NodeName == setting.IdentityName);
                if (isStarted)
                {
                    if (node == null)
                    {
                        isCreate = true;
                        node     = new ServerNodeEntity();
                    }
                    node.NodeName       = setting.IdentityName;
                    node.NodeType       = setting.Role;
                    node.MachineName    = Environment.MachineName;
                    node.AccessProtocol = setting.Protocol;
                    node.Host           = $"{setting.IP}:{setting.Port}";
                    node.Priority       = setting.Priority;
                    node.Status         = 2;
                    node.AccessSecret   = Guid.NewGuid().ToString("n");
                    if (isCreate)
                    {
                        db.ServerNodes.Add(node);
                    }
                }
                else
                {
                    if (node != null)
                    {
                        node.Status = isOnStop ? 0 : 1;
                        if (isOnStop)
                        {
                            node.AccessSecret = null;
                        }
                    }
                }
                if (db.SaveChanges() > 0)
                {
                    AccessSecret = node.AccessSecret;
                }
            }
        }
예제 #11
0
        /// <summary>
        /// 立即执行延时任务
        /// </summary>
        /// <param name="sid"></param>
        /// <returns></returns>
        public ServiceResponseMessage Execute(Guid sid)
        {
            ServerNodeEntity            worker = _nodeService.GetAvaliableWorkerByPriority(sid).FirstOrDefault();
            Dictionary <string, string> param  = new Dictionary <string, string> {
                { "sid", sid.ToString() }
            };
            bool success = _nodeService.WorkerRequest(worker, "api/delayedtask/execute?sid=" + sid, "post", param);

            if (success)
            {
                return(ServiceResult(ResultStatus.Success, "任务运行成功!"));
            }
            else
            {
                return(ServiceResult(ResultStatus.Failed, "任务运行失败!"));
            }
        }
        private bool NodeRequest(ServerNodeEntity node, string router, string method, Dictionary <string, string> param)
        {
            //var request = new System.Net.Http.HttpRequestMessage(System.Net.Http.HttpMethod.Get,
            //$"{node.AccessProtocol}://{node.Host}/{router}");
            //request.Headers.Add("sm_secret", node.AccessSecret);
            //if (param != null)
            //{
            //    request.Content = new System.Net.Http.FormUrlEncodedContent(param.AsEnumerable());
            //}
            //var client = new System.Net.Http.HttpClient();

            //var response = await client.SendAsync(request);
            //if (response.IsSuccessStatusCode) { }
            Dictionary <string, string> header = new Dictionary <string, string> {
                { "sm_secret", node.AccessSecret }
            };
            var result = HttpRequest.Send($"{node.AccessProtocol}://{node.Host}/{router}", method, param, header);

            return(result.Key == HttpStatusCode.OK);
        }
예제 #13
0
        /// <summary>
        /// 执行一次任务
        /// </summary>
        /// <param name="sid"></param>
        /// <returns></returns>
        public ServiceResponseMessage RunOnce(Guid sid)
        {
            var task = QueryById(sid);

            if (task != null && task.Status == (int)ScheduleStatus.Running)
            {
                ServerNodeEntity            worker = _nodeService.GetAvaliableWorkerByPriority(sid).FirstOrDefault();
                Dictionary <string, string> param  = new Dictionary <string, string> {
                    { "sid", sid.ToString() }
                };
                bool success = _nodeService.WorkerRequest(worker, "api/quartz/runonce?sid=" + sid, "post", param);
                if (success)
                {
                    return(ServiceResult(ResultStatus.Success, "任务运行成功!"));
                }
                else
                {
                    return(ServiceResult(ResultStatus.Failed, "任务运行失败!"));
                }
            }
            return(ServiceResult(ResultStatus.Failed, "任务不在运行状态下!"));
        }
예제 #14
0
        /// <summary>
        /// 根据权重比例选择一个worker
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public ServerNodeEntity WorkerSelect(List <ServerNodeEntity> list)
        {
            list = list.OrderBy(x => x.Priority).ToList();
            //根据节点权重来选择一个节点运行
            int[] arry = new int[list.Count + 1];
            arry[0] = 0;
            for (int i = 0; i < list.Count; i++)
            {
                arry[i + 1] = list[i].Priority + arry[i];
            }
            var sum = list.Sum(x => x.Priority);
            int rnd = new Random().Next(0, sum);
            ServerNodeEntity selectedNode = null;

            for (int i = 1; i < arry.Length; i++)
            {
                if (rnd >= arry[i - 1] && rnd < arry[i])
                {
                    selectedNode = list[i - 1];
                    break;
                }
            }
            return(selectedNode);
        }
예제 #15
0
        /// <summary>
        /// 根据权重选择一个worker执行操作
        /// </summary>
        /// <param name="sid"></param>
        /// <param name="router"></param>
        /// <returns></returns>
        private bool WorkerSelectOne(Guid sid, string router)
        {
            var list = GetAvaliableWorkerForSchedule(sid).OrderBy(x => x.Priority).ToList();

            if (!list.Any())
            {
                return(false);
            }
            //根据节点权重来选择一个节点运行
            int[] arry = new int[list.Count + 1];
            arry[0] = 0;
            for (int i = 0; i < list.Count; i++)
            {
                arry[i + 1] = list[i].Priority + arry[i];
            }
            var sum = list.Sum(x => x.Priority);
            int rnd = new Random().Next(0, sum);
            ServerNodeEntity selectedNode = null;

            for (int i = 1; i < arry.Length; i++)
            {
                if (rnd >= arry[i - 1] && rnd < arry[i])
                {
                    selectedNode = list[i - 1];
                    break;
                }
            }
            if (selectedNode != null)
            {
                Dictionary <string, string> param = new Dictionary <string, string> {
                    { "sid", sid.ToString() }
                };
                return(NodeRequest(selectedNode, router, "post", param));
            }
            return(false);
        }
예제 #16
0
 /// <summary>
 /// 添加节点
 /// </summary>
 /// <param name="entity"></param>
 /// <returns></returns>
 public bool AddNode(ServerNodeEntity entity)
 {
     entity.Status = 0;
     _repositoryFactory.ServerNodes.Add(entity);
     return(_unitOfWork.Commit() > 0);
 }