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 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); }