private async void TimerElapsed(object sender, ElapsedEventArgs e) { List <ITimedJob> timedJobs = new List <ITimedJob>(); using (FitzContext db = this.dbFactory.Create()) { List <Job> jobs = db.Jobs.ToList(); foreach (ITimedJob timedJob in this.services.GetServices <ITimedJob>()) { string jobName = timedJob.GetType().FullName; Job job = jobs.Where(j => j.Name == jobName).FirstOrDefault(); if (job == null) { job = new Job() { Name = jobName, LastExecution = DateTime.UnixEpoch.ToUniversalTime(), }; db.Jobs.Add(job); } if ((DateTime.UtcNow - job.LastExecution).TotalMinutes >= timedJob.Interval) { timedJobs.Add(timedJob); job.LastExecution = DateTime.UtcNow; } } await db.SaveChangesAsync().ConfigureAwait(false); } if (timedJobs.Count > 0) { await this.activityManager.TrySetActivityAsync($"{timedJobs.Count} job(s)", ActivityType.Watching, true).ConfigureAwait(false); Task jobs = Task.WhenAll(timedJobs.Select(t => t.Execute())); try { await jobs.ConfigureAwait(false); } #pragma warning disable CA1031 // Do not catch general exception types catch (Exception) #pragma warning restore CA1031 // Do not catch general exception types { this.bloonLog.Error($"{jobs.Exception.InnerExceptions.Count} job(s) failed! Check logs"); Log.Error(jobs.Exception, "One or more jobs failed."); } } }
public PublicCommands(FitzContext db) { this.db = db; }