private void OnDispatchJob(Core.DispatchArg arg) { ServiceDomainItem servicedomain = null; lock (servicelocker) { servicedomain = serviceItems.FirstOrDefault(x => x.TaskId == arg.TaskId); if (servicedomain == null || servicedomain.GetFreeCount() == 0) { return; } } //RLib.WatchLog.Loger.Log("分配任务", RLib.Utils.DataSerialize.SerializeJson(arg)); if (useThreadpoolDispatch) { System.Threading.ThreadPool.QueueUserWorkItem(x => { _dispatchJobExec(servicedomain, arg); }); } else { System.Threading.Thread t = new System.Threading.Thread(() => { _dispatchJobExec(servicedomain, arg); }); t.IsBackground = true; t.Start(); } }
private bool _StopWork(int taskId) { if (!this.serviceItems.ToList().Exists(x => x.TaskId == taskId)) { return(true); } try { ServiceDomainItem currtask = null; lock (servicelocker) { currtask = serviceItems.FirstOrDefault(x => x.TaskId == taskId); if (currtask == null) { return(true); } currtask.Stop(); serviceItems.Remove(currtask); } if (currtask != null && currtask.JobType == 0) { this.Schedule.StopJob(currtask.JobContext.JobName); } DoPingSign(); return(true); } finally { _synCacheTask(); } }
private bool _innerStart(Ruanal.Core.ApiSdk.TaskDetail taskdetail) { lock (servicelocker) { if (serviceItems.Exists(x => x.TaskId == taskdetail.TaskId)) { RLib.WatchLog.Loger.Log("启动任务", "已在运行,无需启动"); return(true); } ServiceDomainItem serviceitem = new ServiceDomainItem(taskdetail); serviceitem.OnWockComplet += DoGetDispatchSign; if (serviceitem.JobType == 0) { bool setOk = this.Schedule.StartJob(taskdetail.TaskId.ToString(), serviceitem, taskdetail.RunCron); if (setOk == false) { RLib.WatchLog.Loger.Log("启动任务", "加入计划失败!"); return(false); } var JobContext = this.Schedule.GetJobContext(taskdetail.TaskId.ToString()); serviceitem.JobContext = JobContext; } serviceItems.Add(serviceitem); RLib.WatchLog.Loger.Log("启动任务", "完成"); return(true); } }
private void _dispatchJobExec(ServiceDomainItem servicedomain, Core.DispatchArg arg) { try { int startStatus = servicedomain.StartDispatch(arg, () => { var result = Core.ApiSdk.SystemApi.BeginDispatchExecute(arg.DispatchId); if (result.code <= 0) { RLib.WatchLog.Loger.Error("开始调度执行失败", arg.DispatchId + "\r\n" + result.msg); return(false); } //需要检查是否在运行 if (result.data > 0 && !string.IsNullOrEmpty(arg.RunKey)) { int[] currDispathIds = null; var isrunning = servicedomain.IsRuningKey(arg.RunKey, out currDispathIds); if (!isrunning) { isrunning = _AskDispathIsRun(arg.TaskId, arg.RunKey, servicedomain.TaskDetail.NodeCount); } if (isrunning) { Core.ApiSdk.SystemApi.SkipDispatchExecute(arg.DispatchId); DoGetDispatchSign(); return(false); } else { //自动结束 Core.ApiSdk.SystemApi.AutoEndDispatchExecute(result.data); } } return(true); }); if (startStatus == -1) { RLib.WatchLog.Loger.Error("分配任务失败 没有取得空闲实例", "DispatchId=" + arg.DispatchId + " ;RunArgs" + arg.RunArgs); return; } if (startStatus == 0) { RLib.WatchLog.Loger.Error("分配任务失败 有空闲实例,但分配不允许运行", "DispatchId=" + arg.DispatchId + " ;RunArgs" + arg.RunArgs); return; } Core.ApiSdk.SystemApi.EndDispatchExecute(arg.DispatchId, true, ""); } catch (Exception ex) { RLib.WatchLog.Loger.Error("调度执行失败", ex); Core.ApiSdk.SystemApi.EndDispatchExecute(arg.DispatchId, false, ex.Message); } }
private bool _InnerStopDispatch(int taskId, string invokeid) { if (!this.serviceItems.ToList().Exists(x => x.TaskId == taskId)) { return(true); } ServiceDomainItem currtask = null; lock (servicelocker) { currtask = serviceItems.FirstOrDefault(x => x.TaskId == taskId); if (currtask == null) { return(true); } var r = currtask.StopDispatch(invokeid); if (r == false) { throw new Exception("分配不存在或已运行结束!"); } } return(true); }
private string _OnTalk(string msg) { if (msg.StartsWith(Ruanal.Core.ConfigConst.TalkAskDispatchRunning)) { string[] info = msg.Substring(Ruanal.Core.ConfigConst.TalkAskDispatchRunning.Length).Split(new char[] { '#' }, 2); if (info.Length != 2) { return(null); } int taskId = RLib.Utils.Converter.StrToInt(info[0]); string runkey = info[1]; ServiceDomainItem taskitem = null; lock (servicelocker) { taskitem = serviceItems.FirstOrDefault(x => x.TaskId == taskId); } if (taskitem != null) { int[] dispathIds = null; if (taskitem.IsRuningKey(runkey, out dispathIds)) { return(dispathIds.Length + ":" + string.Join("_", dispathIds)); } return("0"); } } if (msg.StartsWith(Ruanal.Core.ConfigConst.TalkTaskInstanceStatus)) { string[] info = msg.Substring(Ruanal.Core.ConfigConst.TalkTaskInstanceStatus.Length).Split(new char[] { '#' }, 1); if (info.Length != 1) { return(null); } int taskId = RLib.Utils.Converter.StrToInt(info[0]); ServiceDomainItem taskitem = null; lock (servicelocker) { taskitem = serviceItems.FirstOrDefault(x => x.TaskId == taskId); } if (taskitem != null) { string ss = string.Format("【{0}】#{1}", Ruanal.Core.Config.ClientID, string.Join("#", taskitem.InstanceSummary())); return(ss); } } if (msg.StartsWith(Ruanal.Core.ConfigConst.TalkNodeTaskStatus)) { string[] info = msg.Substring(Ruanal.Core.ConfigConst.TalkNodeTaskStatus.Length).Split(new char[] { '#' }, 1); if (info.Length != 1) { return(null); } if (info[0] != Ruanal.Core.Config.ClientID) { return(null); } StringBuilder sb = new StringBuilder(); foreach (var a in serviceItems.ToList()) { sb.AppendFormat("【{0}】[P:{1}] [M:{2}] [T:{3}]#", a.TaskId, a.innerServices.Count(), a.GetMemoryMB(), a.TaskDetail.Title); } return(sb.ToString()); } return(null); }