Example #1
0
        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);
        }
Example #2
0
        /// <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;
            }
        }
Example #3
0
        /// <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);
        }
Example #4
0
        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;
                }
            }
        }
Example #5
0
        /// <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);
            }
        }
Example #6
0
        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));
            }
        }
Example #7
0
 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;
 }
Example #8
0
 private void _StartServiceInstance(ServiceAndDispatch service)
 {
     service.RunThread   = System.Threading.Thread.CurrentThread;
     service.lastRunTime = DateTime.Now;
 }