From 8b59155d8875451f5ce08ce7365e935837b8d2ee Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 27 Mar 2020 17:35:42 +0800 Subject: [PATCH 01/11] Implement IsJobExecutionEnabled for all background job providers --- .../BackgroundJobs/AbpBackgroundJobOptions.cs | 3 +-- .../BackgroundJobs/NullBackgroundJobManager.cs | 3 ++- .../Hangfire/AbpBackgroundJobsHangfireModule.cs | 16 ++++++++++++---- .../Quartz/AbpBackgroundJobsQuartzModule.cs | 10 +++++++++- 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobOptions.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobOptions.cs index a16bc418a7..6ca409ec56 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobOptions.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobOptions.cs @@ -8,8 +8,7 @@ namespace Volo.Abp.BackgroundJobs { private readonly Dictionary _jobConfigurationsByArgsType; private readonly Dictionary _jobConfigurationsByName; - - //TODO: Implement for all providers! (Hangfire does not implement yet) + /// /// Default: true. /// diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/NullBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/NullBackgroundJobManager.cs index f7d9fdd88a..6c8c37d183 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/NullBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/NullBackgroundJobManager.cs @@ -19,7 +19,8 @@ namespace Volo.Abp.BackgroundJobs public virtual Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { - throw new AbpException("Background job system has not a real implementation. If it's mandatory, use an implementation (either the default provider or a 3rd party implementation). If it's optional, check IBackgroundJobManager.IsAvailable() extension method and act based on it."); + //throw new AbpException("Background job system has not a real implementation. If it's mandatory, use an implementation (either the default provider or a 3rd party implementation). If it's optional, check IBackgroundJobManager.IsAvailable() extension method and act based on it."); + return Task.FromResult(string.Empty); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs index 066dccc28f..0a534d819a 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs @@ -1,4 +1,5 @@ -using Volo.Abp.Hangfire; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Hangfire; using Volo.Abp.Modularity; namespace Volo.Abp.BackgroundJobs.Hangfire @@ -6,9 +7,16 @@ namespace Volo.Abp.BackgroundJobs.Hangfire [DependsOn( typeof(AbpBackgroundJobsAbstractionsModule), typeof(AbpHangfireModule) - )] + )] public class AbpBackgroundJobsHangfireModule : AbpModule { - + public override void ConfigureServices(ServiceConfigurationContext context) + { + var options = context.Services.ExecutePreConfiguredActions(); + if (!options.IsJobExecutionEnabled) + { + context.Services.AddSingleton(x => new NullBackgroundJobManager()); + } + } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs index d5f84ed91e..9f3d1b11a0 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs @@ -12,7 +12,15 @@ namespace Volo.Abp.BackgroundJobs.Quartz { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.AddTransient(typeof(QuartzJobExecutionAdapter<>)); + var options = context.Services.ExecutePreConfiguredActions(); + if (!options.IsJobExecutionEnabled) + { + context.Services.AddSingleton(x => new NullBackgroundJobManager()); + } + else + { + context.Services.AddTransient(typeof(QuartzJobExecutionAdapter<>)); + } } } } From b1bc0c353daff4a4ea0428be471b15df515d6beb Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 31 Mar 2020 14:43:17 +0800 Subject: [PATCH 02/11] Execute the job by determining IsJobExecutionEnabled --- .../BackgroundJobs/NullBackgroundJobManager.cs | 3 +-- .../Hangfire/HangfireJobExecutionAdapter.cs | 17 ++++++++++++++--- .../Quartz/AbpBackgroundJobsQuartzModule.cs | 14 +++----------- .../Quartz/QuartzJobExecutionAdapter.cs | 12 +++++++++++- 4 files changed, 29 insertions(+), 17 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/NullBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/NullBackgroundJobManager.cs index 6c8c37d183..f7d9fdd88a 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/NullBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/NullBackgroundJobManager.cs @@ -19,8 +19,7 @@ namespace Volo.Abp.BackgroundJobs public virtual Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { - //throw new AbpException("Background job system has not a real implementation. If it's mandatory, use an implementation (either the default provider or a 3rd party implementation). If it's optional, check IBackgroundJobManager.IsAvailable() extension method and act based on it."); - return Task.FromResult(string.Empty); + throw new AbpException("Background job system has not a real implementation. If it's mandatory, use an implementation (either the default provider or a 3rd party implementation). If it's optional, check IBackgroundJobManager.IsAvailable() extension method and act based on it."); } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs index 676a3eaafc..41398b5bb6 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs @@ -1,4 +1,6 @@ using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Volo.Abp.Threading; @@ -6,22 +8,31 @@ namespace Volo.Abp.BackgroundJobs.Hangfire { public class HangfireJobExecutionAdapter { + public ILogger> Logger { get; set; } + protected AbpBackgroundJobOptions Options { get; } protected IServiceScopeFactory ServiceScopeFactory { get; } protected IBackgroundJobExecuter JobExecuter { get; } public HangfireJobExecutionAdapter( - IOptions options, - IBackgroundJobExecuter jobExecuter, + IOptions options, + IBackgroundJobExecuter jobExecuter, IServiceScopeFactory serviceScopeFactory) { JobExecuter = jobExecuter; ServiceScopeFactory = serviceScopeFactory; Options = options.Value; + Logger = NullLogger>.Instance; } public void Execute(TArgs args) { + if (!Options.IsJobExecutionEnabled) + { + Logger.LogWarning("Background jobs system is disabled"); + return; + } + using (var scope = ServiceScopeFactory.CreateScope()) { var jobType = Options.GetJob(typeof(TArgs)).JobType; @@ -30,4 +41,4 @@ namespace Volo.Abp.BackgroundJobs.Hangfire } } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs index 9f3d1b11a0..0e3d079acc 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs @@ -8,19 +8,11 @@ namespace Volo.Abp.BackgroundJobs.Quartz typeof(AbpBackgroundJobsAbstractionsModule), typeof(AbpQuartzModule) )] - public class AbpBackgroundJobsQuartzModule :AbpModule + public class AbpBackgroundJobsQuartzModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - var options = context.Services.ExecutePreConfiguredActions(); - if (!options.IsJobExecutionEnabled) - { - context.Services.AddSingleton(x => new NullBackgroundJobManager()); - } - else - { - context.Services.AddTransient(typeof(QuartzJobExecutionAdapter<>)); - } + context.Services.AddTransient(typeof(QuartzJobExecutionAdapter<>)); } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs index 85a1ef736f..2efe800c9c 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs @@ -1,6 +1,8 @@ using System; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Quartz; @@ -8,10 +10,11 @@ namespace Volo.Abp.BackgroundJobs.Quartz { public class QuartzJobExecutionAdapter : IJob { + public ILogger> Logger { get; set; } + protected AbpBackgroundJobOptions Options { get; } protected IServiceScopeFactory ServiceScopeFactory { get; } protected IBackgroundJobExecuter JobExecuter { get; } - public QuartzJobExecutionAdapter( IOptions options, IBackgroundJobExecuter jobExecuter, @@ -20,10 +23,17 @@ namespace Volo.Abp.BackgroundJobs.Quartz JobExecuter = jobExecuter; ServiceScopeFactory = serviceScopeFactory; Options = options.Value; + Logger = NullLogger>.Instance; } public async Task Execute(IJobExecutionContext context) { + if (!Options.IsJobExecutionEnabled) + { + Logger.LogWarning("Background jobs system is disabled"); + return; + } + using (var scope = ServiceScopeFactory.CreateScope()) { var args = (TArgs)context.JobDetail.JobDataMap.Get(nameof(TArgs)); From 5e7221ca372de1610817a237f9e7581ef5486b45 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Tue, 31 Mar 2020 15:19:27 +0800 Subject: [PATCH 03/11] Remove AbpBackgroundJobsHangfireModule code --- .../Hangfire/AbpBackgroundJobsHangfireModule.cs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs index 0a534d819a..27381f8e25 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs @@ -1,5 +1,4 @@ -using Microsoft.Extensions.DependencyInjection; -using Volo.Abp.Hangfire; +using Volo.Abp.Hangfire; using Volo.Abp.Modularity; namespace Volo.Abp.BackgroundJobs.Hangfire @@ -10,13 +9,5 @@ namespace Volo.Abp.BackgroundJobs.Hangfire )] public class AbpBackgroundJobsHangfireModule : AbpModule { - public override void ConfigureServices(ServiceConfigurationContext context) - { - var options = context.Services.ExecutePreConfiguredActions(); - if (!options.IsJobExecutionEnabled) - { - context.Services.AddSingleton(x => new NullBackgroundJobManager()); - } - } } } \ No newline at end of file From 2f381fa48547938a237b106550b68e2692f42ebc Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 13 Apr 2020 12:37:22 +0800 Subject: [PATCH 04/11] Re-implemented background job & worker disable logic --- .../AbpBackgroundJobsHangfireModule.cs | 21 +++++++- .../Quartz/AbpBackgroundJobsQuartzModule.cs | 14 +++++- .../Quartz/QuartzJobExecutionAdapter.cs | 3 +- .../AbpBackgroundWorkersQuartzModule.cs | 29 ++++++++--- .../Quartz/QuartzBackgroundWorkerManager.cs | 20 ++++++-- .../Volo/Abp/Quartz/AbpQuartzModule.cs | 31 ++++++------ .../Volo/Abp/Quartz/AbpQuartzOptions.cs | 48 +++++++++++++++++++ .../Volo/Abp/Quartz/AbpQuartzPreOptions.cs | 23 --------- 8 files changed, 137 insertions(+), 52 deletions(-) create mode 100644 framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzOptions.cs delete mode 100644 framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzPreOptions.cs diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs index 27381f8e25..8e6802e751 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs @@ -1,4 +1,8 @@ -using Volo.Abp.Hangfire; +using System; +using Hangfire; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; +using Volo.Abp.Hangfire; using Volo.Abp.Modularity; namespace Volo.Abp.BackgroundJobs.Hangfire @@ -9,5 +13,20 @@ namespace Volo.Abp.BackgroundJobs.Hangfire )] public class AbpBackgroundJobsHangfireModule : AbpModule { + public override void OnPreApplicationInitialization(ApplicationInitializationContext context) + { + var options = context.ServiceProvider.GetRequiredService>().Value; + if (!options.IsJobExecutionEnabled) + { + var hangfireOptions = context.ServiceProvider.GetRequiredService>().Value; + hangfireOptions.BackgroundJobServerFactory = CreateOnlyEnqueueJobServer; + } + } + + private BackgroundJobServer CreateOnlyEnqueueJobServer(IServiceProvider serviceProvider) + { + serviceProvider.GetRequiredService(); + return null; + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs index 0e3d079acc..4c9366e93f 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobsQuartzModule.cs @@ -1,4 +1,6 @@ -using Microsoft.Extensions.DependencyInjection; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Volo.Abp.Modularity; using Volo.Abp.Quartz; @@ -14,5 +16,15 @@ namespace Volo.Abp.BackgroundJobs.Quartz { context.Services.AddTransient(typeof(QuartzJobExecutionAdapter<>)); } + + public override void OnPreApplicationInitialization(ApplicationInitializationContext context) + { + var options = context.ServiceProvider.GetService>().Value; + if (!options.IsJobExecutionEnabled) + { + var quartzOptions = context.ServiceProvider.GetService>().Value; + quartzOptions.StartSchedulerFactory = scheduler => Task.CompletedTask; + } + } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs index 2efe800c9c..5b77372959 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs @@ -1,5 +1,4 @@ -using System; -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs index 1f23b350aa..ff29887b30 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs @@ -1,5 +1,6 @@ -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.DependencyInjection.Extensions; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using Volo.Abp.Modularity; using Volo.Abp.Quartz; @@ -15,15 +16,29 @@ namespace Volo.Abp.BackgroundWorkers.Quartz { context.Services.AddConventionalRegistrar(new AbpQuartzConventionalRegistrar()); } + + public override void OnPreApplicationInitialization(ApplicationInitializationContext context) + { + var options = context.ServiceProvider.GetService>().Value; + if (!options.IsEnabled) + { + var quartzOptions = context.ServiceProvider.GetService>().Value; + quartzOptions.StartSchedulerFactory = scheduler => Task.CompletedTask; + } + } public override void OnApplicationInitialization(ApplicationInitializationContext context) { - var backgroundWorkerManager = context.ServiceProvider.GetService(); - var works = context.ServiceProvider.GetServices(); - - foreach (var work in works) + var options = context.ServiceProvider.GetService>().Value; + if (options.IsEnabled) { - backgroundWorkerManager.Add(work); + var backgroundWorkerManager = context.ServiceProvider.GetService(); + var works = context.ServiceProvider.GetServices(); + + foreach (var work in works) + { + backgroundWorkerManager.Add(work); + } } } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs index 46568a5a11..db7fc692ff 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs @@ -30,14 +30,28 @@ namespace Volo.Abp.BackgroundWorkers.Quartz } public void Add(IBackgroundWorker worker) + { + AsyncHelper.RunSync(() => ReScheduleJobAsync(worker)); + } + + private async Task ReScheduleJobAsync(IBackgroundWorker worker) { if (worker is IQuartzBackgroundWorker quartzWork) { Check.NotNull(quartzWork.Trigger, nameof(quartzWork.Trigger)); Check.NotNull(quartzWork.JobDetail, nameof(quartzWork.JobDetail)); - - AsyncHelper.RunSync(() => _scheduler.ScheduleJob(quartzWork.JobDetail, quartzWork.Trigger)); + + if (await _scheduler.CheckExists(quartzWork.JobDetail.Key)) + { + await _scheduler.AddJob(quartzWork.JobDetail, true); + await _scheduler.ResumeJob(quartzWork.JobDetail.Key); + await _scheduler.RescheduleJob(quartzWork.Trigger.Key, quartzWork.Trigger); + } + else + { + await _scheduler.ScheduleJob(quartzWork.JobDetail, quartzWork.Trigger); + } } } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs b/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs index 9112f2baaf..3a2413a9b8 100644 --- a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs +++ b/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzModule.cs @@ -14,32 +14,33 @@ namespace Volo.Abp.Quartz public override void ConfigureServices(ServiceConfigurationContext context) { - var options = context.Services.ExecutePreConfiguredActions(); + var options = context.Services.ExecutePreConfiguredActions(); context.Services.AddSingleton(AsyncHelper.RunSync(() => new StdSchedulerFactory(options.Properties).GetScheduler())); context.Services.AddSingleton(typeof(IJobFactory), typeof(AbpQuartzJobFactory)); + + Configure(quartzOptions => + { + quartzOptions.Properties = options.Properties; + quartzOptions.StartDelay = options.StartDelay; + }); } public override void OnApplicationInitialization(ApplicationInitializationContext context) { - var options = context.ServiceProvider.GetRequiredService>().Value; - + var options = context.ServiceProvider.GetRequiredService>().Value; + _scheduler = context.ServiceProvider.GetService(); _scheduler.JobFactory = context.ServiceProvider.GetService(); - - if (options.StartDelay.Ticks > 0) - { - AsyncHelper.RunSync(() => _scheduler.StartDelayed(options.StartDelay)); - } - else - { - AsyncHelper.RunSync(() => _scheduler.Start()); - } + + AsyncHelper.RunSync(() => options.StartSchedulerFactory.Invoke(_scheduler)); } public override void OnApplicationShutdown(ApplicationShutdownContext context) { - //TODO: ABP may provide two methods for application shutdown: OnPreApplicationShutdown & OnApplicationShutdown - AsyncHelper.RunSync(() => _scheduler.Shutdown()); + if (_scheduler.IsStarted) + { + AsyncHelper.RunSync(() => _scheduler.Shutdown()); + } } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzOptions.cs b/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzOptions.cs new file mode 100644 index 0000000000..9998676042 --- /dev/null +++ b/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzOptions.cs @@ -0,0 +1,48 @@ +using System; +using System.Collections.Specialized; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Quartz; + +namespace Volo.Abp.Quartz +{ + public class AbpQuartzOptions + { + /// + /// The quartz configuration. Available properties can be found within Quartz.Impl.StdSchedulerFactory. + /// + public NameValueCollection Properties { get; set; } + + /// + /// How long Quartz should wait before starting. Default: 0. + /// + public TimeSpan StartDelay { get; set; } + + [NotNull] + public Func StartSchedulerFactory + { + get => _startSchedulerFactory; + set => _startSchedulerFactory = Check.NotNull(value, nameof(value)); + } + private Func _startSchedulerFactory; + + public AbpQuartzOptions() + { + Properties = new NameValueCollection(); + StartDelay = new TimeSpan(0); + _startSchedulerFactory = StartSchedulerAsync; + } + + private async Task StartSchedulerAsync(IScheduler scheduler) + { + if (StartDelay.Ticks > 0) + { + await scheduler.StartDelayed(StartDelay); + } + else + { + await scheduler.Start(); + } + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzPreOptions.cs b/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzPreOptions.cs deleted file mode 100644 index 9e48744d96..0000000000 --- a/framework/src/Volo.Abp.Quartz/Volo/Abp/Quartz/AbpQuartzPreOptions.cs +++ /dev/null @@ -1,23 +0,0 @@ -using System; -using System.Collections.Specialized; - -namespace Volo.Abp.Quartz -{ - public class AbpQuartzPreOptions - { - /// - /// The quartz configuration. Available properties can be found within Quartz.Impl.StdSchedulerFactory. - /// - public NameValueCollection Properties { get; set; } - /// - /// How long Quartz should wait before starting. Default: 0. - /// - public TimeSpan StartDelay { get; set; } - - public AbpQuartzPreOptions() - { - Properties = new NameValueCollection(); - StartDelay = new TimeSpan(0); - } - } -} From ae72356b3ba653ecf372e95cafbe4d503b400074 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Mon, 13 Apr 2020 12:47:54 +0800 Subject: [PATCH 05/11] Make method virtual --- .../Hangfire/HangfireBackgroundJobManager.cs | 2 +- .../BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs | 2 +- .../Quartz/QuartzBackgroundWorkerManager.cs | 8 ++++---- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs index 48b2dea666..8b6c6f89f7 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs @@ -8,7 +8,7 @@ namespace Volo.Abp.BackgroundJobs.Hangfire [Dependency(ReplaceServices = true)] public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDependency { - public Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, + public virtual Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { if (!delay.HasValue) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs index 2e7b8193b4..f45e79dd39 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.BackgroundJobs.Quartz _scheduler = scheduler; } - public async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, + public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { var jobDetail = JobBuilder.Create>().SetJobData(new JobDataMap { { nameof(TArgs), args } }).Build(); diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs index db7fc692ff..d7dd8a2e6e 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs @@ -16,12 +16,12 @@ namespace Volo.Abp.BackgroundWorkers.Quartz _scheduler = scheduler; } - public async Task StartAsync(CancellationToken cancellationToken = default) + public virtual async Task StartAsync(CancellationToken cancellationToken = default) { await _scheduler.ResumeAll(cancellationToken); } - public async Task StopAsync(CancellationToken cancellationToken = default) + public virtual async Task StopAsync(CancellationToken cancellationToken = default) { if (!_scheduler.IsShutdown) { @@ -29,12 +29,12 @@ namespace Volo.Abp.BackgroundWorkers.Quartz } } - public void Add(IBackgroundWorker worker) + public virtual void Add(IBackgroundWorker worker) { AsyncHelper.RunSync(() => ReScheduleJobAsync(worker)); } - private async Task ReScheduleJobAsync(IBackgroundWorker worker) + protected virtual async Task ReScheduleJobAsync(IBackgroundWorker worker) { if (worker is IQuartzBackgroundWorker quartzWork) { From b781c601b6ecc4cca5f4769fe4c232ba5bdbbd73 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 15 Apr 2020 17:16:46 +0800 Subject: [PATCH 06/11] Add AutoRegister property for IQuartzBackgroundWorker --- .../Quartz/AbpBackgroundWorkersQuartzModule.cs | 5 +++-- .../Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs | 2 ++ .../BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs | 2 ++ .../Quartz/QuartzBackgroundWorkerManager.cs | 4 ++-- 4 files changed, 9 insertions(+), 4 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs index ff29887b30..cba6c462e9 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System.Linq; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Modularity; @@ -33,7 +34,7 @@ namespace Volo.Abp.BackgroundWorkers.Quartz if (options.IsEnabled) { var backgroundWorkerManager = context.ServiceProvider.GetService(); - var works = context.ServiceProvider.GetServices(); + var works = context.ServiceProvider.GetServices().Where(x=>x.AutoRegister); foreach (var work in works) { diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs index ffc2117e6f..b536ee9389 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs @@ -7,5 +7,7 @@ namespace Volo.Abp.BackgroundWorkers.Quartz ITrigger Trigger { get; set; } IJobDetail JobDetail { get; set; } + + bool AutoRegister { get; set; } } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs index e468ac80f5..00e03af15a 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs @@ -8,6 +8,8 @@ namespace Volo.Abp.BackgroundWorkers.Quartz public ITrigger Trigger { get; set; } public IJobDetail JobDetail { get; set; } + + public bool AutoRegister { get; set; } = true; public abstract Task Execute(IJobExecutionContext context); } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs index d7dd8a2e6e..4bdaca9f6c 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs @@ -40,10 +40,10 @@ namespace Volo.Abp.BackgroundWorkers.Quartz { Check.NotNull(quartzWork.Trigger, nameof(quartzWork.Trigger)); Check.NotNull(quartzWork.JobDetail, nameof(quartzWork.JobDetail)); - + if (await _scheduler.CheckExists(quartzWork.JobDetail.Key)) { - await _scheduler.AddJob(quartzWork.JobDetail, true); + await _scheduler.AddJob(quartzWork.JobDetail, true, true); await _scheduler.ResumeJob(quartzWork.JobDetail.Key); await _scheduler.RescheduleJob(quartzWork.Trigger.Key, quartzWork.Trigger); } From ea2e220ecf2e82b13c72ccf79e32dd0df2d94379 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Fri, 17 Apr 2020 17:43:21 +0800 Subject: [PATCH 07/11] Background job quartz integration retry --- .../Quartz/AbpBackgroundJobQuartzOptions.cs | 48 +++++++++++++++++++ .../QuartzBackgroundJobManageExtensions.cs | 22 +++++++++ .../Quartz/QuartzBackgroundJobManager.cs | 31 +++++++++--- .../Quartz/QuartzJobExecutionAdapter.cs | 32 ++++++++++--- 4 files changed, 121 insertions(+), 12 deletions(-) create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManageExtensions.cs diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs new file mode 100644 index 0000000000..975df287fa --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs @@ -0,0 +1,48 @@ +using System; +using System.Threading.Tasks; +using JetBrains.Annotations; +using Quartz; + +namespace Volo.Abp.BackgroundJobs.Quartz +{ + public class AbpBackgroundJobQuartzOptions + { + public int RetryCount { get; set; } + + public int RetryIntervalMillisecond { get; set; } + + + public const string RetryIndex = "RetryIndex"; + + [NotNull] + public Func RetryStrategy + { + get => _retryStrategy; + set => _retryStrategy = Check.NotNull(value, nameof(value)); + } + private Func _retryStrategy; + + public AbpBackgroundJobQuartzOptions() + { + RetryCount = 3; + RetryIntervalMillisecond = 3000; + _retryStrategy = DefaultRetryStrategy; + } + + private async Task DefaultRetryStrategy(int retryIndex, IJobExecutionContext executionContext, JobExecutionException exception) + { + exception.RefireImmediately = true; + + var retryCount = executionContext.JobDetail.JobDataMap.GetIntValue(nameof(RetryCount)); + if (retryIndex > retryCount) + { + exception.RefireImmediately = false; + exception.UnscheduleAllTriggers = true; + return; + } + + var retryInterval = executionContext.JobDetail.JobDataMap.GetIntValue(nameof(RetryIntervalMillisecond)); + await Task.Delay(retryInterval); + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManageExtensions.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManageExtensions.cs new file mode 100644 index 0000000000..3ba114b832 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManageExtensions.cs @@ -0,0 +1,22 @@ +using System; +using System.Threading.Tasks; +using Quartz; + +namespace Volo.Abp.BackgroundJobs.Quartz +{ + public static class QuartzBackgroundJobManageExtensions + { + public static async Task EnqueueAsync(this IBackgroundJobManager backgroundJobManager, + TArgs args, int retryCount, int retryIntervalMillisecond, + BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) + { + if (backgroundJobManager is QuartzBackgroundJobManager quartzBackgroundJobManager) + { + return await quartzBackgroundJobManager.ReEnqueueAsync(args, retryCount, retryIntervalMillisecond, + priority, delay); + } + + return null; + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs index f45e79dd39..250b0a0095 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs @@ -1,5 +1,6 @@ using System; using System.Threading.Tasks; +using Microsoft.Extensions.Options; using Quartz; using Volo.Abp.DependencyInjection; @@ -7,20 +8,38 @@ namespace Volo.Abp.BackgroundJobs.Quartz { [Dependency(ReplaceServices = true)] public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDependency - { - private readonly IScheduler _scheduler; + { + protected IScheduler Scheduler { get; } + + protected AbpBackgroundJobQuartzOptions Options { get; } - public QuartzBackgroundJobManager(IScheduler scheduler) + + public QuartzBackgroundJobManager(IScheduler scheduler,IOptions options) { - _scheduler = scheduler; + Scheduler = scheduler; + Options = options.Value; } public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { - var jobDetail = JobBuilder.Create>().SetJobData(new JobDataMap { { nameof(TArgs), args } }).Build(); + return await ReEnqueueAsync(args, Options.RetryCount, Options.RetryIntervalMillisecond, priority, delay); + } + + public virtual async Task ReEnqueueAsync(TArgs args, int retryCount, int retryIntervalMillisecond, + BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) + { + var jobDataMap = new JobDataMap + { + {nameof(TArgs), args}, + {nameof(Options.RetryCount), retryCount}, + {nameof(Options.RetryIntervalMillisecond), retryIntervalMillisecond}, + {nameof(AbpBackgroundJobQuartzOptions.RetryIndex), 0} + }; + + var jobDetail = JobBuilder.Create>().RequestRecovery().SetJobData(jobDataMap).Build(); var trigger = !delay.HasValue ? TriggerBuilder.Create().StartNow().Build() : TriggerBuilder.Create().StartAt(new DateTimeOffset(DateTime.Now.Add(delay.Value))).Build(); - await _scheduler.ScheduleJob(jobDetail, trigger); + await Scheduler.ScheduleJob(jobDetail, trigger); return jobDetail.Key.ToString(); } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs index 5b77372959..06702f138d 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; @@ -10,18 +11,22 @@ namespace Volo.Abp.BackgroundJobs.Quartz public class QuartzJobExecutionAdapter : IJob { public ILogger> Logger { get; set; } - + protected AbpBackgroundJobOptions Options { get; } + protected AbpBackgroundJobQuartzOptions BackgroundJobQuartzOptions { get; } protected IServiceScopeFactory ServiceScopeFactory { get; } protected IBackgroundJobExecuter JobExecuter { get; } + public QuartzJobExecutionAdapter( IOptions options, + IOptions backgroundJobQuartzOptions, IBackgroundJobExecuter jobExecuter, IServiceScopeFactory serviceScopeFactory) { JobExecuter = jobExecuter; ServiceScopeFactory = serviceScopeFactory; Options = options.Value; + BackgroundJobQuartzOptions = backgroundJobQuartzOptions.Value; Logger = NullLogger>.Instance; } @@ -32,14 +37,29 @@ namespace Volo.Abp.BackgroundJobs.Quartz Logger.LogWarning("Background jobs system is disabled"); return; } - + using (var scope = ServiceScopeFactory.CreateScope()) { - var args = (TArgs)context.JobDetail.JobDataMap.Get(nameof(TArgs)); + var args = (TArgs) context.JobDetail.JobDataMap.Get(nameof(TArgs)); var jobType = Options.GetJob(typeof(TArgs)).JobType; var jobContext = new JobExecutionContext(scope.ServiceProvider, jobType, args); - await JobExecuter.ExecuteAsync(jobContext); + try + { + await JobExecuter.ExecuteAsync(jobContext); + } + catch (Exception exception) + { + var jobExecutionException = new JobExecutionException(exception); + + var retryIndex = context.JobDetail.JobDataMap.GetIntValue(nameof(AbpBackgroundJobQuartzOptions.RetryIndex)); + retryIndex++; + context.JobDetail.JobDataMap.Put(AbpBackgroundJobQuartzOptions.RetryIndex, retryIndex); + + await BackgroundJobQuartzOptions.RetryStrategy.Invoke(retryIndex, context, jobExecutionException); + + throw jobExecutionException; + } } } } -} +} \ No newline at end of file From 9fac2baa7fae87dbed818571e96e535e45c0801d Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sat, 18 Apr 2020 11:31:54 +0800 Subject: [PATCH 08/11] Allow developers to customize ScheduleJob --- .../Quartz/QuartzJobExecutionAdapter.cs | 6 ----- .../Quartz/IQuartzBackgroundWorker.cs | 6 ++++- .../Quartz/QuartzBackgroundWorkerBase.cs | 5 ++++- .../Quartz/QuartzBackgroundWorkerManager.cs | 22 ++++++++++++++----- 4 files changed, 26 insertions(+), 13 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs index 06702f138d..cad1e94aa3 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs @@ -32,12 +32,6 @@ namespace Volo.Abp.BackgroundJobs.Quartz public async Task Execute(IJobExecutionContext context) { - if (!Options.IsJobExecutionEnabled) - { - Logger.LogWarning("Background jobs system is disabled"); - return; - } - using (var scope = ServiceScopeFactory.CreateScope()) { var args = (TArgs) context.JobDetail.JobDataMap.Get(nameof(TArgs)); diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs index b536ee9389..baf3fc1973 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/IQuartzBackgroundWorker.cs @@ -1,4 +1,6 @@ -using Quartz; +using System; +using System.Threading.Tasks; +using Quartz; namespace Volo.Abp.BackgroundWorkers.Quartz { @@ -9,5 +11,7 @@ namespace Volo.Abp.BackgroundWorkers.Quartz IJobDetail JobDetail { get; set; } bool AutoRegister { get; set; } + + Func ScheduleJob { get; set; } } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs index 00e03af15a..307e6b6676 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerBase.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using Quartz; namespace Volo.Abp.BackgroundWorkers.Quartz @@ -10,6 +11,8 @@ namespace Volo.Abp.BackgroundWorkers.Quartz public IJobDetail JobDetail { get; set; } public bool AutoRegister { get; set; } = true; + + public Func ScheduleJob { get; set; } = null; public abstract Task Execute(IJobExecutionContext context); } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs index 4bdaca9f6c..35359b1d27 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzBackgroundWorkerManager.cs @@ -41,17 +41,29 @@ namespace Volo.Abp.BackgroundWorkers.Quartz Check.NotNull(quartzWork.Trigger, nameof(quartzWork.Trigger)); Check.NotNull(quartzWork.JobDetail, nameof(quartzWork.JobDetail)); - if (await _scheduler.CheckExists(quartzWork.JobDetail.Key)) + if (quartzWork.ScheduleJob != null) { - await _scheduler.AddJob(quartzWork.JobDetail, true, true); - await _scheduler.ResumeJob(quartzWork.JobDetail.Key); - await _scheduler.RescheduleJob(quartzWork.Trigger.Key, quartzWork.Trigger); + await quartzWork.ScheduleJob.Invoke(_scheduler); } else { - await _scheduler.ScheduleJob(quartzWork.JobDetail, quartzWork.Trigger); + await DefaultScheduleJobAsync(quartzWork); } } } + + protected virtual async Task DefaultScheduleJobAsync(IQuartzBackgroundWorker quartzWork) + { + if (await _scheduler.CheckExists(quartzWork.JobDetail.Key)) + { + await _scheduler.AddJob(quartzWork.JobDetail, true, true); + await _scheduler.ResumeJob(quartzWork.JobDetail.Key); + await _scheduler.RescheduleJob(quartzWork.Trigger.Key, quartzWork.Trigger); + } + else + { + await _scheduler.ScheduleJob(quartzWork.JobDetail, quartzWork.Trigger); + } + } } } \ No newline at end of file From 0e8e8d330807c5a9376e909a7cd22470ee5a1719 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sun, 19 Apr 2020 11:46:43 +0800 Subject: [PATCH 09/11] normalize predefind JobDataMap name --- .../Quartz/AbpBackgroundJobQuartzOptions.cs | 8 +++----- .../Quartz/QuartzBackgroundJobManager.cs | 12 +++++++----- .../Quartz/QuartzJobExecutionAdapter.cs | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs index 975df287fa..e9ecb41c57 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/AbpBackgroundJobQuartzOptions.cs @@ -10,10 +10,8 @@ namespace Volo.Abp.BackgroundJobs.Quartz public int RetryCount { get; set; } public int RetryIntervalMillisecond { get; set; } - - - public const string RetryIndex = "RetryIndex"; + [NotNull] public Func RetryStrategy { @@ -33,7 +31,7 @@ namespace Volo.Abp.BackgroundJobs.Quartz { exception.RefireImmediately = true; - var retryCount = executionContext.JobDetail.JobDataMap.GetIntValue(nameof(RetryCount)); + var retryCount = executionContext.JobDetail.JobDataMap.GetIntValue(QuartzBackgroundJobManager.JobDataPrefix+ nameof(RetryCount)); if (retryIndex > retryCount) { exception.RefireImmediately = false; @@ -41,7 +39,7 @@ namespace Volo.Abp.BackgroundJobs.Quartz return; } - var retryInterval = executionContext.JobDetail.JobDataMap.GetIntValue(nameof(RetryIntervalMillisecond)); + var retryInterval = executionContext.JobDetail.JobDataMap.GetIntValue(QuartzBackgroundJobManager.JobDataPrefix+ nameof(RetryIntervalMillisecond)); await Task.Delay(retryInterval); } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs index 250b0a0095..173d05e29b 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzBackgroundJobManager.cs @@ -9,10 +9,12 @@ namespace Volo.Abp.BackgroundJobs.Quartz [Dependency(ReplaceServices = true)] public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDependency { - protected IScheduler Scheduler { get; } + public const string JobDataPrefix = "Abp"; + public const string RetryIndex = "RetryIndex"; + protected IScheduler Scheduler { get; } protected AbpBackgroundJobQuartzOptions Options { get; } - + public QuartzBackgroundJobManager(IScheduler scheduler,IOptions options) { @@ -32,9 +34,9 @@ namespace Volo.Abp.BackgroundJobs.Quartz var jobDataMap = new JobDataMap { {nameof(TArgs), args}, - {nameof(Options.RetryCount), retryCount}, - {nameof(Options.RetryIntervalMillisecond), retryIntervalMillisecond}, - {nameof(AbpBackgroundJobQuartzOptions.RetryIndex), 0} + {JobDataPrefix+ nameof(Options.RetryCount), retryCount}, + {JobDataPrefix+ nameof(Options.RetryIntervalMillisecond), retryIntervalMillisecond}, + {JobDataPrefix+ RetryIndex, 0} }; var jobDetail = JobBuilder.Create>().RequestRecovery().SetJobData(jobDataMap).Build(); diff --git a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs index cad1e94aa3..b6759b256e 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Quartz/Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs @@ -45,9 +45,9 @@ namespace Volo.Abp.BackgroundJobs.Quartz { var jobExecutionException = new JobExecutionException(exception); - var retryIndex = context.JobDetail.JobDataMap.GetIntValue(nameof(AbpBackgroundJobQuartzOptions.RetryIndex)); + var retryIndex = context.JobDetail.JobDataMap.GetIntValue(QuartzBackgroundJobManager.JobDataPrefix+ QuartzBackgroundJobManager.RetryIndex); retryIndex++; - context.JobDetail.JobDataMap.Put(AbpBackgroundJobQuartzOptions.RetryIndex, retryIndex); + context.JobDetail.JobDataMap.Put(QuartzBackgroundJobManager.JobDataPrefix+ QuartzBackgroundJobManager.RetryIndex, retryIndex); await BackgroundJobQuartzOptions.RetryStrategy.Invoke(retryIndex, context, jobExecutionException); From 57c6d6a09365a14bf35535e46c4f4f8bd9c978ff Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sun, 19 Apr 2020 12:42:42 +0800 Subject: [PATCH 10/11] Allow global quartzBackgroundWrokers register disable --- .../Quartz/AbpBackgroundWorkerQuartzOptions.cs | 10 ++++++++++ .../Quartz/AbpBackgroundWorkersQuartzModule.cs | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkerQuartzOptions.cs diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkerQuartzOptions.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkerQuartzOptions.cs new file mode 100644 index 0000000000..c4ca139b4e --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkerQuartzOptions.cs @@ -0,0 +1,10 @@ +namespace Volo.Abp.BackgroundWorkers.Quartz +{ + public class AbpBackgroundWorkerQuartzOptions + { + /// + /// Default : true. + /// + public bool IsAutoRegisterEnabled { get; set; } = true; + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs index cba6c462e9..64a641b68c 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs @@ -31,7 +31,8 @@ namespace Volo.Abp.BackgroundWorkers.Quartz public override void OnApplicationInitialization(ApplicationInitializationContext context) { var options = context.ServiceProvider.GetService>().Value; - if (options.IsEnabled) + var quartzBackgroundWorkerOptions = context.ServiceProvider.GetService>().Value; + if (options.IsEnabled && quartzBackgroundWorkerOptions.IsAutoRegisterEnable) { var backgroundWorkerManager = context.ServiceProvider.GetService(); var works = context.ServiceProvider.GetServices().Where(x=>x.AutoRegister); From b0f939ccb0f94e89f6dc7b6c018688abfefed31f Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Sun, 19 Apr 2020 15:20:30 +0800 Subject: [PATCH 11/11] Fix typo --- .../Quartz/AbpBackgroundWorkersQuartzModule.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs index 64a641b68c..3c4f7131cb 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/AbpBackgroundWorkersQuartzModule.cs @@ -32,7 +32,7 @@ namespace Volo.Abp.BackgroundWorkers.Quartz { var options = context.ServiceProvider.GetService>().Value; var quartzBackgroundWorkerOptions = context.ServiceProvider.GetService>().Value; - if (options.IsEnabled && quartzBackgroundWorkerOptions.IsAutoRegisterEnable) + if (options.IsEnabled && quartzBackgroundWorkerOptions.IsAutoRegisterEnabled) { var backgroundWorkerManager = context.ServiceProvider.GetService(); var works = context.ServiceProvider.GetServices().Where(x=>x.AutoRegister);