internal void UpdateScheduleDueTime() { var now = TimeProvider.GetCurrentTime(); lock (_lock) { if (_isDisposed) { _logger.Warning( $"Rejected attempt to update schedule due time of an exposed '{this.GetType().FullName}'.", nameof(UpdateScheduleDueTime)); return; } try { _scheduleDueTime = _schedule.GetDueTimeAfter(now.AddTicks(1)); if (_scheduleDueTime < now) { _logger.Warning( "Due time is earlier than current time. Due time is changed to 'never'.", nameof(UpdateScheduleDueTime)); _scheduleDueTime = JobExtensions.Never; } else if (_scheduleDueTime > JobExtensions.Never) { _logger.Warning( "Due time is later than 'never'. Due time is changed to 'never'.", nameof(UpdateScheduleDueTime)); _scheduleDueTime = JobExtensions.Never; } } catch (Exception ex) { _scheduleDueTime = JobExtensions.Never; _logger.Warning( "An exception was thrown on attempt to calculate due time. Due time is changed to 'never'.", nameof(UpdateScheduleDueTime), ex); } } }
internal RunContext( Runner initiator, JobStartReason startReason, CancellationToken?token) { _initiator = initiator; var jobProperties = _initiator.JobPropertiesHolder.ToJobProperties(); _tokenSource = token.HasValue ? CancellationTokenSource.CreateLinkedTokenSource(token.Value) : new CancellationTokenSource(); _systemWriter = new StringWriterWithEncoding(Encoding.UTF8); var writers = new List <TextWriter> { _systemWriter, }; if (jobProperties.Output != null) { writers.Add(jobProperties.Output); } var multiTextWriter = new MultiTextWriter(Encoding.UTF8, writers); var dueTimeInfo = _initiator.DueTimeHolder.GetDueTimeInfo(); var dueTime = dueTimeInfo.GetEffectiveDueTime(); var dueTimeWasOverridden = dueTimeInfo.IsDueTimeOverridden(); var now = TimeProvider.GetCurrentTime(); _runInfoBuilder = new JobRunInfoBuilder( initiator.JobRunsHolder.Count, startReason, dueTime, dueTimeWasOverridden, now, JobRunStatus.Running, _systemWriter); _logger = new ObjectLogger(this, _initiator.JobName) { IsEnabled = _initiator.IsLoggingEnabled, }; try { _task = jobProperties.Routine( jobProperties.Parameter, jobProperties.ProgressTracker, multiTextWriter, _tokenSource.Token); // todo: if routine returns null? if (_task.IsFaulted && _task.Exception != null) { var ex = ExtractTaskException(_task.Exception); multiTextWriter.WriteLine(ex); _logger.Warning("Routine has thrown an exception.", "ctor", ex); _task = Task.FromException(ex); } } catch (Exception ex) { // it is not an error if Routine throws, but let's log it as a warning. multiTextWriter.WriteLine(ex); _logger.Warning("Routine has thrown an exception.", "ctor", ex); _task = Task.FromException(ex); } }