示例#1
0
        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);
                }
            }
        }
示例#2
0
        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);
            }
        }