|
|
|
|
@ -1,4 +1,5 @@
|
|
|
|
|
using System;
|
|
|
|
|
using System.Linq;
|
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
|
|
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
|
using Microsoft.Extensions.Options;
|
|
|
|
|
@ -11,26 +12,19 @@ namespace Volo.Abp.BackgroundJobs
|
|
|
|
|
{
|
|
|
|
|
public class BackgroundJobWorker : PeriodicBackgroundWorkerBase, IBackgroundJobWorker, ISingletonDependency
|
|
|
|
|
{
|
|
|
|
|
protected IBackgroundJobExecuter JobExecuter { get; }
|
|
|
|
|
protected BackgroundJobOptions JobOptions { get; }
|
|
|
|
|
|
|
|
|
|
protected BackgroundJobWorkerOptions WorkerOptions { get; }
|
|
|
|
|
protected IClock Clock { get; }
|
|
|
|
|
protected IBackgroundJobSerializer Serializer { get; }
|
|
|
|
|
|
|
|
|
|
protected IServiceScopeFactory ServiceScopeFactory { get; }
|
|
|
|
|
|
|
|
|
|
public BackgroundJobWorker(
|
|
|
|
|
AbpTimer timer,
|
|
|
|
|
IBackgroundJobExecuter jobExecuter,
|
|
|
|
|
IBackgroundJobSerializer serializer,
|
|
|
|
|
IOptions<BackgroundJobOptions> jobOptions,
|
|
|
|
|
IOptions<BackgroundJobWorkerOptions> workerOptions,
|
|
|
|
|
IClock clock,
|
|
|
|
|
IServiceScopeFactory serviceScopeFactory)
|
|
|
|
|
: base(timer)
|
|
|
|
|
{
|
|
|
|
|
JobExecuter = jobExecuter;
|
|
|
|
|
Serializer = serializer;
|
|
|
|
|
Clock = clock;
|
|
|
|
|
ServiceScopeFactory = serviceScopeFactory;
|
|
|
|
|
WorkerOptions = workerOptions.Value;
|
|
|
|
|
JobOptions = jobOptions.Value;
|
|
|
|
|
@ -47,25 +41,36 @@ namespace Volo.Abp.BackgroundJobs
|
|
|
|
|
() => 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)
|
|
|
|
|
{
|
|
|
|
|
jobInfo.TryCount++;
|
|
|
|
|
jobInfo.LastTryTime = Clock.Now;
|
|
|
|
|
jobInfo.LastTryTime = clock.Now;
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
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);
|
|
|
|
|
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
JobExecuter.Execute(context);
|
|
|
|
|
jobExecuter.Execute(context);
|
|
|
|
|
|
|
|
|
|
AsyncHelper.RunSync(() => store.DeleteAsync(jobInfo.Id));
|
|
|
|
|
}
|
|
|
|
|
catch (BackgroundJobExecutionException)
|
|
|
|
|
{
|
|
|
|
|
var nextTryTime = CalculateNextTryTime(jobInfo);
|
|
|
|
|
var nextTryTime = CalculateNextTryTime(jobInfo, clock);
|
|
|
|
|
|
|
|
|
|
if (nextTryTime.HasValue)
|
|
|
|
|
{
|
|
|
|
|
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 nextTryDate = jobInfo.LastTryTime.HasValue
|
|
|
|
|
? jobInfo.LastTryTime.Value.AddSeconds(nextWaitDuration)
|
|
|
|
|
: Clock.Now.AddSeconds(nextWaitDuration);
|
|
|
|
|
: clock.Now.AddSeconds(nextWaitDuration);
|
|
|
|
|
|
|
|
|
|
if (nextTryDate.Subtract(jobInfo.CreationTime).TotalSeconds > WorkerOptions.DefaultTimeout)
|
|
|
|
|
{
|
|
|
|
|
|