From 5e230084a67d47eb9ebe2e07443f8fe37fdae12b Mon Sep 17 00:00:00 2001 From: maliming Date: Sun, 5 Oct 2025 18:01:21 +0800 Subject: [PATCH] Add configurable retry options for TickerQ background jobs --- .../AbpBackgroundJobsTickerQOptions.cs | 34 +++++++++++++++++++ ...bpBackgroundJobsTimeTickerConfiguration.cs | 8 +++++ .../TickerQ/TickerQBackgroundJobManager.cs | 24 +++++++++---- .../TickerQ/TickerQBackgroundWorkerManager.cs | 2 +- .../DemoAppTickerQModule.cs | 15 ++++++++ 5 files changed, 75 insertions(+), 8 deletions(-) create mode 100644 framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQOptions.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQOptions.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQOptions.cs new file mode 100644 index 0000000000..3db33afa4a --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQOptions.cs @@ -0,0 +1,34 @@ +using System; +using System.Collections.Generic; + +namespace Volo.Abp.BackgroundJobs.TickerQ; + +public class AbpBackgroundJobsTickerQOptions +{ + private readonly Dictionary _jobConfigurations; + + public AbpBackgroundJobsTickerQOptions() + { + _jobConfigurations = new Dictionary(); + } + + public void AddJobConfiguration(AbpBackgroundJobsTimeTickerConfiguration configuration) + { + AddJobConfiguration(typeof(TJob), configuration); + } + + public void AddJobConfiguration(Type jobType, AbpBackgroundJobsTimeTickerConfiguration configuration) + { + _jobConfigurations[jobType] = configuration; + } + + public AbpBackgroundJobsTimeTickerConfiguration? GetJobConfigurationOrNull() + { + return GetJobConfigurationOrNull(typeof(TJob)); + } + + public AbpBackgroundJobsTimeTickerConfiguration? GetJobConfigurationOrNull(Type jobType) + { + return _jobConfigurations.GetValueOrDefault(jobType); + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs new file mode 100644 index 0000000000..3082f8ab3e --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs @@ -0,0 +1,8 @@ +namespace Volo.Abp.BackgroundJobs.TickerQ; + +public class AbpBackgroundJobsTimeTickerConfiguration +{ + public int? Retries { get; set; } + + public int[]? RetryIntervals { get; set; } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/TickerQBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/TickerQBackgroundJobManager.cs index c48efdada6..1be41bae67 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/TickerQBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/TickerQBackgroundJobManager.cs @@ -13,27 +13,37 @@ public class TickerQBackgroundJobManager : IBackgroundJobManager, ITransientDepe { protected ITimeTickerManager TimeTickerManager { get; } protected AbpBackgroundJobOptions Options { get; } + protected AbpBackgroundJobsTickerQOptions TickerQOptions { get; } - public TickerQBackgroundJobManager(ITimeTickerManager timeTickerManager, IOptions options) + public TickerQBackgroundJobManager( + ITimeTickerManager timeTickerManager, + IOptions options, + IOptions tickerQOptions) { TimeTickerManager = timeTickerManager; Options = options.Value; + TickerQOptions = tickerQOptions.Value; } public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { - var result = await TimeTickerManager.AddAsync(new TimeTicker + var job = Options.GetJob(typeof(TArgs)); + var timeTicker = new TimeTicker { Id = Guid.NewGuid(), - Function = Options.GetJob(typeof(TArgs)).JobName, + Function = job.JobName, ExecutionTime = delay == null ? DateTime.UtcNow : DateTime.UtcNow.Add(delay.Value), Request = TickerHelper.CreateTickerRequest(args), + }; - //TODO: Make these configurable - Retries = 3, - RetryIntervals = [30, 60, 120], // Retry after 30s, 60s, then 2min - }); + var config = TickerQOptions.GetJobConfigurationOrNull(job.JobType); + if (config != null) + { + timeTicker.Retries = config.Retries ?? timeTicker.Retries; + timeTicker.RetryIntervals = config.RetryIntervals ?? timeTicker.RetryIntervals; + } + var result = await TimeTickerManager.AddAsync(timeTicker); return !result.IsSucceded ? throw result.Exception : result.Result.Id.ToString(); } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQBackgroundWorkerManager.cs index 1ef8b42e27..131f3f2920 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQBackgroundWorkerManager.cs @@ -47,7 +47,7 @@ public class TickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingleto } var name = BackgroundWorkerNameAttribute.GetNameOrNull(worker.GetType()) ?? worker.GetType().FullName; - AbpTickerQFunctionProvider.Functions.TryAdd(name!, (cronExpression!, TickerTaskPriority.Normal, async (tickerQCancellationToken, serviceProvider, tickerFunctionContext) => + AbpTickerQFunctionProvider.Functions.TryAdd(name!, (cronExpression!, TickerTaskPriority.LongRunning, async (tickerQCancellationToken, serviceProvider, tickerFunctionContext) => { var workerInvoker = new TickerQPeriodicBackgroundWorkerInvoker(worker, serviceProvider); await workerInvoker.DoWorkAsync(tickerFunctionContext, tickerQCancellationToken); diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs index b29bd3041c..c61762d264 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs @@ -29,6 +29,21 @@ public class DemoAppTickerQModule : AbpModule { options.UpdateMissedJobCheckDelay(TimeSpan.FromSeconds(30)); }); + + Configure(options => + { + options.AddJobConfiguration(new AbpBackgroundJobsTimeTickerConfiguration() + { + Retries = 3, + RetryIntervals = new[] {30, 60, 120}, // Retry after 30s, 60s, then 2min + }); + + options.AddJobConfiguration(new AbpBackgroundJobsTimeTickerConfiguration() + { + Retries = 5, + RetryIntervals = new[] {30, 60, 120}, // Retry after 30s, 60s, then 2min + }); + }); } public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)