public async Task <bool> DelayedTaskExecute(Guid sid) { ServerNodeEntity node = _nodeService.GetAvaliableWorkerByPriority(sid).FirstOrDefault(); _delayedTaskServiceClient.Server = node; return(await _delayedTaskServiceClient.Execute(sid)); }
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(); } }
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("数据验证失败!")); }
/// <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}'"); } } }
/// <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); }
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); }
/// <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; } } }
/// <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); }
/// <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, "任务不在运行状态下!")); }
/// <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); }
/// <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); }
/// <summary> /// 添加节点 /// </summary> /// <param name="entity"></param> /// <returns></returns> public bool AddNode(ServerNodeEntity entity) { entity.Status = 0; _repositoryFactory.ServerNodes.Add(entity); return(_unitOfWork.Commit() > 0); }