コード例 #1
0
        public async Task ExecuteAsync(string scheduleCronExpression)
        {
            if (!await Lock.WaitAsync(TimeSpan.FromMilliseconds(100)))
            {
                _log.Info("Job execution has been skipped because previous job is still executing");
                return;
            }

            try
            {
                var scheduleCron = CronExpression.Parse(scheduleCronExpression);

                _log.Info
                (
                    $"Executing the job. Schedule CRON: {scheduleCron}, balances interval: {_reportSettings.BalancesIntervalFromSchedule}"
                );

                var lastOccurrence = await _lastReportOccurrenceRepository.GetLastOccurrenceOrDefaultAsync();

                var now = DateTime.UtcNow;

                _log.Info($"Last report occurence is [{lastOccurrence:s}]");

                var missedOccurrencesProvider = new JobMissedOccurrencesProvider();
                var missedOccurrences         = missedOccurrencesProvider.GetMissedOccurrenceAsync(scheduleCron, lastOccurrence, now);

                _log.Info("Missed occurrences", missedOccurrences);

                foreach (var occurrence in missedOccurrences)
                {
                    await _reportBuilder.BuildAsync(occurrence + _reportSettings.BalancesIntervalFromSchedule);

                    await _lastReportOccurrenceRepository.SaveLastOccurrenceAsync(occurrence);
                }
            }
            finally
            {
                Lock.Release();

                _log.Info("Job execution has been finished");
            }
        }
 public JobMissedOccurrencesProviderTests()
 {
     _provider = new JobMissedOccurrencesProvider();
 }