Example #1
0
        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();
            }
        }
Example #2
0
        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);
        }
Example #3
0
        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;
            }
        }