Beispiel #1
0
 void ISchedulerService.Update(WaitingResumption r)
 {
     _resumptionRepository.Update(r);
 }
Beispiel #2
0
        public void Resume(WaitingResumption r)
        {
            if (r == null)
            {
                throw new InvalidOperationException("无效的恢复请求");
            }

            //HACK:时间调度有可能导致调度器被未满足请求占满,需要在ChargeResumption时预先进行过滤,在db处理
            if (!r.CanResumeAtNow)
            {
                if (this._log.IsDebugEnabled)
                {
                    this._log.Debug("当前时间未满足恢复时间条件");
                }
                return;
            }

            if (!r.CanExecuting)
            {
                r.SetInvalid();
                _repository.Update(r);
                this._log.WarnFormat("流程{0}#{1}处于{2}状态,该调度请求不允许被执行,取消该调度请求{3}#{4}"
                                     , r.Process.Title
                                     , r.Process.ID
                                     , r.Process.Status
                                     , r
                                     , r.ID);
                return;
            }

            var success = false;

            //TODO:是否需要并将流程置为Error状态?
            //恢复调度中的任何异常都不能影响调度过程,同时间调度的考虑一样,无法被执行调度也有可能堆积而影响调度
            try
            {
                DependencyResolver.Resolve <IWaitingResumptionHandle>(r.Handle).Resume(r);
                success = true;
                this._log.InfoFormat("[调度记录]{0}#{1}|Priority={2}|ProcessType={3}|ProcessId={4}"
                                     , r
                                     , r.ID
                                     , r.Priority
                                     , r.Process.ProcessType.Name
                                     , r.Process.ID);
            }
            catch (Exception e)
            {
                //TODO:将流程置为Error,此处异常通常是系统异常
                this._log.Error(string.Format("Resumption Error Occur At {0}#{1}", r, r.ID), e);
            }
            finally
            {
                //若允许重试,则可以继续被调度,要考虑重试堆积问题,可通过引入调度优先级来避免
                if (success || !r.EnableRetry)
                {
                    //将调度请求完成后置为失效
                    r.SetExecuted();
                    _repository.Update(r);
                }
            }
        }