private ServiceAndDispatch GetFree() { ServiceAndDispatch service = null; lock (servicelock) { service = innerServices.FirstOrDefault(x => x.IsRunning == false); if (_instanceCanReUse == false && service != null) { //不能德用的要关闭 删除 _StopServiceInstance(service, true); innerServices.Remove(service); service = null; } if (service == null) { if (innerServices.Count < this._maxInstanceCount) { service = BuildServiceInstance(); service.IsRunning = true; innerServices.Add(service); } } else { _StopServiceInstance(service, false); service.IsRunning = true; return(service); } } return(service); }
/// <summary> /// 调度任务开始执行 /// </summary> /// <param name="arg"></param> public int StartDispatch(Ruanal.Core.DispatchArg arg, Func <bool> begin) { if (signStop) { return(-1); } ServiceAndDispatch service = GetFree(); if (service == null) { return(-1); } try { if (begin()) { service.dispatchArg = arg; DoServiceStart(service, true); return(1); } else { _StopServiceInstance(service, false); return(0); } } catch (Exception) { _StopServiceInstance(service, false); throw; } }
/// <summary> /// 仅 任务类型为 基本任务(非调度任务)进会 从该方法进入执行 /// </summary> /// <param name="context"></param> public void Execute(ServiceSchedule.JobContext context) { ServiceAndDispatch service = GetFree(); if (service == null) { return; } service.dispatchArg = null; DoServiceStart(service, false); }
private void DoServiceStart(ServiceAndDispatch service, bool canThrow) { service.RunGuid = service.dispatchArg == null?Guid.NewGuid().ToString().Replace("-", "") : service.dispatchArg.InvokeId; Ruanal.Core.ApiSdk.SystemApi.TaskBeginRunLog(TaskId, service.RunGuid, service.dispatchArg == null ? Core.ApiSdk.TaskRunType.Plan : Core.ApiSdk.TaskRunType.ExeDispatch); try { _StartServiceInstance(service); var arg = service.dispatchArg == null ? null : service.dispatchArg.RunArgs; service.innerService.Start(arg); if (!service.innerService.IsThreadJob) { service.RunThread = null; Ruanal.Core.ApiSdk.SystemApi.TaskEndRunLog(TaskId, service.RunGuid, true, ""); _StopServiceInstance(service, false); //分配执行完,通知取新任务 if (service.dispatchArg != null && OnWockComplet != null) { OnWockComplet.Invoke(); } } } catch (Exception ex) { service.RunThread = null; Ruanal.Core.ApiSdk.SystemApi.TaskEndRunLog(TaskId, service.RunGuid, false, ex.Message); try { _StopServiceInstance(service, false); } catch { if (canThrow) { throw; } } if (canThrow) { throw; } } }
/// <summary> /// 线程任务完成 /// </summary> /// <param name="instanceID"></param> private object JobItem_Caller(string instanceID, string callType, object[] args) { ServiceAndDispatch currinstance = null; try { lock (servicelock) { currinstance = innerServices.FirstOrDefault(x => x.InstanceId == instanceID); if (currinstance == null) { return(false); } } //回调 线程任务完成 if (callType == Job.ParentCaller.CallType_EndJob) { if (currinstance.IsRunning == false || currinstance.innerService.IsThreadJob == false) { return(false); } //完成日志 Ruanal.Core.ApiSdk.SystemApi.TaskEndRunLog(TaskId, currinstance.RunGuid, true, ""); _StopServiceInstance(currinstance, false); return(true); } if (callType == Job.ParentCaller.CallType_TaskConfig) { var rtaskdetail = Ruanal.Core.ApiSdk.TaskApi.GetTaskDetail(TaskId); var newconfig = BuildTaskConfig(rtaskdetail.code > 0 ? rtaskdetail.data.TaskConfig : TaskDetail.TaskConfig); return(RLib.Utils.DataSerialize.SerializeJsonBeauty(newconfig)); } return(false); } catch (Exception ex) { RLib.WatchLog.Loger.Error("任务设用父级方法出错 任务ID:" + TaskId + " callType:" + callType, ex); return(false); } }
private ServiceAndDispatch BuildServiceInstance() { var taskConfig = BuildTaskConfig(TaskDetail.TaskConfig); var nolink = Ruanal.Job.JobProxy.IsNoLink(_dllFullName, TaskDetail.EnterClass); string fname = _dllFullName, fclass = TaskDetail.EnterClass; if (nolink) { fname = Path.Combine(_jobBinDir, "Ruanal.Job.dll"); fclass = "Ruanal.Job.JobProxy"; } var obj_serviceinstance = _taskDomain.CreateInstanceFromAndUnwrap(fname, fclass); if (obj_serviceinstance is Ruanal.Job.JobServiceBase) { var currinstance = obj_serviceinstance as Ruanal.Job.JobServiceBase; string InstanceId = Guid.NewGuid().ToString().Replace("-", ""); currinstance.ParentCaller = new Job.ParentCaller(InstanceId, JobItem_Caller); currinstance.Loger = new Job.CrossLoger(InstanceId, ServiceLogHandler); currinstance.GlobalInit(RLib.Utils.DataSerialize.SerializeJson(taskConfig)); currinstance.Init(); var sad = new ServiceAndDispatch() { innerService = currinstance, InstanceId = InstanceId }; if (nolink) { ((Ruanal.Job.JobProxy)obj_serviceinstance).InitProxy(TaskDetail.EnterDll, TaskDetail.EnterClass); } GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced); return(sad); } else { throw new Exception(string.Format("类型{0}不是{1}类型", TaskDetail.EnterClass, typeof(Ruanal.Job.JobServiceBase).Name)); } }
private void _StopServiceInstance(ServiceAndDispatch a, bool dispose) { if (a.innerService != null) { a.innerService.Stop(); if (dispose) { a.innerService.Loger = null; a.innerService.ParentCaller = null; a.innerService.Dispose(); } } if (a.RunThread != null) { if (a.RunThread.IsAlive) { a.RunThread.Abort(); } a.RunThread = null; } a.RunGuid = ""; a.IsRunning = false; }
private void _StartServiceInstance(ServiceAndDispatch service) { service.RunThread = System.Threading.Thread.CurrentThread; service.lastRunTime = DateTime.Now; }