Browse Source

#1403 Refactor BackgroundJobWorker

pull/1406/head
Halil İbrahim Kalkan 7 years ago
parent
commit
5c38eef332
  1. 35
      framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs

35
framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs

@ -1,4 +1,5 @@
using System; using System;
using System.Linq;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
@ -11,26 +12,19 @@ namespace Volo.Abp.BackgroundJobs
{ {
public class BackgroundJobWorker : PeriodicBackgroundWorkerBase, IBackgroundJobWorker, ISingletonDependency public class BackgroundJobWorker : PeriodicBackgroundWorkerBase, IBackgroundJobWorker, ISingletonDependency
{ {
protected IBackgroundJobExecuter JobExecuter { get; }
protected BackgroundJobOptions JobOptions { get; } protected BackgroundJobOptions JobOptions { get; }
protected BackgroundJobWorkerOptions WorkerOptions { get; } protected BackgroundJobWorkerOptions WorkerOptions { get; }
protected IClock Clock { get; }
protected IBackgroundJobSerializer Serializer { get; }
protected IServiceScopeFactory ServiceScopeFactory { get; } protected IServiceScopeFactory ServiceScopeFactory { get; }
public BackgroundJobWorker( public BackgroundJobWorker(
AbpTimer timer, AbpTimer timer,
IBackgroundJobExecuter jobExecuter,
IBackgroundJobSerializer serializer,
IOptions<BackgroundJobOptions> jobOptions, IOptions<BackgroundJobOptions> jobOptions,
IOptions<BackgroundJobWorkerOptions> workerOptions, IOptions<BackgroundJobWorkerOptions> workerOptions,
IClock clock,
IServiceScopeFactory serviceScopeFactory) IServiceScopeFactory serviceScopeFactory)
: base(timer) : base(timer)
{ {
JobExecuter = jobExecuter;
Serializer = serializer;
Clock = clock;
ServiceScopeFactory = serviceScopeFactory; ServiceScopeFactory = serviceScopeFactory;
WorkerOptions = workerOptions.Value; WorkerOptions = workerOptions.Value;
JobOptions = jobOptions.Value; JobOptions = jobOptions.Value;
@ -47,25 +41,36 @@ namespace Volo.Abp.BackgroundJobs
() => store.GetWaitingJobsAsync(WorkerOptions.MaxJobFetchCount) () => store.GetWaitingJobsAsync(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) foreach (var jobInfo in waitingJobs)
{ {
jobInfo.TryCount++; jobInfo.TryCount++;
jobInfo.LastTryTime = Clock.Now; jobInfo.LastTryTime = clock.Now;
try try
{ {
var jobConfiguration = JobOptions.GetJob(jobInfo.JobName); var jobConfiguration = JobOptions.GetJob(jobInfo.JobName);
var jobArgs = Serializer.Deserialize(jobInfo.JobArgs, jobConfiguration.ArgsType); var jobArgs = serializer.Deserialize(jobInfo.JobArgs, jobConfiguration.ArgsType);
var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, jobArgs); var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, jobArgs);
try try
{ {
JobExecuter.Execute(context); jobExecuter.Execute(context);
AsyncHelper.RunSync(() => store.DeleteAsync(jobInfo.Id)); AsyncHelper.RunSync(() => store.DeleteAsync(jobInfo.Id));
} }
catch (BackgroundJobExecutionException) catch (BackgroundJobExecutionException)
{ {
var nextTryTime = CalculateNextTryTime(jobInfo); var nextTryTime = CalculateNextTryTime(jobInfo, clock);
if (nextTryTime.HasValue) if (nextTryTime.HasValue)
{ {
jobInfo.NextTryTime = nextTryTime.Value; jobInfo.NextTryTime = nextTryTime.Value;
@ -100,12 +105,12 @@ namespace Volo.Abp.BackgroundJobs
} }
} }
protected virtual DateTime? CalculateNextTryTime(BackgroundJobInfo jobInfo) //TODO: Move to another place to override easier protected virtual DateTime? CalculateNextTryTime(BackgroundJobInfo jobInfo, IClock clock)
{ {
var nextWaitDuration = WorkerOptions.DefaultFirstWaitDuration * (Math.Pow(WorkerOptions.DefaultWaitFactor, jobInfo.TryCount - 1)); var nextWaitDuration = WorkerOptions.DefaultFirstWaitDuration * (Math.Pow(WorkerOptions.DefaultWaitFactor, jobInfo.TryCount - 1));
var nextTryDate = jobInfo.LastTryTime.HasValue var nextTryDate = jobInfo.LastTryTime.HasValue
? jobInfo.LastTryTime.Value.AddSeconds(nextWaitDuration) ? jobInfo.LastTryTime.Value.AddSeconds(nextWaitDuration)
: Clock.Now.AddSeconds(nextWaitDuration); : clock.Now.AddSeconds(nextWaitDuration);
if (nextTryDate.Subtract(jobInfo.CreationTime).TotalSeconds > WorkerOptions.DefaultTimeout) if (nextTryDate.Subtract(jobInfo.CreationTime).TotalSeconds > WorkerOptions.DefaultTimeout)
{ {

Loading…
Cancel
Save