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(); } } }