protected override void DoWork() { using (var scope = ServiceScopeFactory.CreateScope()) { var store = scope.ServiceProvider.GetRequiredService <IBackgroundJobStore>(); var waitingJobs = store.GetWaitingJobs(WorkerOptions.MaxJobFetchCount); if (!waitingJobs.Any()) { return; } var jobExecuter = scope.ServiceProvider.GetRequiredService <IBackgroundJobExecuter>(); var clock = scope.ServiceProvider.GetRequiredService <IClock>(); var serializer = scope.ServiceProvider.GetRequiredService <IBackgroundJobSerializer>(); foreach (var jobInfo in waitingJobs) { jobInfo.TryCount++; jobInfo.LastTryTime = clock.Now; try { var jobConfiguration = JobOptions.GetJob(jobInfo.JobName); var jobArgs = serializer.Deserialize(jobInfo.JobArgs, jobConfiguration.ArgsType); var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, jobArgs); try { jobExecuter.Execute(context); store.Delete(jobInfo.Id); } catch (BackgroundJobExecutionException) { var nextTryTime = CalculateNextTryTime(jobInfo, clock); if (nextTryTime.HasValue) { jobInfo.NextTryTime = nextTryTime.Value; } else { jobInfo.IsAbandoned = true; } TryUpdate(store, jobInfo); } } catch (Exception ex) { Logger.LogException(ex); jobInfo.IsAbandoned = true; TryUpdate(store, jobInfo); } } } }
protected async override Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext) { var store = workerContext.ServiceProvider.GetRequiredService <IBackgroundJobStore>(); var waitingJobs = await store.GetWaitingJobsAsync(WorkerOptions.MaxJobFetchCount); if (!waitingJobs.Any()) { return; } var jobExecuter = workerContext.ServiceProvider.GetRequiredService <IBackgroundJobExecuter>(); var clock = workerContext.ServiceProvider.GetRequiredService <IClock>(); var serializer = workerContext.ServiceProvider.GetRequiredService <IBackgroundJobSerializer>(); foreach (var jobInfo in waitingJobs) { jobInfo.TryCount++; jobInfo.LastTryTime = clock.Now; try { var jobConfiguration = JobOptions.GetJob(jobInfo.JobName); var jobArgs = serializer.Deserialize(jobInfo.JobArgs, jobConfiguration.ArgsType); var context = new JobExecutionContext(workerContext.ServiceProvider, jobConfiguration.JobType, jobArgs); try { await jobExecuter.ExecuteAsync(context); await store.DeleteAsync(jobInfo.Id); } catch (BackgroundJobExecutionException) { var nextTryTime = CalculateNextTryTime(jobInfo, clock); if (nextTryTime.HasValue) { jobInfo.NextTryTime = nextTryTime.Value; } else { jobInfo.IsAbandoned = true; } await TryUpdateAsync(store, jobInfo); } } catch (Exception ex) { Logger.LogException(ex); jobInfo.IsAbandoned = true; await TryUpdateAsync(store, jobInfo); } } }
protected override void DoWork() { var waitingJobs = AsyncHelper.RunSync(() => Store.GetWaitingJobsAsync(WorkerOptions.MaxJobFetchCount)); foreach (var jobInfo in waitingJobs) { jobInfo.TryCount++; jobInfo.LastTryTime = Clock.Now; try { var jobConfiguration = JobOptions.GetJob(jobInfo.JobName); var jobArgs = Serializer.Deserialize(jobInfo.JobArgs, jobConfiguration.ArgsType); var context = new JobExecutionContext(jobConfiguration.JobType, jobArgs); try { JobExecuter.Execute(context); AsyncHelper.RunSync(() => Store.DeleteAsync(jobInfo.Id)); } catch (BackgroundJobExecutionException) { var nextTryTime = CalculateNextTryTime(jobInfo); if (nextTryTime.HasValue) { jobInfo.NextTryTime = nextTryTime.Value; } else { jobInfo.IsAbandoned = true; } TryUpdate(jobInfo); } } catch (Exception ex) { Logger.LogException(ex); jobInfo.IsAbandoned = true; TryUpdate(jobInfo); } } }