Пример #1
0
        public void Execute(IJobExecutionContext context)
        {
            try
            {
                JobKey key = context.JobDetail.Key;
                _jobKey = key.ToString();
                JobDataMap dataMap = context.MergedJobDataMap;
                context.ClearOutputBuffer();

                if ((context.RefireCount > 0) && (context.RefireCount > MaxRetries))
                {
                    WriteImmediatelyToOutputLog(context, $"No more retries available for job {key}.  Setting status to Failed.");
                    context.Result = JobExecutionStatus.Failed;
                }
                else
                {
                    var consoleRunner = new Process
                    {
                        StartInfo =
                        {
                            CreateNoWindow         = false,
                            FileName               = ExecutableName,
                            Arguments              = Parameters,
                            UseShellExecute        = false,
                            RedirectStandardOutput = true,
                            RedirectStandardError  = true
                        },
                        EnableRaisingEvents = true,
                    };

                    WriteImmediatelyToOutputLog(context, "--------------------------------------------------------------------------");
                    WriteImmediatelyToOutputLog(context, $"Attempt {context.RefireCount+1} of {MaxRetries+1}: About to run {key} at {DateTime.Now:dd/MM/yyyy HH:mm:ss.fff}");
                    WriteImmediatelyToOutputLog(context, $"FileName: {ExecutableName}, Parameters: {Parameters}");

                    consoleRunner.Exited += ConsoleRunner_Exited;

                    consoleRunner.Start();

                    context.Put(Constants.FieldNames.ProcessId, consoleRunner.Id);
                    WriteImmediatelyToOutputLog(context, consoleRunner.StandardOutput.ReadToEnd());

                    consoleRunner.WaitForExit();

                    if (consoleRunner.ExitCode == 0)
                    {
                        context.Result = JobExecutionStatus.Succeeded;
                    }
                    else
                    {
                        throw new Exception("Process returned an error code");
                    }
                }
            }
            //Only JobExecutionExceptions are expected from jobs
            catch (Exception ex)
            {
                bool retry = true;

                var exception = ex as JobExecutionException;
                if (exception != null)
                {
                    retry = exception.RefireImmediately;
                }

                if (retry)
                {
                    WriteImmediatelyToOutputLog(context, $"Error executing job - {ex.Message}{Environment.NewLine}{ex.StackTrace}");
                    context.Result = JobExecutionStatus.Retrying;
                }
                else
                {
                    context.Result = JobExecutionStatus.Failed;
                }

                throw new JobExecutionException(ex)
                      {
                          RefireImmediately = retry
                      };
            }
            finally
            {
                if (GetOutputBufferContents().Length > 0)
                {
                    WriteImmediatelyToOutputLog(context, GetOutputBufferContents());
                    ClearOutputBuffer();
                }
            }
        }