Browse Source

Merge pull request #7216 from abpframework/liangshiwei/quartz

Always store string type values to JobDataMap
pull/7218/head
maliming 6 years ago
committed by GitHub
parent
commit
52b8c0df9f
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 16
      framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs
  2. 14
      framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs
  3. 20
      framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs

16
framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs

@ -10,7 +10,7 @@ namespace Volo.Abp.BackgroundJobs.Quartz
public int RetryCount { get; set; } public int RetryCount { get; set; }
public int RetryIntervalMillisecond { get; set; } public int RetryIntervalMillisecond { get; set; }
[NotNull] [NotNull]
public Func<int, IJobExecutionContext, JobExecutionException,Task> RetryStrategy public Func<int, IJobExecutionContext, JobExecutionException,Task> RetryStrategy
@ -19,28 +19,28 @@ namespace Volo.Abp.BackgroundJobs.Quartz
set => _retryStrategy = Check.NotNull(value, nameof(value)); set => _retryStrategy = Check.NotNull(value, nameof(value));
} }
private Func<int, IJobExecutionContext, JobExecutionException,Task> _retryStrategy; private Func<int, IJobExecutionContext, JobExecutionException,Task> _retryStrategy;
public AbpBackgroundJobQuartzOptions() public AbpBackgroundJobQuartzOptions()
{ {
RetryCount = 3; RetryCount = 3;
RetryIntervalMillisecond = 3000; RetryIntervalMillisecond = 3000;
_retryStrategy = DefaultRetryStrategy; _retryStrategy = DefaultRetryStrategy;
} }
private async Task DefaultRetryStrategy(int retryIndex, IJobExecutionContext executionContext, JobExecutionException exception) private async Task DefaultRetryStrategy(int retryIndex, IJobExecutionContext executionContext, JobExecutionException exception)
{ {
exception.RefireImmediately = true; exception.RefireImmediately = true;
var retryCount = executionContext.JobDetail.JobDataMap.GetIntValue(QuartzBackgroundJobManager.JobDataPrefix+ nameof(RetryCount)); var retryCount = executionContext.JobDetail.JobDataMap.GetString(QuartzBackgroundJobManager.JobDataPrefix+ nameof(RetryCount)).To<int>();
if (retryIndex > retryCount) if (retryIndex > retryCount)
{ {
exception.RefireImmediately = false; exception.RefireImmediately = false;
exception.UnscheduleAllTriggers = true; exception.UnscheduleAllTriggers = true;
return; return;
} }
var retryInterval = executionContext.JobDetail.JobDataMap.GetIntValue(QuartzBackgroundJobManager.JobDataPrefix+ nameof(RetryIntervalMillisecond)); var retryInterval = executionContext.JobDetail.JobDataMap.GetString(QuartzBackgroundJobManager.JobDataPrefix+ nameof(RetryIntervalMillisecond)).To<int>();
await Task.Delay(retryInterval); await Task.Delay(retryInterval);
} }
} }
} }

14
framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs

