void ISchedulerService.Update(WaitingResumption r) { _resumptionRepository.Update(r); }
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); } } }