Example #1
0
 public void RunJob(JobDoWorkEventArgs arg)
 {
     DoJob(null, arg);
 }
        static private void ScheduleJobBackgroundLocal(JRunningJob job)
        {
            BackgroundWorker worker = new AbortableBackgroundWorker();

            worker.WorkerSupportsCancellation = true;
            worker.WorkerReportsProgress      = true;
            worker.DoWork += (sd, ew) =>
            {
                BackgroundWorker wk = sd as BackgroundWorker;
                if (wk.CancellationPending)
                {
                    ew.Cancel = true;
                    return;
                }
                try
                {
                    JobDoWorkEventArgs arg = new JobDoWorkEventArgs();
                    job.JobLog.Info("Job started " + job.Name);
                    arg.StageResult = RunningJobResultEnum.ok;
                    job.Stage       = RunningJobStageEnum.running.ToString();
                    job.JJobType.JobBatchRunningDict.TryAdd(job.JRunningJobId, job);
                    Dm.Instance.SaveObject(job);
                    job.RunJob(arg);
                    if (arg.StageResult == RunningJobResultEnum.ok)
                    {
                        ew.Result = RunningJobStageEnum.complated;
                    }
                    else if (arg.StageResult == RunningJobResultEnum.warning)
                    {
                        ew.Result = RunningJobStageEnum.warning;
                    }
                    else if (arg.StageResult == RunningJobResultEnum.error)
                    {
                        ew.Result = RunningJobStageEnum.error;
                    }
                    if (job.CancellationPending)
                    {
                        ew.Cancel = true;
                    }
                }
                catch (Exception ex)
                {
                    if (ex is System.Threading.ThreadAbortException)
                    {
                        job.JobLog.Warn("Job aborted");
                    }
                    else
                    {
                        job.JobLog.Error("Job fatal error", ex);
                    }
                    ew.Result = RunningJobStageEnum.exception;
                    JobManager.Instance.ComplateJob(job, RunningJobStageEnum.exception);
                }
                finally
                {
                    ResetJob(job);
                }
            };
            worker.RunWorkerCompleted += (sd, ek) =>
            {
                if (ek.Cancelled == true)
                {
                    job.JobLog.Debug("Job aborted");
                    JobManager.Instance.ComplateJob(job, RunningJobStageEnum.aborted);
                }
                else
                {
                    if (RunningJobStageEnum.exception.Equals(ek.Result))
                    {
                        //do nothing
                    }
                    else if (RunningJobStageEnum.warning.Equals(ek.Result))
                    {
                        JobManager.Instance.ComplateJob(job, RunningJobStageEnum.warning);
                    }
                    else if (RunningJobStageEnum.error.Equals(ek.Result))
                    {
                        JobManager.Instance.ComplateJob(job, RunningJobStageEnum.error);
                    }
                    else
                    {
                        JobManager.Instance.ComplateJob(job, RunningJobStageEnum.complated);
                    }
                }
            };
            worker.ProgressChanged += (sd, pc) =>
            {
                localReportProgresJob(job, pc.ProgressPercentage);
            };
            //run worker
            job.JobObject = worker;
            (job.JobObject as BackgroundWorker).RunWorkerAsync();
            if (job.JJobType != null)
            {
                job.JJobType.LastRunDate = DateTimeOffset.Now;
                Dm.Instance.SaveObject(job.JJobType);
            }
        }