@ -3,6 +3,7 @@ using System.Threading.Tasks;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Quartz; using Quartz;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Json;
namespace Volo.Abp.BackgroundJobs.Quartz namespace Volo.Abp.BackgroundJobs.Quartz
{ {
@ -16,9 +17,12 @@ namespace Volo.Abp.BackgroundJobs.Quartz
protected AbpBackgroundJobQuartzOptions Options { get; } protected AbpBackgroundJobQuartzOptions Options { get; }
public QuartzBackgroundJobManager(IScheduler scheduler, IOptions<AbpBackgroundJobQuartzOptions> options) protected IJsonSerializer JsonSerializer { get; }
public QuartzBackgroundJobManager(IScheduler scheduler, IOptions<AbpBackgroundJobQuartzOptions> options, IJsonSerializer jsonSerializer)
{ {
Scheduler = scheduler; Scheduler = scheduler;
JsonSerializer = jsonSerializer;
Options = options.Value; Options = options.Value;
} }
@ -33,10 +37,10 @@ namespace Volo.Abp.BackgroundJobs.Quartz
{ {
var jobDataMap = new JobDataMap var jobDataMap = new JobDataMap
{ {
{nameof(TArgs), args}, {nameof(TArgs), JsonSerializer.Serialize(args)},
{JobDataPrefix+ nameof(Options.RetryCount), retryCount}, {JobDataPrefix+ nameof(Options.RetryCount), retryCount.ToString()},
{JobDataPrefix+ nameof(Options.RetryIntervalMillisecond), retryIntervalMillisecond}, {JobDataPrefix+ nameof(Options.RetryIntervalMillisecond), retryIntervalMillisecond.ToString()},
{JobDataPrefix+ RetryIndex, 0} {JobDataPrefix+ RetryIndex, "0"}
}; };
var jobDetail = JobBuilder.Create<QuartzJobExecutionAdapter<TArgs>>().RequestRecovery().SetJobData(jobDataMap).Build(); var jobDetail = JobBuilder.Create<QuartzJobExecutionAdapter<TArgs>>().RequestRecovery().SetJobData(jobDataMap).Build();

20
framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs

@ -5,6 +5,7 @@ using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Quartz; using Quartz;
using Volo.Abp.Json;
namespace Volo.Abp.BackgroundJobs.Quartz namespace Volo.Abp.BackgroundJobs.Quartz
{ {
@ -16,15 +17,18 @@ namespace Volo.Abp.BackgroundJobs.Quartz
protected AbpBackgroundJobQuartzOptions BackgroundJobQuartzOptions { get; } protected AbpBackgroundJobQuartzOptions BackgroundJobQuartzOptions { get; }
protected IServiceScopeFactory ServiceScopeFactory { get; } protected IServiceScopeFactory ServiceScopeFactory { get; }
protected IBackgroundJobExecuter JobExecuter { get; } protected IBackgroundJobExecuter JobExecuter { get; }
protected IJsonSerializer JsonSerializer { get; }
public QuartzJobExecutionAdapter( public QuartzJobExecutionAdapter(
IOptions<AbpBackgroundJobOptions> options, IOptions<AbpBackgroundJobOptions> options,
IOptions<AbpBackgroundJobQuartzOptions> backgroundJobQuartzOptions, IOptions<AbpBackgroundJobQuartzOptions> backgroundJobQuartzOptions,
IBackgroundJobExecuter jobExecuter, IBackgroundJobExecuter jobExecuter,
IServiceScopeFactory serviceScopeFactory) IServiceScopeFactory serviceScopeFactory,
IJsonSerializer jsonSerializer)
{ {
JobExecuter = jobExecuter; JobExecuter = jobExecuter;
ServiceScopeFactory = serviceScopeFactory; ServiceScopeFactory = serviceScopeFactory;
JsonSerializer = jsonSerializer;
Options = options.Value; Options = options.Value;
BackgroundJobQuartzOptions = backgroundJobQuartzOptions.Value; BackgroundJobQuartzOptions = backgroundJobQuartzOptions.Value;
Logger = NullLogger<QuartzJobExecutionAdapter<TArgs>>.Instance; Logger = NullLogger<QuartzJobExecutionAdapter<TArgs>>.Instance;
@ -34,7 +38,7 @@ namespace Volo.Abp.BackgroundJobs.Quartz
{ {
using (var scope = ServiceScopeFactory.CreateScope()) using (var scope = ServiceScopeFactory.CreateScope())
{ {
var args = (TArgs) context.JobDetail.JobDataMap.Get(nameof(TArgs)); var args = JsonSerializer.Deserialize<TArgs>(context.JobDetail.JobDataMap.GetString(nameof(TArgs)));
var jobType = Options.GetJob(typeof(TArgs)).JobType; var jobType = Options.GetJob(typeof(TArgs)).JobType;
var jobContext = new JobExecutionContext(scope.ServiceProvider, jobType, args); var jobContext = new JobExecutionContext(scope.ServiceProvider, jobType, args);
try try
@ -44,16 +48,16 @@ namespace Volo.Abp.BackgroundJobs.Quartz
catch (Exception exception) catch (Exception exception)
{ {
var jobExecutionException = new JobExecutionException(exception); var jobExecutionException = new JobExecutionException(exception);
var retryIndex = context.JobDetail.JobDataMap.GetIntValue(QuartzBackgroundJobManager.JobDataPrefix+ QuartzBackgroundJobManager.RetryIndex); var retryIndex = context.JobDetail.JobDataMap.GetString(QuartzBackgroundJobManager.JobDataPrefix+ QuartzBackgroundJobManager.RetryIndex).To<int>();
retryIndex++; retryIndex++;
context.JobDetail.JobDataMap.Put(QuartzBackgroundJobManager.JobDataPrefix+ QuartzBackgroundJobManager.RetryIndex, retryIndex); context.JobDetail.JobDataMap.Put(QuartzBackgroundJobManager.JobDataPrefix+ QuartzBackgroundJobManager.RetryIndex, retryIndex.ToString());
await BackgroundJobQuartzOptions.RetryStrategy.Invoke(retryIndex, context, jobExecutionException); await BackgroundJobQuartzOptions.RetryStrategy.Invoke(retryIndex, context, jobExecutionException);
throw jobExecutionException; throw jobExecutionException;
} }
} }
} }
} }
} }

Loading…
Cancel
Save