private void CheckMaxError(IApp app, IJob job) { // 出错时判断如果超过最大错误数,则停止作业 var maxError = job.MaxError < 1 ? 100 : job.MaxError; if (job.Enable && job.Error > maxError) { job.MaxError = maxError; job.Enable = false; //job.SaveAsync(); (job as IEntity).Update(); } }
private JobError SetJobError(IJob job, JobTask task, IDictionary <String, Object> ps) { var err = new JobError { AppID = job.AppID, JobID = job.ID, Start = task.Start, End = task.End, Step = task.Step, BatchSize = task.BatchSize, Server = task.Server, ProcessID = task.ProcessID, Client = task.Client, CreateTime = DateTime.Now, UpdateTime = DateTime.Now, }; err.Key = task.Key; err.Data = ps["Data"] + ""; var code = ps["ErrorCode"] + ""; if (code != nameof(Exception)) { code = code.TrimEnd(nameof(Exception)); } err.ErrorCode = code; var msg = task.Message; if (!msg.IsNullOrEmpty() && msg.Contains("Exception:")) { msg = msg.Substring("Exception:").Trim(); } err.Message = msg; err.Insert(); return(err); }
public static void AdjustStep(IJob job, JobTask ji, IExtend ext) { // 不许动态调节步进 if (job.StepRate == 0 || job.MinStep == job.MaxStep) { return; } //// 向前调节步进,避免多线程时间错乱 //var dt = ext["Step_Last"].ToDateTime(); //if (dt.Year > 2000 && ji.Start <= dt) return; //ext["Step_Last"] = ji.Start; // 新步进 var st = 0L; var near = false; var adjust = false; // 计算停止线,需要注意偏移量 var end = job.End; if (end.Year <= 2000 || end > DateTime.Now) { end = DateTime.Now.AddSeconds(-job.Offset); } // 距离目标较近时步进减半 if (ji.End.AddSeconds(ji.Step) > end) { st = ji.Step; while (st > 0 && ji.End.AddSeconds(st) > end) { st /= 2; } near = true; } else { if (ji.Total > 0) { // 逼近批大小 st = (Int64)ji.BatchSize * ji.Step / ji.Total; adjust = true; } // 踩空逻辑 else { // 距离目标较远时加大步进 //st = job.MaxStep; st = (Int32)(ji.Step * (1 + job.StepRate / 100.0)); } // 步进率 var jstep = ji.Step; var rate = jstep == 0 ? 0 : (st - jstep) * 100.0 / jstep; // 变化不能超过比率 if (Math.Abs(rate) > job.StepRate) { rate = job.StepRate; if (st < jstep) { rate = -rate; } st = (Int32)(jstep + rate * jstep / 100); } } // 限制最大最小步进 if (st < job.MinStep) { st = job.MinStep; } else if (st > job.MaxStep) { st = job.MaxStep; } if (st == job.Step) { return; } // 踩空时要求步进没有改变过 if (near || adjust || job.Step == ji.Step) { job.Step = (Int32)st; } }