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