From 2536c5afe6eac03e908cda6a79e6c6305a5a58c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Mon, 9 Mar 2026 22:46:50 +0300 Subject: [PATCH 01/40] Support EnqueueAsync by job name Add non-generic EnqueueAsync(string jobName, object args, ...) to IBackgroundJobManager and implement it across providers. Implementations and helpers added/updated for Hangfire (IJsonSerializer usage, new HangfireJobExecutionAdapter), Quartz (new QuartzJobExecutionAdapter and job-data based enqueue), RabbitMQ (IJobQueue non-generic EnqueueAsync, JobQueueManager.GetAsync(jobName)), TickerQ (reflective CreateTickerRequest helper), and DefaultBackgroundJobManager (returns string ids). Also update NullBackgroundJobManager to throw for the new overload and extend tests to cover enqueueing by job name. These changes enable enqueueing jobs dynamically by name with serialized arguments and unify cross-provider execution paths. --- .../BackgroundJobs/IBackgroundJobManager.cs | 15 +++++ .../NullBackgroundJobManager.cs | 6 ++ .../Hangfire/HangfireBackgroundJobManager.cs | 38 +++++++++++- .../Hangfire/HangfireJobExecutionAdapter.cs | 46 ++++++++++++++- .../Quartz/QuartzBackgroundJobManager.cs | 26 +++++++- .../Quartz/QuartzJobExecutionAdapter.cs | 59 ++++++++++++++++++- .../Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs | 13 +++- .../RabbitMQ/IJobQueueManager.cs | 4 +- .../Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 10 +++- .../RabbitMQ/JobQueueManager.cs | 29 ++++++++- .../RabbitMQ/RabbitMqBackgroundJobManager.cs | 20 +++++-- .../TickerQ/AbpTickerQBackgroundJobManager.cs | 25 +++++++- .../DefaultBackgroundJobManager.cs | 9 ++- .../BackgroundJobManager_Tests.cs | 33 ++++++++++- 14 files changed, 309 insertions(+), 24 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs index 9b7ee34842..dd32de559f 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs @@ -21,4 +21,19 @@ public interface IBackgroundJobManager BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null ); + + /// + /// Enqueues a job to be executed by its name. + /// + /// Name of the background job. + /// Job arguments. + /// Job priority. + /// Job delay (wait duration before first try). + /// Unique identifier of a background job. + Task EnqueueAsync( + string jobName, + object args, + BackgroundJobPriority priority = BackgroundJobPriority.Normal, + TimeSpan? delay = null + ); } 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 e291ff7c18..602cbef17b 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 @@ -21,4 +21,10 @@ public class NullBackgroundJobManager : IBackgroundJobManager, ISingletonDepende { 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."); } + + public virtual Task EnqueueAsync(string jobName, object 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."); + } } 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 0a47399e49..840b546783 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 @@ -1,4 +1,4 @@ -using System; +using System; using System.Reflection; using System.Threading.Tasks; using Hangfire; @@ -6,6 +6,7 @@ using Hangfire.States; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Hangfire; +using Volo.Abp.Json; namespace Volo.Abp.BackgroundJobs.Hangfire; @@ -14,11 +15,16 @@ public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDep { protected IOptions BackgroundJobOptions { get; } protected IOptions HangfireOptions { get; } + protected IJsonSerializer JsonSerializer { get; } - public HangfireBackgroundJobManager(IOptions backgroundJobOptions, IOptions hangfireOptions) + public HangfireBackgroundJobManager( + IOptions backgroundJobOptions, + IOptions hangfireOptions, + IJsonSerializer jsonSerializer) { BackgroundJobOptions = backgroundJobOptions; HangfireOptions = hangfireOptions; + JsonSerializer = jsonSerializer; } public virtual Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, @@ -34,9 +40,35 @@ public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDep )); } + public virtual Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, + TimeSpan? delay = null) + { + var serializedArgs = JsonSerializer.Serialize(args); + var queueName = GetQueueName(jobName); + + return Task.FromResult(delay.HasValue + ? BackgroundJob.Schedule( + adapter => adapter.ExecuteAsync(queueName, jobName, serializedArgs, default), + delay.Value + ) + : BackgroundJob.Enqueue( + adapter => adapter.ExecuteAsync(queueName, jobName, serializedArgs, default) + )); + } + protected virtual string GetQueueName(Type argsType) { - var queueAttribute = BackgroundJobOptions.Value.GetJob(argsType).JobType.GetCustomAttribute(); + return GetQueueName(BackgroundJobOptions.Value.GetJob(argsType)); + } + + protected virtual string GetQueueName(string jobName) + { + return GetQueueName(BackgroundJobOptions.Value.GetJob(jobName)); + } + + protected virtual string GetQueueName(BackgroundJobConfiguration jobConfiguration) + { + var queueAttribute = jobConfiguration.JobType.GetCustomAttribute(); return queueAttribute != null ? HangfireOptions.Value.DefaultQueuePrefix + queueAttribute.Queue : HangfireOptions.Value.DefaultQueue; } } 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 8790243334..e9e2a3aa08 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,8 +1,9 @@ -using System.Threading; +using System.Threading; using System.Threading.Tasks; using Hangfire; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using Volo.Abp.Json; namespace Volo.Abp.BackgroundJobs.Hangfire; @@ -44,3 +45,46 @@ public class HangfireJobExecutionAdapter } } } + +public class HangfireJobExecutionAdapter +{ + protected AbpBackgroundJobOptions Options { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } + protected IBackgroundJobExecuter JobExecuter { get; } + protected IJsonSerializer JsonSerializer { get; } + + public HangfireJobExecutionAdapter( + IOptions options, + IBackgroundJobExecuter jobExecuter, + IServiceScopeFactory serviceScopeFactory, + IJsonSerializer jsonSerializer) + { + JobExecuter = jobExecuter; + ServiceScopeFactory = serviceScopeFactory; + JsonSerializer = jsonSerializer; + Options = options.Value; + } + + [Queue("{0}")] + public async Task ExecuteAsync(string queue, string jobName, string serializedArgs, CancellationToken cancellationToken = default) + { + if (!Options.IsJobExecutionEnabled) + { + throw new AbpException( + "Background job execution is disabled. " + + "This method should not be called! " + + "If you want to enable the background job execution, " + + $"set {nameof(AbpBackgroundJobOptions)}.{nameof(AbpBackgroundJobOptions.IsJobExecutionEnabled)} to true! " + + "If you've intentionally disabled job execution and this seems a bug, please report it." + ); + } + + using (var scope = ServiceScopeFactory.CreateScope()) + { + var jobConfiguration = Options.GetJob(jobName); + var args = JsonSerializer.Deserialize(jobConfiguration.ArgsType, serializedArgs); + var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, args, cancellationToken: cancellationToken); + await JobExecuter.ExecuteAsync(context); + } + } +} 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 135c2fc6f7..dd8e385246 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,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Options; using Quartz; @@ -32,6 +32,12 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen return await ReEnqueueAsync(args, Options.RetryCount, Options.RetryIntervalMillisecond, priority, delay); } + public virtual async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, + TimeSpan? delay = null) + { + return await ReEnqueueAsync(jobName, 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) { @@ -48,4 +54,22 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen await Scheduler.ScheduleJob(jobDetail, trigger); return jobDetail.Key.ToString(); } + + public virtual async Task ReEnqueueAsync(string jobName, object args, int retryCount, int retryIntervalMillisecond, + BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) + { + var jobDataMap = new JobDataMap + { + {QuartzJobExecutionAdapter.JobNameKey, jobName}, + {QuartzJobExecutionAdapter.JobArgsKey, JsonSerializer.Serialize(args)}, + {JobDataPrefix + nameof(Options.RetryCount), retryCount.ToString()}, + {JobDataPrefix + nameof(Options.RetryIntervalMillisecond), retryIntervalMillisecond.ToString()}, + {JobDataPrefix + 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); + 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 9005164043..bdc12c2420 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,4 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -60,3 +60,60 @@ public class QuartzJobExecutionAdapter : IJob } } } + +public class QuartzJobExecutionAdapter : IJob +{ + public const string JobNameKey = "AbpJobName"; + public const string JobArgsKey = "AbpJobArgs"; + + public ILogger Logger { get; set; } + + protected AbpBackgroundJobOptions Options { get; } + protected AbpBackgroundJobQuartzOptions BackgroundJobQuartzOptions { get; } + protected IServiceScopeFactory ServiceScopeFactory { get; } + protected IBackgroundJobExecuter JobExecuter { get; } + protected IJsonSerializer JsonSerializer { get; } + + public QuartzJobExecutionAdapter( + IOptions options, + IOptions backgroundJobQuartzOptions, + IBackgroundJobExecuter jobExecuter, + IServiceScopeFactory serviceScopeFactory, + IJsonSerializer jsonSerializer) + { + JobExecuter = jobExecuter; + ServiceScopeFactory = serviceScopeFactory; + JsonSerializer = jsonSerializer; + Options = options.Value; + BackgroundJobQuartzOptions = backgroundJobQuartzOptions.Value; + Logger = NullLogger.Instance; + } + + public async Task Execute(IJobExecutionContext context) + { + using (var scope = ServiceScopeFactory.CreateScope()) + { + var jobName = context.JobDetail.JobDataMap.GetString(JobNameKey)!; + var serializedArgs = context.JobDetail.JobDataMap.GetString(JobArgsKey)!; + var jobConfiguration = Options.GetJob(jobName); + var args = JsonSerializer.Deserialize(jobConfiguration.ArgsType, serializedArgs); + var jobContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, args, cancellationToken: context.CancellationToken); + try + { + await JobExecuter.ExecuteAsync(jobContext); + } + catch (Exception exception) + { + var jobExecutionException = new JobExecutionException(exception); + + var retryIndex = context.JobDetail.JobDataMap.GetString(QuartzBackgroundJobManager.JobDataPrefix + QuartzBackgroundJobManager.RetryIndex)!.To(); + retryIndex++; + context.JobDetail.JobDataMap.Put(QuartzBackgroundJobManager.JobDataPrefix + QuartzBackgroundJobManager.RetryIndex, retryIndex.ToString()); + + await BackgroundJobQuartzOptions.RetryStrategy.Invoke(retryIndex, context, jobExecutionException); + + throw jobExecutionException; + } + } + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs index b285f598cc..3b99a68437 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs @@ -1,10 +1,19 @@ -using System; +using System; using System.Threading.Tasks; using Volo.Abp.Threading; namespace Volo.Abp.BackgroundJobs.RabbitMQ; -public interface IJobQueue : IRunnable, IDisposable +public interface IJobQueue : IRunnable, IDisposable +{ + Task EnqueueAsync( + object args, + BackgroundJobPriority priority = BackgroundJobPriority.Normal, + TimeSpan? delay = null + ); +} + +public interface IJobQueue : IJobQueue { Task EnqueueAsync( TArgs args, diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueueManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueueManager.cs index 5e0ef18270..25339ab544 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueueManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueueManager.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Volo.Abp.Threading; namespace Volo.Abp.BackgroundJobs.RabbitMQ; @@ -6,4 +6,6 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ; public interface IJobQueueManager : IRunnable { Task> GetAsync(); + + Task GetAsync(string jobName); } diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index 1e2280b78a..6345083926 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Threading; @@ -75,6 +75,14 @@ public class JobQueue : IJobQueue ); } + async Task IJobQueue.EnqueueAsync( + object args, + BackgroundJobPriority priority, + TimeSpan? delay) + { + return await EnqueueAsync((TArgs)args, priority, delay); + } + public virtual async Task EnqueueAsync( TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs index 09d27aea23..48bd96bc8d 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; @@ -80,4 +80,31 @@ public class JobQueueManager : IJobQueueManager, ISingletonDependency return (IJobQueue)jobQueue; } } + + public async Task GetAsync(string jobName) + { + if (JobQueues.TryGetValue(jobName, out var jobQueue)) + { + return (IJobQueue)jobQueue; + } + + using (await SyncSemaphore.LockAsync()) + { + if (JobQueues.TryGetValue(jobName, out jobQueue)) + { + return (IJobQueue)jobQueue; + } + + var jobConfiguration = Options.GetJob(jobName); + + jobQueue = (IRunnable)ServiceProvider + .GetRequiredService(typeof(IJobQueue<>).MakeGenericType(jobConfiguration.ArgsType)); + + await jobQueue.StartAsync(); + + JobQueues.TryAdd(jobName, jobQueue); + + return (IJobQueue)jobQueue; + } + } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs index d81b2758b0..69ac3c0a62 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; @@ -7,19 +7,29 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ; [Dependency(ReplaceServices = true)] public class RabbitMqBackgroundJobManager : IBackgroundJobManager, ITransientDependency { - private readonly IJobQueueManager _jobQueueManager; + protected IJobQueueManager JobQueueManager { get; } public RabbitMqBackgroundJobManager(IJobQueueManager jobQueueManager) { - _jobQueueManager = jobQueueManager; + JobQueueManager = jobQueueManager; } - public async Task EnqueueAsync( + public virtual async Task EnqueueAsync( TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { - var jobQueue = await _jobQueueManager.GetAsync(); + var jobQueue = await JobQueueManager.GetAsync(); + return (await jobQueue.EnqueueAsync(args, priority, delay))!; + } + + public virtual async Task EnqueueAsync( + string jobName, + object args, + BackgroundJobPriority priority = BackgroundJobPriority.Normal, + TimeSpan? delay = null) + { + var jobQueue = await JobQueueManager.GetAsync(jobName); return (await jobQueue.EnqueueAsync(args, priority, delay))!; } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs index 638c1845f2..f70e48fcf5 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs @@ -1,4 +1,5 @@ -using System; +using System; +using System.Reflection; using System.Threading.Tasks; using Microsoft.Extensions.Options; using TickerQ.Utilities; @@ -11,6 +12,8 @@ namespace Volo.Abp.BackgroundJobs.TickerQ; [Dependency(ReplaceServices = true)] public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientDependency { + private readonly static MethodInfo CreateTickerRequestMethod = typeof(TickerHelper).GetMethod(nameof(TickerHelper.CreateTickerRequest), BindingFlags.Public | BindingFlags.Static)!; + protected ITimeTickerManager TimeTickerManager { get; } protected AbpBackgroundJobOptions Options { get; } protected AbpBackgroundJobsTickerQOptions TickerQOptions { get; } @@ -28,12 +31,23 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { var job = Options.GetJob(typeof(TArgs)); + return await EnqueueAsync(job, args!, priority, delay); + } + + public virtual async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) + { + var job = Options.GetJob(jobName); + return await EnqueueAsync(job, args, priority, delay); + } + + protected virtual async Task EnqueueAsync(BackgroundJobConfiguration job, object args, BackgroundJobPriority priority, TimeSpan? delay) + { var timeTicker = new TimeTickerEntity { Id = Guid.NewGuid(), Function = job.JobName, ExecutionTime = delay == null ? DateTime.UtcNow : DateTime.UtcNow.Add(delay.Value), - Request = TickerHelper.CreateTickerRequest(args), + Request = CreateTickerRequest(job.ArgsType, args), }; var config = TickerQOptions.GetConfigurationOrNull(job.JobType); @@ -47,4 +61,11 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD var result = await TimeTickerManager.AddAsync(timeTicker); return !result.IsSucceeded ? timeTicker.Id.ToString() : result.Result.Id.ToString(); } + + protected virtual byte[]? CreateTickerRequest(Type argsType, object args) + { + return (byte[]?)CreateTickerRequestMethod + .MakeGenericMethod(argsType) + .Invoke(null, [args]); + } } diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs index 586b66b5d1..582d351431 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Options; using Volo.Abp.BackgroundWorkers; @@ -40,11 +40,10 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { var jobName = BackgroundJobOptions.Value.GetBackgroundJobName(typeof(TArgs)); - var jobId = await EnqueueAsync(jobName, args!, priority, delay); - return jobId.ToString(); + return await EnqueueAsync(jobName, args!, priority, delay); } - protected virtual async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) + public virtual async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { var jobInfo = new BackgroundJobInfo { @@ -64,6 +63,6 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe await Store.InsertAsync(jobInfo); - return jobInfo.Id; + return jobInfo.Id.ToString(); } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs index 30ee049746..2f13e66822 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs @@ -1,4 +1,5 @@ -using System; +using System; +using System.Collections.Generic; using System.Threading.Tasks; using Shouldly; using Xunit; @@ -31,4 +32,34 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase jobIdAsString.ShouldNotBe(default); (await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString))).ShouldNotBeNull(); } + + [Fact] + public async Task Should_Store_Jobs_With_JobName() + { + var jobName = BackgroundJobNameAttribute.GetName(); + var jobIdAsString = await _backgroundJobManager.EnqueueAsync(jobName, new + { + Value = "42" + }); + jobIdAsString.ShouldNotBe(default); + + var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); + jobInfo.ShouldNotBeNull(); + jobInfo.JobName.ShouldBe(jobName); + } + + [Fact] + public async Task Should_Store_Async_Jobs_With_JobName() + { + var jobName = BackgroundJobNameAttribute.GetName(); + var jobIdAsString = await _backgroundJobManager.EnqueueAsync(jobName, new Dictionary() + { + ["Value"] = "42" + }); + jobIdAsString.ShouldNotBe(default); + + var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); + jobInfo.ShouldNotBeNull(); + jobInfo.JobName.ShouldBe(jobName); + } } From e615b31924282d3c6c60fdad8a821bb06655fea2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Mon, 9 Mar 2026 23:24:41 +0300 Subject: [PATCH 02/40] Serialize mismatched args before enqueue Avoids invalid casts when the provided args are not of runtime type TArgs. The method now checks for a direct TArgs instance and calls EnqueueAsync directly; otherwise it serializes and deserializes the args via Serializer to produce a TArgs instance before enqueuing. This preserves the fast path for matching types while safely handling boxed or different runtime argument representations. --- .../Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index 6345083926..33c41704f2 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -80,7 +80,13 @@ public class JobQueue : IJobQueue BackgroundJobPriority priority, TimeSpan? delay) { - return await EnqueueAsync((TArgs)args, priority, delay); + if (args is TArgs typedArgs) + { + return await EnqueueAsync(typedArgs, priority, delay); + } + + var serializedArgs = Serializer.Serialize(args); + return await EnqueueAsync((TArgs)Serializer.Deserialize(serializedArgs, typeof(TArgs)), priority, delay); } public virtual async Task EnqueueAsync( From c43458ac0e1674e63c259fb352d4ed8d2bcf23ae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 00:19:44 +0300 Subject: [PATCH 03/40] Add dynamic background job support Introduce dynamic background job support so jobs can be registered and executed without a compile-time job type. Key changes: - Add DynamicBackgroundJobContext, IDynamicBackgroundJobHandlerProvider and DynamicBackgroundJobHandlerProvider to allow registering/unregistering dynamic handlers at runtime. - Extend BackgroundJobConfiguration with DynamicHandler and IsDynamic, and make JobType nullable for dynamic scenarios. - Update AbpBackgroundJobOptions to use a ConcurrentDictionary for name lookup, and add methods to Add/Remove dynamic jobs and GetJobOrNull. - Extend JobExecutionContext with JobName and propagate it through Hangfire/Quartz/RabbitMQ/TickerQ adapters and worker code. - Update BackgroundJobExecuter to detect and execute dynamic handlers, deserialize/ensure dictionary args, and retain existing typed execution path. - Add tests (DynamicJobExecutionTracker, runtime/compile-time dynamic handler tests) and register a sample dynamic job in test module. - Update demo SampleJobCreator and DemoAppSharedModule to demonstrate compile-time and runtime dynamic job registration and enqueueing. These changes enable flexible, dictionary-based job arguments and runtime registration of background job handlers while preserving existing typed job execution. --- .../BackgroundJobs/AbpBackgroundJobOptions.cs | 40 ++++++++- .../BackgroundJobConfiguration.cs | 21 ++++- .../BackgroundJobs/BackgroundJobExecuter.cs | 83 +++++++++++++++++-- .../DynamicBackgroundJobContext.cs | 25 ++++++ .../DynamicBackgroundJobHandlerProvider.cs | 36 ++++++++ .../IDynamicBackgroundJobHandlerProvider.cs | 15 ++++ .../Abp/BackgroundJobs/JobExecutionContext.cs | 8 +- .../Hangfire/HangfireJobExecutionAdapter.cs | 6 +- .../Quartz/QuartzJobExecutionAdapter.cs | 6 +- .../Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 5 +- .../TickerQ/AbpBackgroundJobsTickerQModule.cs | 6 +- .../Abp/BackgroundJobs/BackgroundJobWorker.cs | 7 +- .../AbpBackgroundJobsTestModule.cs | 16 +++- .../BackgroundJobExecuter_Tests.cs | 53 ++++++++++++ .../BackgroundJobManager_Tests.cs | 19 ++++- .../DynamicJobExecutionTracker.cs | 8 ++ .../DemoAppSharedModule.cs | 18 +++- .../Jobs/SampleJobCreator.cs | 57 +++++++++++-- 18 files changed, 390 insertions(+), 39 deletions(-) create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobContext.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerProvider.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerProvider.cs create mode 100644 framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs 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 1a6cb6a9e9..10cacce13e 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 @@ -1,13 +1,15 @@ -using System; +using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; +using System.Threading.Tasks; namespace Volo.Abp.BackgroundJobs; public class AbpBackgroundJobOptions { private readonly Dictionary _jobConfigurationsByArgsType; - private readonly Dictionary _jobConfigurationsByName; + private readonly ConcurrentDictionary _jobConfigurationsByName; /// /// Default: true. @@ -23,7 +25,7 @@ public class AbpBackgroundJobOptions public AbpBackgroundJobOptions() { _jobConfigurationsByArgsType = new Dictionary(); - _jobConfigurationsByName = new Dictionary(); + _jobConfigurationsByName = new ConcurrentDictionary(); GetBackgroundJobName = BackgroundJobNameAttribute.GetName; } @@ -46,7 +48,7 @@ public class AbpBackgroundJobOptions public BackgroundJobConfiguration GetJob(string name) { - var jobConfiguration = _jobConfigurationsByName.GetOrDefault(name); + var jobConfiguration = GetJobOrNull(name); if (jobConfiguration == null) { @@ -56,6 +58,11 @@ public class AbpBackgroundJobOptions return jobConfiguration; } + public BackgroundJobConfiguration? GetJobOrNull(string name) + { + return _jobConfigurationsByName.GetValueOrDefault(name); + } + public IReadOnlyList GetJobs() { return _jobConfigurationsByArgsType.Values.ToImmutableList(); @@ -76,4 +83,29 @@ public class AbpBackgroundJobOptions _jobConfigurationsByArgsType[jobConfiguration.ArgsType] = jobConfiguration; _jobConfigurationsByName[jobConfiguration.JobName] = jobConfiguration; } + + public void AddDynamicJob(string jobName, Func handler) + { + var config = new BackgroundJobConfiguration(jobName, handler); + _jobConfigurationsByName[jobName] = config; + } + + public void AddDynamicJob(string jobName, Action handler) + { + AddDynamicJob(jobName, context => + { + handler(context); + return Task.CompletedTask; + }); + } + + public bool RemoveDynamicJob(string name) + { + if (_jobConfigurationsByName.TryGetValue(name, out var config) && config.IsDynamic) + { + return _jobConfigurationsByName.TryRemove(name, out _); + } + + return false; + } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs index c17ccdc443..cd0e844a99 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs @@ -1,4 +1,6 @@ -using System; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; namespace Volo.Abp.BackgroundJobs; @@ -6,14 +8,29 @@ public class BackgroundJobConfiguration { public Type ArgsType { get; } - public Type JobType { get; } + public Type? JobType { get; } public string JobName { get; } + public bool IsDynamic { get; } + + public Func? DynamicHandler { get; } + public BackgroundJobConfiguration(Type jobType, string jobName) { JobType = jobType; ArgsType = BackgroundJobArgsHelper.GetJobArgsType(jobType); JobName = jobName; } + + public BackgroundJobConfiguration(string jobName, Func handler) + { + Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); + Check.NotNull(handler, nameof(handler)); + + JobName = jobName; + DynamicHandler = handler; + IsDynamic = true; + ArgsType = typeof(Dictionary); + } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs index 6b6d822c50..d84845ee0f 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs @@ -1,7 +1,9 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using System; +using System.Collections.Generic; +using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; @@ -16,7 +18,7 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc public ILogger Logger { protected get; set; } protected AbpBackgroundJobOptions Options { get; } - + protected ICurrentTenant CurrentTenant { get; } public BackgroundJobExecuter(IOptions options, ICurrentTenant currentTenant) @@ -28,6 +30,56 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc } public virtual async Task ExecuteAsync(JobExecutionContext context) + { + if (context.JobName != null) + { + var jobConfig = Options.GetJobOrNull(context.JobName); + if (jobConfig?.DynamicHandler != null) + { + await ExecuteDynamicHandlerAsync(context, jobConfig); + return; + } + } + + await ExecuteTypedHandlerAsync(context); + } + + protected virtual async Task ExecuteDynamicHandlerAsync(JobExecutionContext context, BackgroundJobConfiguration jobConfig) + { + try + { + var cancellationTokenProvider = + context.ServiceProvider.GetRequiredService(); + + using (cancellationTokenProvider.Use(context.CancellationToken)) + { + var dictArgs = EnsureDictionaryArgs(context.JobArgs); + var dynamicContext = new DynamicBackgroundJobContext( + context.ServiceProvider, + dictArgs, + context.CancellationToken + ); + + await jobConfig.DynamicHandler!(dynamicContext); + } + } + catch (Exception ex) + { + Logger.LogException(ex); + + await context.ServiceProvider + .GetRequiredService() + .NotifyAsync(new ExceptionNotificationContext(ex)); + + throw new BackgroundJobExecutionException("A background job execution is failed. See inner exception for details.", ex) + { + JobType = context.JobName!, + JobArgs = context.JobArgs + }; + } + } + + protected virtual async Task ExecuteTypedHandlerAsync(JobExecutionContext context) { var job = context.ServiceProvider.GetService(context.JobType); if (job == null) @@ -45,7 +97,7 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc try { - using(CurrentTenant.Change(GetJobArgsTenantId(context.JobArgs))) + using (CurrentTenant.Change(GetJobArgsTenantId(context.JobArgs))) { var cancellationTokenProvider = context.ServiceProvider.GetRequiredService(); @@ -54,15 +106,14 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc { if (jobExecuteMethod.Name == nameof(IAsyncBackgroundJob.ExecuteAsync)) { - await ((Task)jobExecuteMethod.Invoke(job, new[] { context.JobArgs })!); + await ((Task)jobExecuteMethod.Invoke(job, [context.JobArgs])!); } else { - jobExecuteMethod.Invoke(job, new[] { context.JobArgs }); + jobExecuteMethod.Invoke(job, [context.JobArgs]); } } } - } catch (Exception ex) { @@ -79,7 +130,25 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc }; } } - + + protected virtual Dictionary EnsureDictionaryArgs(object jobArgs) + { + if (jobArgs is Dictionary dict) + { + return dict; + } + + if (jobArgs is JsonElement jsonElement) + { + return JsonSerializer.Deserialize>(jsonElement.GetRawText()) + ?? new Dictionary(); + } + + var json = JsonSerializer.Serialize(jobArgs); + return JsonSerializer.Deserialize>(json) + ?? new Dictionary(); + } + protected virtual Guid? GetJobArgsTenantId(object jobArgs) { return jobArgs switch diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobContext.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobContext.cs new file mode 100644 index 0000000000..49ffe89aca --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobContext.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using System.Threading; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BackgroundJobs; + +public class DynamicBackgroundJobContext : IServiceProviderAccessor +{ + public IServiceProvider ServiceProvider { get; } + + public Dictionary Args { get; } + + public CancellationToken CancellationToken { get; } + + public DynamicBackgroundJobContext( + IServiceProvider serviceProvider, + Dictionary args, + CancellationToken cancellationToken = default) + { + ServiceProvider = serviceProvider; + Args = args; + CancellationToken = cancellationToken; + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerProvider.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerProvider.cs new file mode 100644 index 0000000000..2665719c2a --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerProvider.cs @@ -0,0 +1,36 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BackgroundJobs; + +public class DynamicBackgroundJobHandlerProvider : IDynamicBackgroundJobHandlerProvider, ISingletonDependency +{ + protected AbpBackgroundJobOptions Options { get; } + + public DynamicBackgroundJobHandlerProvider(IOptions options) + { + Options = options.Value; + } + + public virtual void Register(string jobName, Func handler) + { + Options.AddDynamicJob(jobName, handler); + } + + public virtual void Register(string jobName, Action handler) + { + Options.AddDynamicJob(jobName, handler); + } + + public virtual bool Unregister(string jobName) + { + return Options.RemoveDynamicJob(jobName); + } + + public virtual bool IsRegistered(string jobName) + { + return Options.GetJobOrNull(jobName)?.IsDynamic == true; + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerProvider.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerProvider.cs new file mode 100644 index 0000000000..0f1bb8449a --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerProvider.cs @@ -0,0 +1,15 @@ +using System; +using System.Threading.Tasks; + +namespace Volo.Abp.BackgroundJobs; + +public interface IDynamicBackgroundJobHandlerProvider +{ + void Register(string jobName, Func handler); + + void Register(string jobName, Action handler); + + bool Unregister(string jobName); + + bool IsRegistered(string jobName); +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs index ae7e098070..a68736bb7d 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading; using Volo.Abp.DependencyInjection; @@ -14,15 +14,19 @@ public class JobExecutionContext : IServiceProviderAccessor public CancellationToken CancellationToken { get; } + public string? JobName { get; } + public JobExecutionContext( IServiceProvider serviceProvider, Type jobType, object jobArgs, - CancellationToken cancellationToken = default) + CancellationToken cancellationToken = default, + string? jobName = null) { ServiceProvider = serviceProvider; JobType = jobType; JobArgs = jobArgs; CancellationToken = cancellationToken; + JobName = jobName; } } 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 e9e2a3aa08..b85154a5c3 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 @@ -39,8 +39,8 @@ public class HangfireJobExecutionAdapter using (var scope = ServiceScopeFactory.CreateScope()) { - var jobType = Options.GetJob(typeof(TArgs)).JobType; - var context = new JobExecutionContext(scope.ServiceProvider, jobType, args!, cancellationToken: cancellationToken); + var jobConfiguration = Options.GetJob(typeof(TArgs)); + var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType!, args!, cancellationToken: cancellationToken, jobName: jobConfiguration.JobName); await JobExecuter.ExecuteAsync(context); } } @@ -83,7 +83,7 @@ public class HangfireJobExecutionAdapter { var jobConfiguration = Options.GetJob(jobName); var args = JsonSerializer.Deserialize(jobConfiguration.ArgsType, serializedArgs); - var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, args, cancellationToken: cancellationToken); + var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType ?? typeof(object), args, cancellationToken: cancellationToken, jobName: jobName); await JobExecuter.ExecuteAsync(context); } } 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 bdc12c2420..defdb87031 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 @@ -39,8 +39,8 @@ public class QuartzJobExecutionAdapter : IJob using (var scope = ServiceScopeFactory.CreateScope()) { var args = JsonSerializer.Deserialize(context.JobDetail.JobDataMap.GetString(nameof(TArgs))!); - var jobType = Options.GetJob(typeof(TArgs)).JobType; - var jobContext = new JobExecutionContext(scope.ServiceProvider, jobType, args!, cancellationToken: context.CancellationToken); + var jobConfiguration = Options.GetJob(typeof(TArgs)); + var jobContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType!, args!, cancellationToken: context.CancellationToken, jobName: jobConfiguration.JobName); try { await JobExecuter.ExecuteAsync(jobContext); @@ -97,7 +97,7 @@ public class QuartzJobExecutionAdapter : IJob var serializedArgs = context.JobDetail.JobDataMap.GetString(JobArgsKey)!; var jobConfiguration = Options.GetJob(jobName); var args = JsonSerializer.Deserialize(jobConfiguration.ArgsType, serializedArgs); - var jobContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, args, cancellationToken: context.CancellationToken); + var jobContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType ?? typeof(object), args, cancellationToken: context.CancellationToken, jobName: jobName); try { await JobExecuter.ExecuteAsync(jobContext); diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index 33c41704f2..be7614060d 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -214,8 +214,9 @@ public class JobQueue : IJobQueue { var context = new JobExecutionContext( scope.ServiceProvider, - JobConfiguration.JobType, - Serializer.Deserialize(ea.Body.ToArray(), typeof(TArgs)) + JobConfiguration.JobType ?? typeof(object), + Serializer.Deserialize(ea.Body.ToArray(), typeof(TArgs)), + jobName: JobConfiguration.JobName ); try diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs index 3d93fc68a1..915e061057 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Reflection; using Microsoft.Extensions.DependencyInjection; @@ -66,8 +66,8 @@ public class AbpBackgroundJobsTickerQModule : AbpModule { var jobExecuter = serviceProvider.GetRequiredService(); var args = await TickerRequestProvider.GetRequestAsync(context, cancellationToken); - var jobType = options.GetJob(typeof(TArgs)).JobType; - var jobExecutionContext = new JobExecutionContext(scope.ServiceProvider, jobType, args!, cancellationToken: cancellationToken); + var jobConfiguration = options.GetJob(typeof(TArgs)); + var jobExecutionContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType ?? typeof(object), args!, cancellationToken: cancellationToken, jobName: jobConfiguration.JobName); await jobExecuter.ExecuteAsync(jobExecutionContext); } }; diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs index a015e32d66..930beecd5c 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -65,9 +65,10 @@ public class BackgroundJobWorker : AsyncPeriodicBackgroundWorkerBase, IBackgroun var jobArgs = serializer.Deserialize(jobInfo.JobArgs, jobConfiguration.ArgsType); var context = new JobExecutionContext( workerContext.ServiceProvider, - jobConfiguration.JobType, + jobConfiguration.JobType ?? typeof(object), jobArgs, - workerContext.CancellationToken); + workerContext.CancellationToken, + jobName: jobInfo.JobName); try { diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs index f2464013fd..14e2c558bd 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs @@ -1,4 +1,5 @@ -using Volo.Abp.Autofac; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Autofac; using Volo.Abp.Modularity; namespace Volo.Abp.BackgroundJobs; @@ -10,5 +11,18 @@ namespace Volo.Abp.BackgroundJobs; )] public class AbpBackgroundJobsTestModule : AbpModule { + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddSingleton(); + Configure(options => + { + options.AddDynamicJob("TestDynamicJob", context => + { + var tracker = context.ServiceProvider.GetRequiredService(); + tracker.ExecutedArgs.Add(context.Args); + return System.Threading.Tasks.Task.CompletedTask; + }); + }); + } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs index db7b5f5cc8..87f7ff316b 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Shouldly; @@ -136,4 +137,56 @@ public class BackgroundJobExecuter_Tests : BackgroundJobsTestBase //Assert asyncJobObject.Canceled.ShouldBeTrue(); } + + [Fact] + public async Task Should_Execute_Dynamic_Handler() + { + var tracker = GetRequiredService(); + tracker.ExecutedArgs.ShouldBeEmpty(); + + var args = new Dictionary { ["Value"] = "dynamic-42" }; + + await _backgroundJobExecuter.ExecuteAsync( + new JobExecutionContext( + ServiceProvider, + typeof(object), + args, + jobName: "TestDynamicJob" + ) + ); + + tracker.ExecutedArgs.Count.ShouldBe(1); + tracker.ExecutedArgs[0]["Value"].ShouldBe("dynamic-42"); + } + + [Fact] + public async Task Should_Execute_Dynamic_Handler_Registered_At_Runtime() + { + var handlerProvider = GetRequiredService(); + var executedValues = new List(); + + handlerProvider.Register("RuntimeDynamicJob", context => + { + executedValues.Add(context.Args["Message"]?.ToString()!); + return Task.CompletedTask; + }); + + var args = new Dictionary { ["Message"] = "hello-runtime" }; + + await _backgroundJobExecuter.ExecuteAsync( + new JobExecutionContext( + ServiceProvider, + typeof(object), + args, + jobName: "RuntimeDynamicJob" + ) + ); + + executedValues.Count.ShouldBe(1); + executedValues[0].ShouldBe("hello-runtime"); + + handlerProvider.IsRegistered("RuntimeDynamicJob").ShouldBeTrue(); + handlerProvider.Unregister("RuntimeDynamicJob").ShouldBeTrue(); + handlerProvider.IsRegistered("RuntimeDynamicJob").ShouldBeFalse(); + } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs index 2f13e66822..75d1218f94 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs @@ -37,7 +37,7 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase public async Task Should_Store_Jobs_With_JobName() { var jobName = BackgroundJobNameAttribute.GetName(); - var jobIdAsString = await _backgroundJobManager.EnqueueAsync(jobName, new + var jobIdAsString = await _backgroundJobManager.EnqueueAsync(jobName, (object)new { Value = "42" }); @@ -52,7 +52,7 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase public async Task Should_Store_Async_Jobs_With_JobName() { var jobName = BackgroundJobNameAttribute.GetName(); - var jobIdAsString = await _backgroundJobManager.EnqueueAsync(jobName, new Dictionary() + var jobIdAsString = await _backgroundJobManager.EnqueueAsync(jobName, (object)new Dictionary() { ["Value"] = "42" }); @@ -62,4 +62,19 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase jobInfo.ShouldNotBeNull(); jobInfo.JobName.ShouldBe(jobName); } + + [Fact] + public async Task Should_Store_Dynamic_Jobs() + { + var jobIdAsString = await _backgroundJobManager.EnqueueAsync("TestDynamicJob", (object)new Dictionary + { + ["OrderId"] = "ORD-001" + }); + jobIdAsString.ShouldNotBe(default); + + var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); + jobInfo.ShouldNotBeNull(); + jobInfo.JobName.ShouldBe("TestDynamicJob"); + jobInfo.JobArgs.ShouldContain("ORD-001"); + } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs new file mode 100644 index 0000000000..dec387ab97 --- /dev/null +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Volo.Abp.BackgroundJobs; + +public class DynamicJobExecutionTracker +{ + public List> ExecutedArgs { get; } = new(); +} diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs index 713355636f..47da99d683 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs @@ -1,4 +1,6 @@ -using Microsoft.Extensions.DependencyInjection; +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; @@ -8,6 +10,20 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared [DependsOn(typeof(AbpMultiTenancyModule))] public class DemoAppSharedModule : AbpModule { + public override void ConfigureServices(ServiceConfigurationContext context) + { + Configure(options => + { + options.AddDynamicJob("CompileTimeDynamicJob", dynamicContext => + { + dynamicContext.Args.TryGetValue("Value", out var valueObj); + var value = valueObj?.ToString(); + Console.WriteLine($"[DYNAMIC-COMPILE] {value}"); + return Task.CompletedTask; + }); + }); + } + public override void OnPostApplicationInitialization(ApplicationInitializationContext context) { context.ServiceProvider diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs index b131c5943d..a9ceca9bdd 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs @@ -1,4 +1,6 @@ -using System.Threading.Tasks; +using System; +using System.Collections.Generic; +using System.Threading.Tasks; using Volo.Abp.DependencyInjection; using Volo.Abp.Threading; @@ -7,10 +9,14 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs public class SampleJobCreator : ITransientDependency { private readonly IBackgroundJobManager _backgroundJobManager; + private readonly IDynamicBackgroundJobHandlerProvider _dynamicBackgroundJobHandlerProvider; - public SampleJobCreator(IBackgroundJobManager backgroundJobManager) + public SampleJobCreator( + IBackgroundJobManager backgroundJobManager, + IDynamicBackgroundJobHandlerProvider dynamicBackgroundJobHandlerProvider) { _backgroundJobManager = backgroundJobManager; + _dynamicBackgroundJobHandlerProvider = dynamicBackgroundJobHandlerProvider; } public void CreateJobs() @@ -20,10 +26,49 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs public async Task CreateJobsAsync() { - await _backgroundJobManager.EnqueueAsync(new WriteToConsoleGreenJobArgs { Value = "test 1 (green)" }); - await _backgroundJobManager.EnqueueAsync(new WriteToConsoleGreenJobArgs { Value = "test 2 (green)" }); - await _backgroundJobManager.EnqueueAsync(new WriteToConsoleYellowJobArgs { Value = "test 1 (yellow)" }); - await _backgroundJobManager.EnqueueAsync(new WriteToConsoleYellowJobArgs { Value = "test 2 (yellow)" }); + _dynamicBackgroundJobHandlerProvider.Register("RuntimeDynamicJob", context => + { + context.Args.TryGetValue("Value", out var valueObj); + Console.WriteLine($"[DYNAMIC-RUNTIME] {valueObj}"); + return Task.CompletedTask; + }); + + // Type-safe enqueue (existing) + await _backgroundJobManager.EnqueueAsync(new WriteToConsoleGreenJobArgs { Value = "test 1 (green) - typed" }); + await _backgroundJobManager.EnqueueAsync(new WriteToConsoleYellowJobArgs { Value = "test 1 (yellow) - typed" }); + + // String-based enqueue with strongly-typed args + await _backgroundJobManager.EnqueueAsync( + "GreenJob", + (object)new WriteToConsoleGreenJobArgs { Value = "test 2 (green) - by name, typed args" } + ); + await _backgroundJobManager.EnqueueAsync( + "YellowJob", + (object)new WriteToConsoleYellowJobArgs { Value = "test 2 (yellow) - by name, typed args" } + ); + + // String-based enqueue with anonymous object + await _backgroundJobManager.EnqueueAsync( + "GreenJob", + (object)new { Value = "test 3 (green) - by name, anonymous", Time = DateTime.Now } + ); + await _backgroundJobManager.EnqueueAsync( + "YellowJob", + (object)new { Value = "test 3 (yellow) - by name, anonymous", Time = DateTime.Now } + ); + + // Dynamic enqueue (compile-time and runtime handlers) + if (!_backgroundJobManager.GetType().Name.Contains("RabbitMq", StringComparison.OrdinalIgnoreCase)) + { + await _backgroundJobManager.EnqueueAsync( + "CompileTimeDynamicJob", + (object)new Dictionary { ["Value"] = "test 4 (dynamic) - compile-time" } + ); + await _backgroundJobManager.EnqueueAsync( + "RuntimeDynamicJob", + (object)new Dictionary { ["Value"] = "test 5 (dynamic) - runtime" } + ); + } } } } From 67904ae2e4fa1c15870223ecd93ee86b01907403 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 12:58:01 +0300 Subject: [PATCH 04/40] Add anonymous background job support Introduce anonymous/background-job-by-name support: add AnonymousJobArgs, IAnonymousJobHandlerRegistry and AnonymousJobHandlerRegistry, and an AnonymousJobExecutorAsyncBackgroundJob to execute JSON-based anonymous handlers. AbpBackgroundJobOptions now stores anonymous handlers and exposes registration/query helpers. Updated background job managers (Default, Hangfire, Quartz, RabbitMQ, TickerQ) to wrap registered anonymous jobs into AnonymousJobArgs when enqueuing and to depend on the handler registry and JSON serializer where needed. Removed the old dynamic handler types/APIs (DynamicBackgroundJobContext, IDynamicBackgroundJobHandlerProvider, DynamicBackgroundJobHandlerProvider) and related dynamic handling code; BackgroundJobConfiguration simplified (JobType non-nullable) and JobExecutionContext no longer carries JobName. Tests and demo code updated to use anonymous handlers and tracking. This change centralizes runtime-registered handlers keyed by job name and standardizes anonymous job payloads as JSON. --- .../hooks/state/continual-learning-index.json | 9 +++ .cursor/hooks/state/continual-learning.json | 8 +++ .../BackgroundJobs/AbpBackgroundJobOptions.cs | 30 +++++---- .../Abp/BackgroundJobs/AnonymousJobArgs.cs | 17 +++++ .../AnonymousJobHandlerRegistry.cs | 56 ++++++++++++++++ .../BackgroundJobConfiguration.cs | 19 +----- .../BackgroundJobs/BackgroundJobExecuter.cs | 65 ------------------- .../DynamicBackgroundJobContext.cs | 25 ------- .../DynamicBackgroundJobHandlerProvider.cs | 36 ---------- .../IAnonymousJobHandlerRegistry.cs | 18 +++++ .../IDynamicBackgroundJobHandlerProvider.cs | 15 ----- .../Abp/BackgroundJobs/JobExecutionContext.cs | 6 +- .../Hangfire/HangfireBackgroundJobManager.cs | 17 ++++- .../Hangfire/HangfireJobExecutionAdapter.cs | 4 +- .../Quartz/QuartzBackgroundJobManager.cs | 17 ++++- .../Quartz/QuartzJobExecutionAdapter.cs | 2 +- .../Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 5 +- .../RabbitMQ/RabbitMqBackgroundJobManager.cs | 19 +++++- .../TickerQ/AbpBackgroundJobsTickerQModule.cs | 2 +- .../TickerQ/AbpTickerQBackgroundJobManager.cs | 21 +++++- .../AnonymousJobExecutorAsyncBackgroundJob.cs | 35 ++++++++++ .../Abp/BackgroundJobs/BackgroundJobWorker.cs | 5 +- .../DefaultBackgroundJobManager.cs | 15 +++++ .../AbpBackgroundJobsTestModule.cs | 8 +-- .../AnonymousJobExecutionTracker.cs | 8 +++ .../BackgroundJobExecuter_Tests.cs | 40 ++++++------ .../BackgroundJobManager_Tests.cs | 10 ++- .../DynamicJobExecutionTracker.cs | 8 --- .../DemoAppSharedModule.cs | 9 +-- .../Jobs/SampleJobCreator.cs | 27 ++++---- .../background-jobs/app/docker-compose.yml | 25 +++++++ 31 files changed, 334 insertions(+), 247 deletions(-) create mode 100644 .cursor/hooks/state/continual-learning-index.json create mode 100644 .cursor/hooks/state/continual-learning.json create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobArgs.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs delete mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobContext.cs delete mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerProvider.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAnonymousJobHandlerRegistry.cs delete mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerProvider.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs create mode 100644 framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AnonymousJobExecutionTracker.cs delete mode 100644 framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs create mode 100644 modules/background-jobs/app/docker-compose.yml diff --git a/.cursor/hooks/state/continual-learning-index.json b/.cursor/hooks/state/continual-learning-index.json new file mode 100644 index 0000000000..43a36a8c73 --- /dev/null +++ b/.cursor/hooks/state/continual-learning-index.json @@ -0,0 +1,9 @@ +{ + "version": 1, + "transcripts": { + "C:\\Users\\salih\\.cursor\\projects\\d-GitHub2-abp\\agent-transcripts\\ded34ec4-ff99-404a-8b16-10baf3c5d9f5\\ded34ec4-ff99-404a-8b16-10baf3c5d9f5.jsonl": { + "mtimeMs": 1773090599259, + "lastProcessedAt": "2026-03-10T00:18:00.000Z" + } + } +} diff --git a/.cursor/hooks/state/continual-learning.json b/.cursor/hooks/state/continual-learning.json new file mode 100644 index 0000000000..a24cb999b0 --- /dev/null +++ b/.cursor/hooks/state/continual-learning.json @@ -0,0 +1,8 @@ +{ + "version": 1, + "lastRunAtMs": 1773090515725, + "turnsSinceLastRun": 5, + "lastTranscriptMtimeMs": 1773090515368, + "lastProcessedGenerationId": "b1b803a9-44bb-4047-a116-4c108a6dadd1", + "trialStartedAtMs": null +} 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 10cacce13e..b10b9cec0e 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 @@ -2,6 +2,7 @@ using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; +using System.Threading; using System.Threading.Tasks; namespace Volo.Abp.BackgroundJobs; @@ -10,6 +11,7 @@ public class AbpBackgroundJobOptions { private readonly Dictionary _jobConfigurationsByArgsType; private readonly ConcurrentDictionary _jobConfigurationsByName; + private readonly ConcurrentDictionary> _anonymousHandlers = new(); /// /// Default: true. @@ -60,7 +62,7 @@ public class AbpBackgroundJobOptions public BackgroundJobConfiguration? GetJobOrNull(string name) { - return _jobConfigurationsByName.GetValueOrDefault(name); + return _jobConfigurationsByName.TryGetValue(name, out var config) ? config : null; } public IReadOnlyList GetJobs() @@ -84,28 +86,30 @@ public class AbpBackgroundJobOptions _jobConfigurationsByName[jobConfiguration.JobName] = jobConfiguration; } - public void AddDynamicJob(string jobName, Func handler) + public void AddAnonymousJobHandler(string jobName, Func handler) { - var config = new BackgroundJobConfiguration(jobName, handler); - _jobConfigurationsByName[jobName] = config; + Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); + Check.NotNull(handler, nameof(handler)); + + _anonymousHandlers[jobName] = handler; } - public void AddDynamicJob(string jobName, Action handler) + public void AddAnonymousJobHandler(string jobName, Action handler) { - AddDynamicJob(jobName, context => + AddAnonymousJobHandler(jobName, (jsonData, sp, ct) => { - handler(context); + handler(jsonData, sp, ct); return Task.CompletedTask; }); } - public bool RemoveDynamicJob(string name) + internal bool TryGetAnonymousHandler(string jobName, out Func? handler) { - if (_jobConfigurationsByName.TryGetValue(name, out var config) && config.IsDynamic) - { - return _jobConfigurationsByName.TryRemove(name, out _); - } + return _anonymousHandlers.TryGetValue(jobName, out handler); + } - return false; + internal bool IsAnonymousJobRegistered(string jobName) + { + return _anonymousHandlers.ContainsKey(jobName); } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobArgs.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobArgs.cs new file mode 100644 index 0000000000..09bac99878 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobArgs.cs @@ -0,0 +1,17 @@ +namespace Volo.Abp.BackgroundJobs; + +[BackgroundJobName("AnonymousJob")] +public class AnonymousJobArgs +{ + public const string JobNameConstant = "AnonymousJob"; + + public string JobName { get; } + + public string JsonData { get; } + + public AnonymousJobArgs(string jobName, string jsonData) + { + JobName = Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); + JsonData = Check.NotNull(jsonData, nameof(jsonData)); + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs new file mode 100644 index 0000000000..66c8f95ec2 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs @@ -0,0 +1,56 @@ +using System; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BackgroundJobs; + +public class AnonymousJobHandlerRegistry : IAnonymousJobHandlerRegistry, ISingletonDependency +{ + private readonly ConcurrentDictionary> _handlers = new(); + private readonly AbpBackgroundJobOptions _options; + + public AnonymousJobHandlerRegistry(IOptions options) + { + _options = options.Value; + } + + public virtual void Register(string jobName, Func handler) + { + Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); + Check.NotNull(handler, nameof(handler)); + + _handlers[jobName] = handler; + } + + public virtual void Register(string jobName, Action handler) + { + Register(jobName, (jsonData, sp, ct) => + { + handler(jsonData, sp, ct); + return Task.CompletedTask; + }); + } + + public virtual bool Unregister(string jobName) + { + return _handlers.TryRemove(jobName, out _); + } + + public virtual bool IsRegistered(string jobName) + { + return _handlers.ContainsKey(jobName) || _options.IsAnonymousJobRegistered(jobName); + } + + public virtual Func? Get(string jobName) + { + if (_handlers.TryGetValue(jobName, out var handler)) + { + return handler; + } + + return _options.TryGetAnonymousHandler(jobName, out handler) ? handler : null; + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs index cd0e844a99..fa54ab5538 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs @@ -1,6 +1,4 @@ using System; -using System.Collections.Generic; -using System.Threading.Tasks; namespace Volo.Abp.BackgroundJobs; @@ -8,29 +6,14 @@ public class BackgroundJobConfiguration { public Type ArgsType { get; } - public Type? JobType { get; } + public Type JobType { get; } public string JobName { get; } - public bool IsDynamic { get; } - - public Func? DynamicHandler { get; } - public BackgroundJobConfiguration(Type jobType, string jobName) { JobType = jobType; ArgsType = BackgroundJobArgsHelper.GetJobArgsType(jobType); JobName = jobName; } - - public BackgroundJobConfiguration(string jobName, Func handler) - { - Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); - Check.NotNull(handler, nameof(handler)); - - JobName = jobName; - DynamicHandler = handler; - IsDynamic = true; - ArgsType = typeof(Dictionary); - } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs index d84845ee0f..0170b881df 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs @@ -2,8 +2,6 @@ using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using System; -using System.Collections.Generic; -using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; @@ -31,54 +29,9 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc public virtual async Task ExecuteAsync(JobExecutionContext context) { - if (context.JobName != null) - { - var jobConfig = Options.GetJobOrNull(context.JobName); - if (jobConfig?.DynamicHandler != null) - { - await ExecuteDynamicHandlerAsync(context, jobConfig); - return; - } - } - await ExecuteTypedHandlerAsync(context); } - protected virtual async Task ExecuteDynamicHandlerAsync(JobExecutionContext context, BackgroundJobConfiguration jobConfig) - { - try - { - var cancellationTokenProvider = - context.ServiceProvider.GetRequiredService(); - - using (cancellationTokenProvider.Use(context.CancellationToken)) - { - var dictArgs = EnsureDictionaryArgs(context.JobArgs); - var dynamicContext = new DynamicBackgroundJobContext( - context.ServiceProvider, - dictArgs, - context.CancellationToken - ); - - await jobConfig.DynamicHandler!(dynamicContext); - } - } - catch (Exception ex) - { - Logger.LogException(ex); - - await context.ServiceProvider - .GetRequiredService() - .NotifyAsync(new ExceptionNotificationContext(ex)); - - throw new BackgroundJobExecutionException("A background job execution is failed. See inner exception for details.", ex) - { - JobType = context.JobName!, - JobArgs = context.JobArgs - }; - } - } - protected virtual async Task ExecuteTypedHandlerAsync(JobExecutionContext context) { var job = context.ServiceProvider.GetService(context.JobType); @@ -131,24 +84,6 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc } } - protected virtual Dictionary EnsureDictionaryArgs(object jobArgs) - { - if (jobArgs is Dictionary dict) - { - return dict; - } - - if (jobArgs is JsonElement jsonElement) - { - return JsonSerializer.Deserialize>(jsonElement.GetRawText()) - ?? new Dictionary(); - } - - var json = JsonSerializer.Serialize(jobArgs); - return JsonSerializer.Deserialize>(json) - ?? new Dictionary(); - } - protected virtual Guid? GetJobArgsTenantId(object jobArgs) { return jobArgs switch diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobContext.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobContext.cs deleted file mode 100644 index 49ffe89aca..0000000000 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobContext.cs +++ /dev/null @@ -1,25 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.BackgroundJobs; - -public class DynamicBackgroundJobContext : IServiceProviderAccessor -{ - public IServiceProvider ServiceProvider { get; } - - public Dictionary Args { get; } - - public CancellationToken CancellationToken { get; } - - public DynamicBackgroundJobContext( - IServiceProvider serviceProvider, - Dictionary args, - CancellationToken cancellationToken = default) - { - ServiceProvider = serviceProvider; - Args = args; - CancellationToken = cancellationToken; - } -} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerProvider.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerProvider.cs deleted file mode 100644 index 2665719c2a..0000000000 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerProvider.cs +++ /dev/null @@ -1,36 +0,0 @@ -using System; -using System.Threading.Tasks; -using Microsoft.Extensions.Options; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.BackgroundJobs; - -public class DynamicBackgroundJobHandlerProvider : IDynamicBackgroundJobHandlerProvider, ISingletonDependency -{ - protected AbpBackgroundJobOptions Options { get; } - - public DynamicBackgroundJobHandlerProvider(IOptions options) - { - Options = options.Value; - } - - public virtual void Register(string jobName, Func handler) - { - Options.AddDynamicJob(jobName, handler); - } - - public virtual void Register(string jobName, Action handler) - { - Options.AddDynamicJob(jobName, handler); - } - - public virtual bool Unregister(string jobName) - { - return Options.RemoveDynamicJob(jobName); - } - - public virtual bool IsRegistered(string jobName) - { - return Options.GetJobOrNull(jobName)?.IsDynamic == true; - } -} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAnonymousJobHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAnonymousJobHandlerRegistry.cs new file mode 100644 index 0000000000..e02c09ab28 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAnonymousJobHandlerRegistry.cs @@ -0,0 +1,18 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; + +namespace Volo.Abp.BackgroundJobs; + +public interface IAnonymousJobHandlerRegistry +{ + void Register(string jobName, Func handler); + + void Register(string jobName, Action handler); + + bool Unregister(string jobName); + + bool IsRegistered(string jobName); + + Func? Get(string jobName); +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerProvider.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerProvider.cs deleted file mode 100644 index 0f1bb8449a..0000000000 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerProvider.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Threading.Tasks; - -namespace Volo.Abp.BackgroundJobs; - -public interface IDynamicBackgroundJobHandlerProvider -{ - void Register(string jobName, Func handler); - - void Register(string jobName, Action handler); - - bool Unregister(string jobName); - - bool IsRegistered(string jobName); -} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs index a68736bb7d..4ef2d2c19d 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs @@ -14,19 +14,15 @@ public class JobExecutionContext : IServiceProviderAccessor public CancellationToken CancellationToken { get; } - public string? JobName { get; } - public JobExecutionContext( IServiceProvider serviceProvider, Type jobType, object jobArgs, - CancellationToken cancellationToken = default, - string? jobName = null) + CancellationToken cancellationToken = default) { ServiceProvider = serviceProvider; JobType = jobType; JobArgs = jobArgs; CancellationToken = cancellationToken; - JobName = jobName; } } 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 840b546783..fbd1034ecd 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 @@ -16,15 +16,18 @@ public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDep protected IOptions BackgroundJobOptions { get; } protected IOptions HangfireOptions { get; } protected IJsonSerializer JsonSerializer { get; } + protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } public HangfireBackgroundJobManager( IOptions backgroundJobOptions, IOptions hangfireOptions, - IJsonSerializer jsonSerializer) + IJsonSerializer jsonSerializer, + IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry) { BackgroundJobOptions = backgroundJobOptions; HangfireOptions = hangfireOptions; JsonSerializer = jsonSerializer; + AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; } public virtual Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, @@ -43,6 +46,13 @@ public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDep public virtual Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { + if (ShouldWrapAsAnonymousJob(jobName)) + { + var jsonData = JsonSerializer.Serialize(args); + var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); + return EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); + } + var serializedArgs = JsonSerializer.Serialize(args); var queueName = GetQueueName(jobName); @@ -56,6 +66,11 @@ public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDep )); } + protected virtual bool ShouldWrapAsAnonymousJob(string jobName) + { + return jobName != AnonymousJobArgs.JobNameConstant && AnonymousJobHandlerRegistry.IsRegistered(jobName); + } + protected virtual string GetQueueName(Type argsType) { return GetQueueName(BackgroundJobOptions.Value.GetJob(argsType)); 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 b85154a5c3..38d6bbdf52 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 @@ -40,7 +40,7 @@ public class HangfireJobExecutionAdapter using (var scope = ServiceScopeFactory.CreateScope()) { var jobConfiguration = Options.GetJob(typeof(TArgs)); - var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType!, args!, cancellationToken: cancellationToken, jobName: jobConfiguration.JobName); + var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType!, args!, cancellationToken: cancellationToken); await JobExecuter.ExecuteAsync(context); } } @@ -83,7 +83,7 @@ public class HangfireJobExecutionAdapter { var jobConfiguration = Options.GetJob(jobName); var args = JsonSerializer.Deserialize(jobConfiguration.ArgsType, serializedArgs); - var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType ?? typeof(object), args, cancellationToken: cancellationToken, jobName: jobName); + var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, args, cancellationToken: cancellationToken); await JobExecuter.ExecuteAsync(context); } } 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 dd8e385246..842f47c78f 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 @@ -19,11 +19,14 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen protected IJsonSerializer JsonSerializer { get; } - public QuartzBackgroundJobManager(IScheduler scheduler, IOptions options, IJsonSerializer jsonSerializer) + protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } + + public QuartzBackgroundJobManager(IScheduler scheduler, IOptions options, IJsonSerializer jsonSerializer, IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry) { Scheduler = scheduler; JsonSerializer = jsonSerializer; Options = options.Value; + AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; } public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, @@ -35,9 +38,21 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen public virtual async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { + if (ShouldWrapAsAnonymousJob(jobName)) + { + var jsonData = JsonSerializer.Serialize(args); + var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); + return await EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); + } + return await ReEnqueueAsync(jobName, args, Options.RetryCount, Options.RetryIntervalMillisecond, priority, delay); } + protected virtual bool ShouldWrapAsAnonymousJob(string jobName) + { + return jobName != AnonymousJobArgs.JobNameConstant && AnonymousJobHandlerRegistry.IsRegistered(jobName); + } + public virtual async Task ReEnqueueAsync(TArgs args, int retryCount, int retryIntervalMillisecond, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { 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 defdb87031..d6e690dcff 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 @@ -97,7 +97,7 @@ public class QuartzJobExecutionAdapter : IJob var serializedArgs = context.JobDetail.JobDataMap.GetString(JobArgsKey)!; var jobConfiguration = Options.GetJob(jobName); var args = JsonSerializer.Deserialize(jobConfiguration.ArgsType, serializedArgs); - var jobContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType ?? typeof(object), args, cancellationToken: context.CancellationToken, jobName: jobName); + var jobContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, args, cancellationToken: context.CancellationToken); try { await JobExecuter.ExecuteAsync(jobContext); diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index be7614060d..33c41704f2 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -214,9 +214,8 @@ public class JobQueue : IJobQueue { var context = new JobExecutionContext( scope.ServiceProvider, - JobConfiguration.JobType ?? typeof(object), - Serializer.Deserialize(ea.Body.ToArray(), typeof(TArgs)), - jobName: JobConfiguration.JobName + JobConfiguration.JobType, + Serializer.Deserialize(ea.Body.ToArray(), typeof(TArgs)) ); try diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs index 69ac3c0a62..5c7b420c98 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs @@ -1,6 +1,7 @@ using System; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; +using Volo.Abp.Json; namespace Volo.Abp.BackgroundJobs.RabbitMQ; @@ -8,10 +9,14 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ; public class RabbitMqBackgroundJobManager : IBackgroundJobManager, ITransientDependency { protected IJobQueueManager JobQueueManager { get; } + protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } + protected IJsonSerializer JsonSerializer { get; } - public RabbitMqBackgroundJobManager(IJobQueueManager jobQueueManager) + public RabbitMqBackgroundJobManager(IJobQueueManager jobQueueManager, IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry, IJsonSerializer jsonSerializer) { JobQueueManager = jobQueueManager; + AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; + JsonSerializer = jsonSerializer; } public virtual async Task EnqueueAsync( @@ -29,7 +34,19 @@ public class RabbitMqBackgroundJobManager : IBackgroundJobManager, ITransientDep BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { + if (ShouldWrapAsAnonymousJob(jobName)) + { + var jsonData = JsonSerializer.Serialize(args); + var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); + return await EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); + } + var jobQueue = await JobQueueManager.GetAsync(jobName); return (await jobQueue.EnqueueAsync(args, priority, delay))!; } + + protected virtual bool ShouldWrapAsAnonymousJob(string jobName) + { + return jobName != AnonymousJobArgs.JobNameConstant && AnonymousJobHandlerRegistry.IsRegistered(jobName); + } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs index 915e061057..1cde94b517 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs @@ -67,7 +67,7 @@ public class AbpBackgroundJobsTickerQModule : AbpModule var jobExecuter = serviceProvider.GetRequiredService(); var args = await TickerRequestProvider.GetRequestAsync(context, cancellationToken); var jobConfiguration = options.GetJob(typeof(TArgs)); - var jobExecutionContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType ?? typeof(object), args!, cancellationToken: cancellationToken, jobName: jobConfiguration.JobName); + var jobExecutionContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, args!, cancellationToken: cancellationToken); await jobExecuter.ExecuteAsync(jobExecutionContext); } }; diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs index f70e48fcf5..0b4557f09c 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs @@ -6,6 +6,7 @@ using TickerQ.Utilities; using TickerQ.Utilities.Entities; using TickerQ.Utilities.Interfaces.Managers; using Volo.Abp.DependencyInjection; +using Volo.Abp.Json; namespace Volo.Abp.BackgroundJobs.TickerQ; @@ -17,15 +18,21 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD protected ITimeTickerManager TimeTickerManager { get; } protected AbpBackgroundJobOptions Options { get; } protected AbpBackgroundJobsTickerQOptions TickerQOptions { get; } + protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } + protected IJsonSerializer JsonSerializer { get; } public AbpTickerQBackgroundJobManager( ITimeTickerManager timeTickerManager, IOptions options, - IOptions tickerQOptions) + IOptions tickerQOptions, + IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry, + IJsonSerializer jsonSerializer) { TimeTickerManager = timeTickerManager; Options = options.Value; TickerQOptions = tickerQOptions.Value; + AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; + JsonSerializer = jsonSerializer; } public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) @@ -36,10 +43,22 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD public virtual async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { + if (ShouldWrapAsAnonymousJob(jobName)) + { + var jsonData = JsonSerializer.Serialize(args); + var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); + return await EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); + } + var job = Options.GetJob(jobName); return await EnqueueAsync(job, args, priority, delay); } + protected virtual bool ShouldWrapAsAnonymousJob(string jobName) + { + return jobName != AnonymousJobArgs.JobNameConstant && AnonymousJobHandlerRegistry.IsRegistered(jobName); + } + protected virtual async Task EnqueueAsync(BackgroundJobConfiguration job, object args, BackgroundJobPriority priority, TimeSpan? delay) { var timeTicker = new TimeTickerEntity diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs new file mode 100644 index 0000000000..6bc0c594c7 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs @@ -0,0 +1,35 @@ +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; + +namespace Volo.Abp.BackgroundJobs; + +public class AnonymousJobExecutorAsyncBackgroundJob : AsyncBackgroundJob, ITransientDependency +{ + protected IAnonymousJobHandlerRegistry HandlerRegistry { get; } + protected IServiceProvider ServiceProvider { get; } + protected ICancellationTokenProvider CancellationTokenProvider { get; } + + public AnonymousJobExecutorAsyncBackgroundJob( + IAnonymousJobHandlerRegistry handlerRegistry, + IServiceProvider serviceProvider, + ICancellationTokenProvider cancellationTokenProvider) + { + HandlerRegistry = handlerRegistry; + ServiceProvider = serviceProvider; + CancellationTokenProvider = cancellationTokenProvider; + } + + public override async Task ExecuteAsync(AnonymousJobArgs args) + { + var handler = HandlerRegistry.Get(args.JobName); + if (handler == null) + { + throw new AbpException("No anonymous job handler registered for: " + args.JobName); + } + + await handler(args.JsonData, ServiceProvider, CancellationTokenProvider.Token); + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs index 930beecd5c..159f11a6d3 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs @@ -65,10 +65,9 @@ public class BackgroundJobWorker : AsyncPeriodicBackgroundWorkerBase, IBackgroun var jobArgs = serializer.Deserialize(jobInfo.JobArgs, jobConfiguration.ArgsType); var context = new JobExecutionContext( workerContext.ServiceProvider, - jobConfiguration.JobType ?? typeof(object), + jobConfiguration.JobType, jobArgs, - workerContext.CancellationToken, - jobName: jobInfo.JobName); + workerContext.CancellationToken); try { diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs index 582d351431..1760342ef1 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs @@ -18,6 +18,7 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe protected IBackgroundJobSerializer Serializer { get; } protected IGuidGenerator GuidGenerator { get; } protected IBackgroundJobStore Store { get; } + protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } protected IOptions BackgroundJobOptions { get; } protected IOptions BackgroundJobWorkerOptions { get; } @@ -26,12 +27,14 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe IBackgroundJobSerializer serializer, IBackgroundJobStore store, IGuidGenerator guidGenerator, + IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry, IOptions backgroundJobOptions, IOptions backgroundJobWorkerOptions) { Clock = clock; Serializer = serializer; GuidGenerator = guidGenerator; + AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; BackgroundJobOptions = backgroundJobOptions; BackgroundJobWorkerOptions = backgroundJobWorkerOptions; Store = store; @@ -45,6 +48,13 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe public virtual async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { + if (ShouldWrapAsAnonymousJob(jobName)) + { + var jsonData = Serializer.Serialize(args); + var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); + return await EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); + } + var jobInfo = new BackgroundJobInfo { Id = GuidGenerator.Create(), @@ -65,4 +75,9 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe return jobInfo.Id.ToString(); } + + protected virtual bool ShouldWrapAsAnonymousJob(string jobName) + { + return jobName != AnonymousJobArgs.JobNameConstant && AnonymousJobHandlerRegistry.IsRegistered(jobName); + } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs index 14e2c558bd..ee792812ac 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs @@ -13,14 +13,14 @@ public class AbpBackgroundJobsTestModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.AddSingleton(); + context.Services.AddSingleton(); Configure(options => { - options.AddDynamicJob("TestDynamicJob", context => + options.AddAnonymousJobHandler("TestAnonymousJob", (jsonData, sp, ct) => { - var tracker = context.ServiceProvider.GetRequiredService(); - tracker.ExecutedArgs.Add(context.Args); + var tracker = sp.GetRequiredService(); + tracker.ExecutedJsonData.Add(jsonData); return System.Threading.Tasks.Task.CompletedTask; }); }); diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AnonymousJobExecutionTracker.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AnonymousJobExecutionTracker.cs new file mode 100644 index 0000000000..b3160a2829 --- /dev/null +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AnonymousJobExecutionTracker.cs @@ -0,0 +1,8 @@ +using System.Collections.Generic; + +namespace Volo.Abp.BackgroundJobs; + +public class AnonymousJobExecutionTracker +{ + public List ExecutedJsonData { get; } = new(); +} diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs index 87f7ff316b..a46e79d15d 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs @@ -139,54 +139,52 @@ public class BackgroundJobExecuter_Tests : BackgroundJobsTestBase } [Fact] - public async Task Should_Execute_Dynamic_Handler() + public async Task Should_Execute_Anonymous_Job_Handler() { - var tracker = GetRequiredService(); - tracker.ExecutedArgs.ShouldBeEmpty(); + var tracker = GetRequiredService(); + tracker.ExecutedJsonData.ShouldBeEmpty(); - var args = new Dictionary { ["Value"] = "dynamic-42" }; + var args = new AnonymousJobArgs("TestAnonymousJob", "{\"OrderId\":\"ORD-001\"}"); await _backgroundJobExecuter.ExecuteAsync( new JobExecutionContext( ServiceProvider, - typeof(object), - args, - jobName: "TestDynamicJob" + typeof(AnonymousJobExecutorAsyncBackgroundJob), + args ) ); - tracker.ExecutedArgs.Count.ShouldBe(1); - tracker.ExecutedArgs[0]["Value"].ShouldBe("dynamic-42"); + tracker.ExecutedJsonData.Count.ShouldBe(1); + tracker.ExecutedJsonData[0].ShouldContain("ORD-001"); } [Fact] - public async Task Should_Execute_Dynamic_Handler_Registered_At_Runtime() + public async Task Should_Execute_Anonymous_Job_Handler_Registered_At_Runtime() { - var handlerProvider = GetRequiredService(); + var handlerRegistry = GetRequiredService(); var executedValues = new List(); - handlerProvider.Register("RuntimeDynamicJob", context => + handlerRegistry.Register("RuntimeAnonymousJob", (jsonData, sp, ct) => { - executedValues.Add(context.Args["Message"]?.ToString()!); + executedValues.Add(jsonData); return Task.CompletedTask; }); - var args = new Dictionary { ["Message"] = "hello-runtime" }; + var args = new AnonymousJobArgs("RuntimeAnonymousJob", "{\"Message\":\"hello-runtime\"}"); await _backgroundJobExecuter.ExecuteAsync( new JobExecutionContext( ServiceProvider, - typeof(object), - args, - jobName: "RuntimeDynamicJob" + typeof(AnonymousJobExecutorAsyncBackgroundJob), + args ) ); executedValues.Count.ShouldBe(1); - executedValues[0].ShouldBe("hello-runtime"); + executedValues[0].ShouldContain("hello-runtime"); - handlerProvider.IsRegistered("RuntimeDynamicJob").ShouldBeTrue(); - handlerProvider.Unregister("RuntimeDynamicJob").ShouldBeTrue(); - handlerProvider.IsRegistered("RuntimeDynamicJob").ShouldBeFalse(); + handlerRegistry.IsRegistered("RuntimeAnonymousJob").ShouldBeTrue(); + handlerRegistry.Unregister("RuntimeAnonymousJob").ShouldBeTrue(); + handlerRegistry.IsRegistered("RuntimeAnonymousJob").ShouldBeFalse(); } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs index 75d1218f94..bb8d05bf86 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs @@ -64,17 +64,15 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase } [Fact] - public async Task Should_Store_Dynamic_Jobs() + public async Task Should_Store_Anonymous_Jobs() { - var jobIdAsString = await _backgroundJobManager.EnqueueAsync("TestDynamicJob", (object)new Dictionary - { - ["OrderId"] = "ORD-001" - }); + var jobIdAsString = await _backgroundJobManager.EnqueueAsync("TestAnonymousJob", new { OrderId = "ORD-001" }); jobIdAsString.ShouldNotBe(default); var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); jobInfo.ShouldNotBeNull(); - jobInfo.JobName.ShouldBe("TestDynamicJob"); + jobInfo.JobName.ShouldBe(AnonymousJobArgs.JobNameConstant); + jobInfo.JobArgs.ShouldContain("TestAnonymousJob"); jobInfo.JobArgs.ShouldContain("ORD-001"); } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs deleted file mode 100644 index dec387ab97..0000000000 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System.Collections.Generic; - -namespace Volo.Abp.BackgroundJobs; - -public class DynamicJobExecutionTracker -{ - public List> ExecutedArgs { get; } = new(); -} diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs index 47da99d683..58046b6313 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs @@ -1,4 +1,5 @@ using System; +using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs; @@ -14,11 +15,11 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared { Configure(options => { - options.AddDynamicJob("CompileTimeDynamicJob", dynamicContext => + options.AddAnonymousJobHandler("CompileTimeAnonymousJob", (jsonData, sp, ct) => { - dynamicContext.Args.TryGetValue("Value", out var valueObj); - var value = valueObj?.ToString(); - Console.WriteLine($"[DYNAMIC-COMPILE] {value}"); + var doc = JsonDocument.Parse(jsonData); + var value = doc.RootElement.TryGetProperty("Value", out var prop) ? prop.GetString() : null; + Console.WriteLine($"[ANONYMOUS-COMPILE] {value}"); return Task.CompletedTask; }); }); diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs index a9ceca9bdd..485468582b 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs @@ -1,5 +1,5 @@ using System; -using System.Collections.Generic; +using System.Text.Json; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; using Volo.Abp.Threading; @@ -9,14 +9,14 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs public class SampleJobCreator : ITransientDependency { private readonly IBackgroundJobManager _backgroundJobManager; - private readonly IDynamicBackgroundJobHandlerProvider _dynamicBackgroundJobHandlerProvider; + private readonly IAnonymousJobHandlerRegistry _anonymousJobHandlerRegistry; public SampleJobCreator( IBackgroundJobManager backgroundJobManager, - IDynamicBackgroundJobHandlerProvider dynamicBackgroundJobHandlerProvider) + IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry) { _backgroundJobManager = backgroundJobManager; - _dynamicBackgroundJobHandlerProvider = dynamicBackgroundJobHandlerProvider; + _anonymousJobHandlerRegistry = anonymousJobHandlerRegistry; } public void CreateJobs() @@ -26,10 +26,11 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs public async Task CreateJobsAsync() { - _dynamicBackgroundJobHandlerProvider.Register("RuntimeDynamicJob", context => + _anonymousJobHandlerRegistry.Register("RuntimeAnonymousJob", (jsonData, sp, ct) => { - context.Args.TryGetValue("Value", out var valueObj); - Console.WriteLine($"[DYNAMIC-RUNTIME] {valueObj}"); + var doc = JsonDocument.Parse(jsonData); + var value = doc.RootElement.TryGetProperty("Value", out var prop) ? prop.GetString() : null; + Console.WriteLine($"[ANONYMOUS-RUNTIME] {value}"); return Task.CompletedTask; }); @@ -57,16 +58,16 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs (object)new { Value = "test 3 (yellow) - by name, anonymous", Time = DateTime.Now } ); - // Dynamic enqueue (compile-time and runtime handlers) - if (!_backgroundJobManager.GetType().Name.Contains("RabbitMq", StringComparison.OrdinalIgnoreCase)) + // Anonymous job enqueue (compile-time and runtime handlers) + if (!_backgroundJobManager.GetType().Name.ToUpperInvariant().Contains("RABBITMQ")) { await _backgroundJobManager.EnqueueAsync( - "CompileTimeDynamicJob", - (object)new Dictionary { ["Value"] = "test 4 (dynamic) - compile-time" } + "CompileTimeAnonymousJob", + new { Value = "test 4 (anonymous) - compile-time" } ); await _backgroundJobManager.EnqueueAsync( - "RuntimeDynamicJob", - (object)new Dictionary { ["Value"] = "test 5 (dynamic) - runtime" } + "RuntimeAnonymousJob", + new { Value = "test 5 (anonymous) - runtime" } ); } } diff --git a/modules/background-jobs/app/docker-compose.yml b/modules/background-jobs/app/docker-compose.yml new file mode 100644 index 0000000000..613711d0b7 --- /dev/null +++ b/modules/background-jobs/app/docker-compose.yml @@ -0,0 +1,25 @@ +services: + sqlserver: + image: mcr.microsoft.com/mssql/server:2022-latest + environment: + ACCEPT_EULA: "Y" + MSSQL_SA_PASSWORD: "YourStrong!Passw0rd" + ports: + - "1433:1433" + volumes: + - sqlserver-data:/var/opt/mssql + + rabbitmq: + image: rabbitmq:4-management + ports: + - "5672:5672" + - "15672:15672" + environment: + RABBITMQ_DEFAULT_USER: "guest" + RABBITMQ_DEFAULT_PASS: "guest" + volumes: + - rabbitmq-data:/var/lib/rabbitmq + +volumes: + sqlserver-data: + rabbitmq-data: From e2e41ff14142df77e3ccd67e15e7fb8e667466a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 12:58:35 +0300 Subject: [PATCH 05/40] Remove continual-learning hook state files Delete .cursor/hooks/state/continual-learning-index.json and .cursor/hooks/state/continual-learning.json which held persisted continual-learning metadata (transcript index, last run timestamps, last processed generation ID, etc.). This cleans up obsolete/reset state for the Cursor continual-learning hooks. --- .cursor/hooks/state/continual-learning-index.json | 9 --------- .cursor/hooks/state/continual-learning.json | 8 -------- 2 files changed, 17 deletions(-) delete mode 100644 .cursor/hooks/state/continual-learning-index.json delete mode 100644 .cursor/hooks/state/continual-learning.json diff --git a/.cursor/hooks/state/continual-learning-index.json b/.cursor/hooks/state/continual-learning-index.json deleted file mode 100644 index 43a36a8c73..0000000000 --- a/.cursor/hooks/state/continual-learning-index.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "version": 1, - "transcripts": { - "C:\\Users\\salih\\.cursor\\projects\\d-GitHub2-abp\\agent-transcripts\\ded34ec4-ff99-404a-8b16-10baf3c5d9f5\\ded34ec4-ff99-404a-8b16-10baf3c5d9f5.jsonl": { - "mtimeMs": 1773090599259, - "lastProcessedAt": "2026-03-10T00:18:00.000Z" - } - } -} diff --git a/.cursor/hooks/state/continual-learning.json b/.cursor/hooks/state/continual-learning.json deleted file mode 100644 index a24cb999b0..0000000000 --- a/.cursor/hooks/state/continual-learning.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "version": 1, - "lastRunAtMs": 1773090515725, - "turnsSinceLastRun": 5, - "lastTranscriptMtimeMs": 1773090515368, - "lastProcessedGenerationId": "b1b803a9-44bb-4047-a116-4c108a6dadd1", - "trialStartedAtMs": null -} From c4e4b7884692c5d8fbf5c0e9d8046e676eb3b410 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 12:58:57 +0300 Subject: [PATCH 06/40] Delete docker-compose.yml --- .../background-jobs/app/docker-compose.yml | 25 ------------------- 1 file changed, 25 deletions(-) delete mode 100644 modules/background-jobs/app/docker-compose.yml diff --git a/modules/background-jobs/app/docker-compose.yml b/modules/background-jobs/app/docker-compose.yml deleted file mode 100644 index 613711d0b7..0000000000 --- a/modules/background-jobs/app/docker-compose.yml +++ /dev/null @@ -1,25 +0,0 @@ -services: - sqlserver: - image: mcr.microsoft.com/mssql/server:2022-latest - environment: - ACCEPT_EULA: "Y" - MSSQL_SA_PASSWORD: "YourStrong!Passw0rd" - ports: - - "1433:1433" - volumes: - - sqlserver-data:/var/opt/mssql - - rabbitmq: - image: rabbitmq:4-management - ports: - - "5672:5672" - - "15672:15672" - environment: - RABBITMQ_DEFAULT_USER: "guest" - RABBITMQ_DEFAULT_PASS: "guest" - volumes: - - rabbitmq-data:/var/lib/rabbitmq - -volumes: - sqlserver-data: - rabbitmq-data: From c0c0b44afd293bdae7553675dae831f36b9ce85d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 13:04:03 +0300 Subject: [PATCH 07/40] Update QuartzJobExecutionAdapter.cs --- .../Volo/Abp/BackgroundJobs/Quartz/QuartzJobExecutionAdapter.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 d6e690dcff..bba43b4156 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 @@ -40,7 +40,7 @@ public class QuartzJobExecutionAdapter : IJob { var args = JsonSerializer.Deserialize(context.JobDetail.JobDataMap.GetString(nameof(TArgs))!); var jobConfiguration = Options.GetJob(typeof(TArgs)); - var jobContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType!, args!, cancellationToken: context.CancellationToken, jobName: jobConfiguration.JobName); + var jobContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType!, args!, context.CancellationToken); try { await JobExecuter.ExecuteAsync(jobContext); From 2c6e3b565a37983e99857dd79ecb3c16e3246ea3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 13:28:00 +0300 Subject: [PATCH 08/40] Move anonymous job executor; normalize TickerQ args Move AnonymousJobExecutorAsyncBackgroundJob into the Abstractions package and remove its dependency on ICancellationTokenProvider. The constructor and handler invocation now use a default CancellationToken and unused usings were cleaned up. In AbpTickerQBackgroundJobManager, add NormalizeArgs and use it before creating the ticker request to ensure the provided args match the expected args type. The normalization performs a JSON round-trip when necessary so CreateTickerRequest receives an instance of the correct type. --- .../AnonymousJobExecutorAsyncBackgroundJob.cs | 10 +++------- .../TickerQ/AbpTickerQBackgroundJobManager.cs | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 8 deletions(-) rename framework/src/{Volo.Abp.BackgroundJobs => Volo.Abp.BackgroundJobs.Abstractions}/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs (67%) diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs similarity index 67% rename from framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs rename to framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs index 6bc0c594c7..51f0515e7e 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs @@ -1,8 +1,7 @@ using System; +using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; -using Volo.Abp.Threading; namespace Volo.Abp.BackgroundJobs; @@ -10,16 +9,13 @@ public class AnonymousJobExecutorAsyncBackgroundJob : AsyncBackgroundJob EnqueueAsync(BackgroundJobConfiguration job, object args, BackgroundJobPriority priority, TimeSpan? delay) { + var normalizedArgs = NormalizeArgs(job.ArgsType, args); + var timeTicker = new TimeTickerEntity { Id = Guid.NewGuid(), Function = job.JobName, ExecutionTime = delay == null ? DateTime.UtcNow : DateTime.UtcNow.Add(delay.Value), - Request = CreateTickerRequest(job.ArgsType, args), + Request = CreateTickerRequest(job.ArgsType, normalizedArgs), }; var config = TickerQOptions.GetConfigurationOrNull(job.JobType); @@ -81,6 +83,17 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD return !result.IsSucceeded ? timeTicker.Id.ToString() : result.Result.Id.ToString(); } + protected virtual object NormalizeArgs(Type argsType, object args) + { + if (argsType.IsInstanceOfType(args)) + { + return args; + } + + var serialized = JsonSerializer.Serialize(args); + return JsonSerializer.Deserialize(argsType, serialized)!; + } + protected virtual byte[]? CreateTickerRequest(Type argsType, object args) { return (byte[]?)CreateTickerRequestMethod From de1dc75f58326166117d2842da8019a4f69f631f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 13:42:41 +0300 Subject: [PATCH 09/40] Add logging and improve anonymous job naming Add informational logging when jobs are wrapped into the anonymous transport and when anonymous transport jobs are executed to improve observability. Introduce ILogger properties (defaulting to NullLogger) and add LogInformation calls in Hangfire, Quartz, RabbitMQ, TickerQ and Default background job managers, and in AnonymousJobExecutorAsyncBackgroundJob.ExecuteAsync. Improve Hangfire dashboard display by attempting to deserialize serialized AnonymousJobArgs to show the effective (original) job name via a new TryGetEffectiveJobName JSON helper. Add required using directives and safe JSON parsing with fallbacks. --- .../AnonymousJobExecutorAsyncBackgroundJob.cs | 7 +++ .../Hangfire/AbpDashboardOptionsProvider.cs | 49 ++++++++++++++++++- .../Hangfire/HangfireBackgroundJobManager.cs | 9 ++++ .../Quartz/QuartzBackgroundJobManager.cs | 9 ++++ .../RabbitMQ/RabbitMqBackgroundJobManager.cs | 9 ++++ .../TickerQ/AbpTickerQBackgroundJobManager.cs | 9 ++++ .../DefaultBackgroundJobManager.cs | 9 ++++ 7 files changed, 100 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs index 51f0515e7e..c076eab337 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs @@ -1,6 +1,7 @@ using System; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; using Volo.Abp.DependencyInjection; namespace Volo.Abp.BackgroundJobs; @@ -20,6 +21,12 @@ public class AnonymousJobExecutorAsyncBackgroundJob : AsyncBackgroundJob { var jobName = job.ToString(); + if (job.Args.Count == 3 && job.Args.Last() is CancellationToken) { + if (job.Args[1] is AnonymousJobArgs anonymousJobArgs) + { + return anonymousJobArgs.JobName; + } + jobName = AbpBackgroundJobOptions.GetJob(job.Args[1].GetType()).JobName; } + if (job.Args.Count == 4 && job.Args.Last() is CancellationToken) + { + if (job.Args[1] is string transportJobName) + { + if (transportJobName == AnonymousJobArgs.JobNameConstant && + job.Args[2] is string serializedArgs && + TryGetEffectiveJobName(serializedArgs, out var effectiveJobName)) + { + return effectiveJobName; + } + + return transportJobName; + } + } + return jobName; } }; } + + protected virtual bool TryGetEffectiveJobName(string serializedArgs, out string effectiveJobName) + { + effectiveJobName = string.Empty; + + try + { + using var document = JsonDocument.Parse(serializedArgs); + if (document.RootElement.TryGetProperty(nameof(AnonymousJobArgs.JobName), out var jobNameElement)) + { + var jobName = jobNameElement.GetString(); + if (!string.IsNullOrWhiteSpace(jobName)) + { + effectiveJobName = jobName!; + return true; + } + } + } + catch + { + // Ignore parse errors and fallback to transport job name. + } + + return false; + } } 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 fbd1034ecd..67406f2b8d 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 @@ -3,6 +3,8 @@ using System.Reflection; using System.Threading.Tasks; using Hangfire; using Hangfire.States; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Hangfire; @@ -17,6 +19,7 @@ public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDep protected IOptions HangfireOptions { get; } protected IJsonSerializer JsonSerializer { get; } protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } + public ILogger Logger { get; set; } public HangfireBackgroundJobManager( IOptions backgroundJobOptions, @@ -28,6 +31,7 @@ public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDep HangfireOptions = hangfireOptions; JsonSerializer = jsonSerializer; AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; + Logger = NullLogger.Instance; } public virtual Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, @@ -48,6 +52,11 @@ public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDep { if (ShouldWrapAsAnonymousJob(jobName)) { + Logger.LogInformation( + "Wrapping job into anonymous transport. TransportJobName: {TransportJobName}, EffectiveJobName: {EffectiveJobName}", + AnonymousJobArgs.JobNameConstant, + jobName + ); var jsonData = JsonSerializer.Serialize(args); var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); return EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); 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 842f47c78f..4d52498f84 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,7 @@ using System; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Quartz; using Volo.Abp.DependencyInjection; @@ -20,6 +22,7 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen protected IJsonSerializer JsonSerializer { get; } protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } + public ILogger Logger { get; set; } public QuartzBackgroundJobManager(IScheduler scheduler, IOptions options, IJsonSerializer jsonSerializer, IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry) { @@ -27,6 +30,7 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen JsonSerializer = jsonSerializer; Options = options.Value; AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; + Logger = NullLogger.Instance; } public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, @@ -40,6 +44,11 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen { if (ShouldWrapAsAnonymousJob(jobName)) { + Logger.LogInformation( + "Wrapping job into anonymous transport. TransportJobName: {TransportJobName}, EffectiveJobName: {EffectiveJobName}", + AnonymousJobArgs.JobNameConstant, + jobName + ); var jsonData = JsonSerializer.Serialize(args); var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); return await EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs index 5c7b420c98..5483a3094e 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs @@ -1,5 +1,7 @@ using System; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.DependencyInjection; using Volo.Abp.Json; @@ -11,12 +13,14 @@ public class RabbitMqBackgroundJobManager : IBackgroundJobManager, ITransientDep protected IJobQueueManager JobQueueManager { get; } protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } protected IJsonSerializer JsonSerializer { get; } + public ILogger Logger { get; set; } public RabbitMqBackgroundJobManager(IJobQueueManager jobQueueManager, IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry, IJsonSerializer jsonSerializer) { JobQueueManager = jobQueueManager; AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; JsonSerializer = jsonSerializer; + Logger = NullLogger.Instance; } public virtual async Task EnqueueAsync( @@ -36,6 +40,11 @@ public class RabbitMqBackgroundJobManager : IBackgroundJobManager, ITransientDep { if (ShouldWrapAsAnonymousJob(jobName)) { + Logger.LogInformation( + "Wrapping job into anonymous transport. TransportJobName: {TransportJobName}, EffectiveJobName: {EffectiveJobName}", + AnonymousJobArgs.JobNameConstant, + jobName + ); var jsonData = JsonSerializer.Serialize(args); var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); return await EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs index a6e1f95e64..54b97adf30 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs @@ -1,6 +1,8 @@ using System; using System.Reflection; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using TickerQ.Utilities; using TickerQ.Utilities.Entities; @@ -20,6 +22,7 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD protected AbpBackgroundJobsTickerQOptions TickerQOptions { get; } protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } protected IJsonSerializer JsonSerializer { get; } + public ILogger Logger { get; set; } public AbpTickerQBackgroundJobManager( ITimeTickerManager timeTickerManager, @@ -33,6 +36,7 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD TickerQOptions = tickerQOptions.Value; AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; JsonSerializer = jsonSerializer; + Logger = NullLogger.Instance; } public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) @@ -45,6 +49,11 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD { if (ShouldWrapAsAnonymousJob(jobName)) { + Logger.LogInformation( + "Wrapping job into anonymous transport. TransportJobName: {TransportJobName}, EffectiveJobName: {EffectiveJobName}", + AnonymousJobArgs.JobNameConstant, + jobName + ); var jsonData = JsonSerializer.Serialize(args); var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); return await EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs index 1760342ef1..5669525db9 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs @@ -1,5 +1,7 @@ using System; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Volo.Abp.BackgroundWorkers; using Volo.Abp.DependencyInjection; @@ -21,6 +23,7 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } protected IOptions BackgroundJobOptions { get; } protected IOptions BackgroundJobWorkerOptions { get; } + public ILogger Logger { get; set; } public DefaultBackgroundJobManager( IClock clock, @@ -38,6 +41,7 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe BackgroundJobOptions = backgroundJobOptions; BackgroundJobWorkerOptions = backgroundJobWorkerOptions; Store = store; + Logger = NullLogger.Instance; } public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) @@ -50,6 +54,11 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe { if (ShouldWrapAsAnonymousJob(jobName)) { + Logger.LogInformation( + "Wrapping job into anonymous transport. TransportJobName: {TransportJobName}, EffectiveJobName: {EffectiveJobName}", + AnonymousJobArgs.JobNameConstant, + jobName + ); var jsonData = Serializer.Serialize(args); var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); return await EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); From 07ee70f085d5c4a0c1583ad6545c7c3be1781e6a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 14:03:59 +0300 Subject: [PATCH 10/40] Handle JSON case variants in background jobs Make anonymous job JSON parsing more robust and fix DI registration for Quartz adapter. Add TryGetJobNameElement to accept both "JobName" and "jobName"; update anonymous job handlers to dispose JsonDocument and to prefer lowercase "value" with a fallback to "Value" for compatibility with different serializers. Also register a non-generic QuartzJobExecutionAdapter in DI and remove an extraneous BOM from a using line. --- .../Hangfire/AbpDashboardOptionsProvider.cs | 8 +++++++- .../Quartz/AbpBackgroundJobsQuartzModule.cs | 3 ++- .../DemoAppSharedModule.cs | 8 ++++++-- .../Jobs/SampleJobCreator.cs | 8 ++++++-- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs index 7c791d8095..9a09fd9ce0 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs @@ -61,7 +61,7 @@ public class AbpDashboardOptionsProvider : ITransientDependency try { using var document = JsonDocument.Parse(serializedArgs); - if (document.RootElement.TryGetProperty(nameof(AnonymousJobArgs.JobName), out var jobNameElement)) + if (TryGetJobNameElement(document.RootElement, out var jobNameElement)) { var jobName = jobNameElement.GetString(); if (!string.IsNullOrWhiteSpace(jobName)) @@ -78,4 +78,10 @@ public class AbpDashboardOptionsProvider : ITransientDependency return false; } + + protected virtual bool TryGetJobNameElement(JsonElement rootElement, out JsonElement jobNameElement) + { + return rootElement.TryGetProperty(nameof(AnonymousJobArgs.JobName), out jobNameElement) + || rootElement.TryGetProperty("jobName", out jobNameElement); + } } 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 6b2d8f36e0..8e92b4544a 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,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Modularity; @@ -15,6 +15,7 @@ public class AbpBackgroundJobsQuartzModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddTransient(typeof(QuartzJobExecutionAdapter<>)); + context.Services.AddTransient(); } public override void OnPreApplicationInitialization(ApplicationInitializationContext context) diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs index 58046b6313..c4dc1db997 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs @@ -17,8 +17,12 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared { options.AddAnonymousJobHandler("CompileTimeAnonymousJob", (jsonData, sp, ct) => { - var doc = JsonDocument.Parse(jsonData); - var value = doc.RootElement.TryGetProperty("Value", out var prop) ? prop.GetString() : null; + using var doc = JsonDocument.Parse(jsonData); + var value = doc.RootElement.TryGetProperty("value", out var prop) + ? prop.GetString() + : doc.RootElement.TryGetProperty("Value", out prop) + ? prop.GetString() + : null; Console.WriteLine($"[ANONYMOUS-COMPILE] {value}"); return Task.CompletedTask; }); diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs index 485468582b..d82e094729 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs @@ -28,8 +28,12 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs { _anonymousJobHandlerRegistry.Register("RuntimeAnonymousJob", (jsonData, sp, ct) => { - var doc = JsonDocument.Parse(jsonData); - var value = doc.RootElement.TryGetProperty("Value", out var prop) ? prop.GetString() : null; + using var doc = JsonDocument.Parse(jsonData); + var value = doc.RootElement.TryGetProperty("value", out var prop) + ? prop.GetString() + : doc.RootElement.TryGetProperty("Value", out prop) + ? prop.GetString() + : null; Console.WriteLine($"[ANONYMOUS-RUNTIME] {value}"); return Task.CompletedTask; }); From ffa880b5fcfa3e8c0834d93859322a131595414c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 14:40:36 +0300 Subject: [PATCH 11/40] Use AnonymousJobExecutionContext for anonymous jobs Introduce AnonymousJobExecutionContext and switch anonymous job handler APIs to accept it (Func / Action). Update AbpBackgroundJobOptions, IAnonymousJobHandlerRegistry, AnonymousJobHandlerRegistry and AnonymousJobExecutorAsyncBackgroundJob to use the new context and to obtain a cancellation token via ICancellationTokenProvider. Update all callsites (tests, demo module, sample job creator) and documentation to show registering/enqueuing anonymous handlers by name and explain Hangfire display behavior. Also add a .cursor hooks state file. The demo no longer skips enqueuing anonymous jobs for RabbitMQ in this change. --- .../background-jobs/hangfire.md | 2 + .../infrastructure/background-jobs/index.md | 66 +++++++++++++++++++ .../BackgroundJobs/AbpBackgroundJobOptions.cs | 12 ++-- .../AnonymousJobExecutionContext.cs | 22 +++++++ .../AnonymousJobExecutorAsyncBackgroundJob.cs | 7 +- .../AnonymousJobHandlerRegistry.cs | 12 ++-- .../IAnonymousJobHandlerRegistry.cs | 7 +- .../AbpBackgroundJobsTestModule.cs | 6 +- .../BackgroundJobExecuter_Tests.cs | 4 +- .../DemoAppSharedModule.cs | 4 +- .../Jobs/SampleJobCreator.cs | 24 +++---- 11 files changed, 127 insertions(+), 39 deletions(-) create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutionContext.cs diff --git a/docs/en/framework/infrastructure/background-jobs/hangfire.md b/docs/en/framework/infrastructure/background-jobs/hangfire.md index 05cd214016..49f280f1f1 100644 --- a/docs/en/framework/infrastructure/background-jobs/hangfire.md +++ b/docs/en/framework/infrastructure/background-jobs/hangfire.md @@ -149,6 +149,8 @@ namespace MyProject Hangfire Dashboard provides information about your background jobs, including method names and serialized arguments as well as gives you an opportunity to manage them by performing different actions – retry, delete, trigger, etc. So it is important to restrict access to the Dashboard. To make it secure by default, only local requests are allowed, however you can change this by following the [official documentation](http://docs.hangfire.io/en/latest/configuration/using-dashboard.html) of Hangfire. +When you enqueue jobs via anonymous handlers (`IBackgroundJobManager.EnqueueAsync(string jobName, object args)` + `IAnonymousJobHandlerRegistry`), ABP uses an internal transport job name (`AnonymousJob`), but the Hangfire dashboard display name tries to show the effective job name from payload (for example, `ProcessOrder`). + You can integrate the Hangfire dashboard to [ABP authorization system](../../fundamentals/authorization/index.md) using the **AbpHangfireAuthorizationFilter** class. This class is defined in the `Volo.Abp.Hangfire` package. The following example, checks if the current user is logged in to the application: diff --git a/docs/en/framework/infrastructure/background-jobs/index.md b/docs/en/framework/infrastructure/background-jobs/index.md index 0d5e19442c..19a371266f 100644 --- a/docs/en/framework/infrastructure/background-jobs/index.md +++ b/docs/en/framework/infrastructure/background-jobs/index.md @@ -197,6 +197,72 @@ Enqueue method gets some optional arguments to control the background job: * **priority** is used to control priority of the job item. It gets an `BackgroundJobPriority` enum which has `Low`, `BelowNormal`, `Normal` (default), `AboveNormal` and `Hight` fields. * **delay** is used to wait a while (`TimeSpan`) before first try. +### Queue by Job Name + +You can also enqueue jobs by their name at runtime: + +```csharp +await _backgroundJobManager.EnqueueAsync( + "emails", + new + { + EmailAddress = "user@abp.io", + Subject = "Welcome", + Body = "..." + } +); +``` + +In this case, ABP resolves the target job configuration by `jobName` and serializes the `args` object. +If the `args` runtime type does not match the configured argument type, ABP normalizes the payload by serializing and deserializing it to the expected argument type. + +### Anonymous Job Handlers + +ABP supports registering runtime-resolved anonymous handlers keyed by a job name. + +You can register handlers at startup: + +```csharp +Configure(options => +{ + options.AddAnonymousJobHandler("ProcessOrder", (context, cancellationToken) => + { + // Parse or deserialize context.JsonData and run your logic. + return Task.CompletedTask; + }); +}); +``` + +You can also register/unregister handlers at runtime: + +```csharp +public class MyService : ITransientDependency +{ + private readonly IAnonymousJobHandlerRegistry _anonymousJobHandlerRegistry; + + public MyService(IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry) + { + _anonymousJobHandlerRegistry = anonymousJobHandlerRegistry; + } + + public void Register() + { + _anonymousJobHandlerRegistry.Register("ProcessOrder", (context, cancellationToken) => + { + return Task.CompletedTask; + }); + } +} +``` + +Then enqueue it by name: + +```csharp +await _backgroundJobManager.EnqueueAsync("ProcessOrder", new { OrderId = "42" }); +``` + +ABP keeps a stable internal transport job name (`AnonymousJob`) for provider compatibility, while preserving your effective job name (`ProcessOrder`) in the payload. + ### Disable Job Execution You may want to disable background job execution for your application. This is generally needed if you want to execute background jobs in another process and disable it for the current process. 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 b10b9cec0e..cb2f3853c1 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 @@ -11,7 +11,7 @@ public class AbpBackgroundJobOptions { private readonly Dictionary _jobConfigurationsByArgsType; private readonly ConcurrentDictionary _jobConfigurationsByName; - private readonly ConcurrentDictionary> _anonymousHandlers = new(); + private readonly ConcurrentDictionary> _anonymousHandlers = new(); /// /// Default: true. @@ -86,7 +86,7 @@ public class AbpBackgroundJobOptions _jobConfigurationsByName[jobConfiguration.JobName] = jobConfiguration; } - public void AddAnonymousJobHandler(string jobName, Func handler) + public void AddAnonymousJobHandler(string jobName, Func handler) { Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); Check.NotNull(handler, nameof(handler)); @@ -94,16 +94,16 @@ public class AbpBackgroundJobOptions _anonymousHandlers[jobName] = handler; } - public void AddAnonymousJobHandler(string jobName, Action handler) + public void AddAnonymousJobHandler(string jobName, Action handler) { - AddAnonymousJobHandler(jobName, (jsonData, sp, ct) => + AddAnonymousJobHandler(jobName, (context, ct) => { - handler(jsonData, sp, ct); + handler(context, ct); return Task.CompletedTask; }); } - internal bool TryGetAnonymousHandler(string jobName, out Func? handler) + internal bool TryGetAnonymousHandler(string jobName, out Func? handler) { return _anonymousHandlers.TryGetValue(jobName, out handler); } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutionContext.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutionContext.cs new file mode 100644 index 0000000000..42fb470c6a --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutionContext.cs @@ -0,0 +1,22 @@ +using System; + +namespace Volo.Abp.BackgroundJobs; + +public class AnonymousJobExecutionContext +{ + public string JobName { get; } + + public string JsonData { get; } + + public IServiceProvider ServiceProvider { get; } + + public AnonymousJobExecutionContext( + string jobName, + string jsonData, + IServiceProvider serviceProvider) + { + JobName = Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); + JsonData = Check.NotNull(jsonData, nameof(jsonData)); + ServiceProvider = Check.NotNull(serviceProvider, nameof(serviceProvider)); + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs index c076eab337..e06b092fe9 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs @@ -1,8 +1,9 @@ using System; -using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; namespace Volo.Abp.BackgroundJobs; @@ -33,6 +34,8 @@ public class AnonymousJobExecutorAsyncBackgroundJob : AsyncBackgroundJob().Token; + var executionContext = new AnonymousJobExecutionContext(args.JobName, args.JsonData, ServiceProvider); + await handler(executionContext, cancellationToken); } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs index 66c8f95ec2..bb36a8d454 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.BackgroundJobs; public class AnonymousJobHandlerRegistry : IAnonymousJobHandlerRegistry, ISingletonDependency { - private readonly ConcurrentDictionary> _handlers = new(); + private readonly ConcurrentDictionary> _handlers = new(); private readonly AbpBackgroundJobOptions _options; public AnonymousJobHandlerRegistry(IOptions options) @@ -17,7 +17,7 @@ public class AnonymousJobHandlerRegistry : IAnonymousJobHandlerRegistry, ISingle _options = options.Value; } - public virtual void Register(string jobName, Func handler) + public virtual void Register(string jobName, Func handler) { Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); Check.NotNull(handler, nameof(handler)); @@ -25,11 +25,11 @@ public class AnonymousJobHandlerRegistry : IAnonymousJobHandlerRegistry, ISingle _handlers[jobName] = handler; } - public virtual void Register(string jobName, Action handler) + public virtual void Register(string jobName, Action handler) { - Register(jobName, (jsonData, sp, ct) => + Register(jobName, (context, ct) => { - handler(jsonData, sp, ct); + handler(context, ct); return Task.CompletedTask; }); } @@ -44,7 +44,7 @@ public class AnonymousJobHandlerRegistry : IAnonymousJobHandlerRegistry, ISingle return _handlers.ContainsKey(jobName) || _options.IsAnonymousJobRegistered(jobName); } - public virtual Func? Get(string jobName) + public virtual Func? Get(string jobName) { if (_handlers.TryGetValue(jobName, out var handler)) { diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAnonymousJobHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAnonymousJobHandlerRegistry.cs index e02c09ab28..7c38631018 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAnonymousJobHandlerRegistry.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAnonymousJobHandlerRegistry.cs @@ -1,18 +1,17 @@ using System; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; namespace Volo.Abp.BackgroundJobs; public interface IAnonymousJobHandlerRegistry { - void Register(string jobName, Func handler); + void Register(string jobName, Func handler); - void Register(string jobName, Action handler); + void Register(string jobName, Action handler); bool Unregister(string jobName); bool IsRegistered(string jobName); - Func? Get(string jobName); + Func? Get(string jobName); } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs index ee792812ac..72ada6dbd8 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs @@ -17,10 +17,10 @@ public class AbpBackgroundJobsTestModule : AbpModule Configure(options => { - options.AddAnonymousJobHandler("TestAnonymousJob", (jsonData, sp, ct) => + options.AddAnonymousJobHandler("TestAnonymousJob", (context, ct) => { - var tracker = sp.GetRequiredService(); - tracker.ExecutedJsonData.Add(jsonData); + var tracker = context.ServiceProvider.GetRequiredService(); + tracker.ExecutedJsonData.Add(context.JsonData); return System.Threading.Tasks.Task.CompletedTask; }); }); diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs index a46e79d15d..3b7173942b 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs @@ -164,9 +164,9 @@ public class BackgroundJobExecuter_Tests : BackgroundJobsTestBase var handlerRegistry = GetRequiredService(); var executedValues = new List(); - handlerRegistry.Register("RuntimeAnonymousJob", (jsonData, sp, ct) => + handlerRegistry.Register("RuntimeAnonymousJob", (context, ct) => { - executedValues.Add(jsonData); + executedValues.Add(context.JsonData); return Task.CompletedTask; }); diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs index c4dc1db997..07a8467350 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs @@ -15,9 +15,9 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared { Configure(options => { - options.AddAnonymousJobHandler("CompileTimeAnonymousJob", (jsonData, sp, ct) => + options.AddAnonymousJobHandler("CompileTimeAnonymousJob", (context, ct) => { - using var doc = JsonDocument.Parse(jsonData); + using var doc = JsonDocument.Parse(context.JsonData); var value = doc.RootElement.TryGetProperty("value", out var prop) ? prop.GetString() : doc.RootElement.TryGetProperty("Value", out prop) diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs index d82e094729..e64b681f44 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs @@ -26,9 +26,9 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs public async Task CreateJobsAsync() { - _anonymousJobHandlerRegistry.Register("RuntimeAnonymousJob", (jsonData, sp, ct) => + _anonymousJobHandlerRegistry.Register("RuntimeAnonymousJob", (context, ct) => { - using var doc = JsonDocument.Parse(jsonData); + using var doc = JsonDocument.Parse(context.JsonData); var value = doc.RootElement.TryGetProperty("value", out var prop) ? prop.GetString() : doc.RootElement.TryGetProperty("Value", out prop) @@ -62,18 +62,14 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs (object)new { Value = "test 3 (yellow) - by name, anonymous", Time = DateTime.Now } ); - // Anonymous job enqueue (compile-time and runtime handlers) - if (!_backgroundJobManager.GetType().Name.ToUpperInvariant().Contains("RABBITMQ")) - { - await _backgroundJobManager.EnqueueAsync( - "CompileTimeAnonymousJob", - new { Value = "test 4 (anonymous) - compile-time" } - ); - await _backgroundJobManager.EnqueueAsync( - "RuntimeAnonymousJob", - new { Value = "test 5 (anonymous) - runtime" } - ); - } + await _backgroundJobManager.EnqueueAsync( + "CompileTimeAnonymousJob", + new { Value = "test 4 (anonymous) - compile-time" } + ); + await _backgroundJobManager.EnqueueAsync( + "RuntimeAnonymousJob", + new { Value = "test 5 (anonymous) - runtime" } + ); } } } From 31ca6e66574fb60eb71184c7c1954ec1b80515e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 14:57:39 +0300 Subject: [PATCH 12/40] Ensure JSON doc disposal in anonymous job handlers Wrap JsonDocument usage in explicit using blocks for anonymous job handlers to ensure deterministic disposal and avoid capturing/disposal issues. Also rename the compile-time handler parameter from `context` to `ctx` to prevent potential shadowing. Changes applied to DemoAppSharedModule.cs and SampleJobCreator.cs. --- .../DemoAppSharedModule.cs | 18 ++++++++++-------- .../Jobs/SampleJobCreator.cs | 16 +++++++++------- 2 files changed, 19 insertions(+), 15 deletions(-) diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs index 07a8467350..7e9e4076ec 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs @@ -15,16 +15,18 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared { Configure(options => { - options.AddAnonymousJobHandler("CompileTimeAnonymousJob", (context, ct) => + options.AddAnonymousJobHandler("CompileTimeAnonymousJob", (ctx, ct) => { - using var doc = JsonDocument.Parse(context.JsonData); - var value = doc.RootElement.TryGetProperty("value", out var prop) - ? prop.GetString() - : doc.RootElement.TryGetProperty("Value", out prop) + using (var doc = JsonDocument.Parse(ctx.JsonData)) + { + var value = doc.RootElement.TryGetProperty("value", out var prop) ? prop.GetString() - : null; - Console.WriteLine($"[ANONYMOUS-COMPILE] {value}"); - return Task.CompletedTask; + : doc.RootElement.TryGetProperty("Value", out prop) + ? prop.GetString() + : null; + Console.WriteLine($"[ANONYMOUS-COMPILE] {value}"); + return Task.CompletedTask; + } }); }); } diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs index e64b681f44..8fa6c1af88 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs @@ -28,14 +28,16 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs { _anonymousJobHandlerRegistry.Register("RuntimeAnonymousJob", (context, ct) => { - using var doc = JsonDocument.Parse(context.JsonData); - var value = doc.RootElement.TryGetProperty("value", out var prop) - ? prop.GetString() - : doc.RootElement.TryGetProperty("Value", out prop) + using (var doc = JsonDocument.Parse(context.JsonData)) + { + var value = doc.RootElement.TryGetProperty("value", out var prop) ? prop.GetString() - : null; - Console.WriteLine($"[ANONYMOUS-RUNTIME] {value}"); - return Task.CompletedTask; + : doc.RootElement.TryGetProperty("Value", out prop) + ? prop.GetString() + : null; + Console.WriteLine($"[ANONYMOUS-RUNTIME] {value}"); + return Task.CompletedTask; + } }); // Type-safe enqueue (existing) From 0b40f2c0f1e36fb4c0834f6ab730e252878cbdea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 15:15:26 +0300 Subject: [PATCH 13/40] Use Abp.AnonymousJob name and add validation Rename the internal anonymous transport job name from "AnonymousJob" to "Abp.AnonymousJob" and update docs accordingly. Add null/whitespace argument checks (Check.NotNull / Check.NotNullOrWhiteSpace) in anonymous handler registration and lookup APIs. Change background job managers (Hangfire, Quartz, RabbitMQ, TickerQ, Default) to only wrap jobs as anonymous when an anonymous handler is registered and there is no typed job configuration (check via BackgroundJobOptions.GetJobOrNull). Wire AbpBackgroundJobOptions into affected managers and update tests with a new case verifying that a typed job prevents anonymous wrapping. --- .../infrastructure/background-jobs/hangfire.md | 2 +- .../infrastructure/background-jobs/index.md | 2 +- .../BackgroundJobs/AbpBackgroundJobOptions.cs | 2 ++ .../Volo/Abp/BackgroundJobs/AnonymousJobArgs.cs | 4 ++-- .../AnonymousJobHandlerRegistry.cs | 6 ++++++ .../Hangfire/HangfireBackgroundJobManager.cs | 4 +++- .../Quartz/QuartzBackgroundJobManager.cs | 13 +++++++++++-- .../RabbitMQ/RabbitMqBackgroundJobManager.cs | 13 +++++++++++-- .../TickerQ/AbpTickerQBackgroundJobManager.cs | 4 +++- .../DefaultBackgroundJobManager.cs | 4 +++- .../BackgroundJobManager_Tests.cs | 17 +++++++++++++++++ 11 files changed, 60 insertions(+), 11 deletions(-) diff --git a/docs/en/framework/infrastructure/background-jobs/hangfire.md b/docs/en/framework/infrastructure/background-jobs/hangfire.md index 49f280f1f1..3ea466d83b 100644 --- a/docs/en/framework/infrastructure/background-jobs/hangfire.md +++ b/docs/en/framework/infrastructure/background-jobs/hangfire.md @@ -149,7 +149,7 @@ namespace MyProject Hangfire Dashboard provides information about your background jobs, including method names and serialized arguments as well as gives you an opportunity to manage them by performing different actions – retry, delete, trigger, etc. So it is important to restrict access to the Dashboard. To make it secure by default, only local requests are allowed, however you can change this by following the [official documentation](http://docs.hangfire.io/en/latest/configuration/using-dashboard.html) of Hangfire. -When you enqueue jobs via anonymous handlers (`IBackgroundJobManager.EnqueueAsync(string jobName, object args)` + `IAnonymousJobHandlerRegistry`), ABP uses an internal transport job name (`AnonymousJob`), but the Hangfire dashboard display name tries to show the effective job name from payload (for example, `ProcessOrder`). +When you enqueue jobs via anonymous handlers (`IBackgroundJobManager.EnqueueAsync(string jobName, object args)` + `IAnonymousJobHandlerRegistry`), ABP uses an internal transport job name (`Abp.AnonymousJob`), but the Hangfire dashboard display name tries to show the effective job name from payload (for example, `ProcessOrder`). You can integrate the Hangfire dashboard to [ABP authorization system](../../fundamentals/authorization/index.md) using the **AbpHangfireAuthorizationFilter** class. This class is defined in the `Volo.Abp.Hangfire` package. The following example, checks if the current user is logged in to the application: diff --git a/docs/en/framework/infrastructure/background-jobs/index.md b/docs/en/framework/infrastructure/background-jobs/index.md index 19a371266f..61a4171b49 100644 --- a/docs/en/framework/infrastructure/background-jobs/index.md +++ b/docs/en/framework/infrastructure/background-jobs/index.md @@ -261,7 +261,7 @@ Then enqueue it by name: await _backgroundJobManager.EnqueueAsync("ProcessOrder", new { OrderId = "42" }); ``` -ABP keeps a stable internal transport job name (`AnonymousJob`) for provider compatibility, while preserving your effective job name (`ProcessOrder`) in the payload. +ABP keeps a stable internal transport job name (`Abp.AnonymousJob`) for provider compatibility, while preserving your effective job name (`ProcessOrder`) in the payload. ### Disable Job Execution 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 cb2f3853c1..f98d2d89f4 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 @@ -96,6 +96,8 @@ public class AbpBackgroundJobOptions public void AddAnonymousJobHandler(string jobName, Action handler) { + Check.NotNull(handler, nameof(handler)); + AddAnonymousJobHandler(jobName, (context, ct) => { handler(context, ct); diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobArgs.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobArgs.cs index 09bac99878..09f9dc0f9f 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobArgs.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobArgs.cs @@ -1,9 +1,9 @@ namespace Volo.Abp.BackgroundJobs; -[BackgroundJobName("AnonymousJob")] +[BackgroundJobName(JobNameConstant)] public class AnonymousJobArgs { - public const string JobNameConstant = "AnonymousJob"; + public const string JobNameConstant = "Abp.AnonymousJob"; public string JobName { get; } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs index bb36a8d454..24810d7de9 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs @@ -27,6 +27,8 @@ public class AnonymousJobHandlerRegistry : IAnonymousJobHandlerRegistry, ISingle public virtual void Register(string jobName, Action handler) { + Check.NotNull(handler, nameof(handler)); + Register(jobName, (context, ct) => { handler(context, ct); @@ -36,16 +38,20 @@ public class AnonymousJobHandlerRegistry : IAnonymousJobHandlerRegistry, ISingle public virtual bool Unregister(string jobName) { + Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); return _handlers.TryRemove(jobName, out _); } public virtual bool IsRegistered(string jobName) { + Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); return _handlers.ContainsKey(jobName) || _options.IsAnonymousJobRegistered(jobName); } public virtual Func? Get(string jobName) { + Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); + if (_handlers.TryGetValue(jobName, out var handler)) { return handler; 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 67406f2b8d..9d84f1f329 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 @@ -77,7 +77,9 @@ public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDep protected virtual bool ShouldWrapAsAnonymousJob(string jobName) { - return jobName != AnonymousJobArgs.JobNameConstant && AnonymousJobHandlerRegistry.IsRegistered(jobName); + return jobName != AnonymousJobArgs.JobNameConstant && + AnonymousJobHandlerRegistry.IsRegistered(jobName) && + BackgroundJobOptions.Value.GetJobOrNull(jobName) == null; } protected virtual string GetQueueName(Type argsType) 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 4d52498f84..a30b8bc9dd 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 @@ -18,17 +18,24 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen protected IScheduler Scheduler { get; } protected AbpBackgroundJobQuartzOptions Options { get; } + protected AbpBackgroundJobOptions BackgroundJobOptions { get; } protected IJsonSerializer JsonSerializer { get; } protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } public ILogger Logger { get; set; } - public QuartzBackgroundJobManager(IScheduler scheduler, IOptions options, IJsonSerializer jsonSerializer, IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry) + public QuartzBackgroundJobManager( + IScheduler scheduler, + IOptions options, + IOptions backgroundJobOptions, + IJsonSerializer jsonSerializer, + IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry) { Scheduler = scheduler; JsonSerializer = jsonSerializer; Options = options.Value; + BackgroundJobOptions = backgroundJobOptions.Value; AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; Logger = NullLogger.Instance; } @@ -59,7 +66,9 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen protected virtual bool ShouldWrapAsAnonymousJob(string jobName) { - return jobName != AnonymousJobArgs.JobNameConstant && AnonymousJobHandlerRegistry.IsRegistered(jobName); + return jobName != AnonymousJobArgs.JobNameConstant && + AnonymousJobHandlerRegistry.IsRegistered(jobName) && + BackgroundJobOptions.GetJobOrNull(jobName) == null; } public virtual async Task ReEnqueueAsync(TArgs args, int retryCount, int retryIntervalMillisecond, diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs index 5483a3094e..71510e83ff 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs @@ -2,6 +2,7 @@ using System; using System.Threading.Tasks; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Json; @@ -12,13 +13,19 @@ public class RabbitMqBackgroundJobManager : IBackgroundJobManager, ITransientDep { protected IJobQueueManager JobQueueManager { get; } protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } + protected AbpBackgroundJobOptions BackgroundJobOptions { get; } protected IJsonSerializer JsonSerializer { get; } public ILogger Logger { get; set; } - public RabbitMqBackgroundJobManager(IJobQueueManager jobQueueManager, IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry, IJsonSerializer jsonSerializer) + public RabbitMqBackgroundJobManager( + IJobQueueManager jobQueueManager, + IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry, + IOptions backgroundJobOptions, + IJsonSerializer jsonSerializer) { JobQueueManager = jobQueueManager; AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; + BackgroundJobOptions = backgroundJobOptions.Value; JsonSerializer = jsonSerializer; Logger = NullLogger.Instance; } @@ -56,6 +63,8 @@ public class RabbitMqBackgroundJobManager : IBackgroundJobManager, ITransientDep protected virtual bool ShouldWrapAsAnonymousJob(string jobName) { - return jobName != AnonymousJobArgs.JobNameConstant && AnonymousJobHandlerRegistry.IsRegistered(jobName); + return jobName != AnonymousJobArgs.JobNameConstant && + AnonymousJobHandlerRegistry.IsRegistered(jobName) && + BackgroundJobOptions.GetJobOrNull(jobName) == null; } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs index 54b97adf30..82df9e2fe7 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs @@ -65,7 +65,9 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD protected virtual bool ShouldWrapAsAnonymousJob(string jobName) { - return jobName != AnonymousJobArgs.JobNameConstant && AnonymousJobHandlerRegistry.IsRegistered(jobName); + return jobName != AnonymousJobArgs.JobNameConstant && + AnonymousJobHandlerRegistry.IsRegistered(jobName) && + Options.GetJobOrNull(jobName) == null; } protected virtual async Task EnqueueAsync(BackgroundJobConfiguration job, object args, BackgroundJobPriority priority, TimeSpan? delay) diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs index 5669525db9..4714e11e72 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs @@ -87,6 +87,8 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe protected virtual bool ShouldWrapAsAnonymousJob(string jobName) { - return jobName != AnonymousJobArgs.JobNameConstant && AnonymousJobHandlerRegistry.IsRegistered(jobName); + return jobName != AnonymousJobArgs.JobNameConstant && + AnonymousJobHandlerRegistry.IsRegistered(jobName) && + BackgroundJobOptions.Value.GetJobOrNull(jobName) == null; } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs index bb8d05bf86..948c1b9f4a 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs @@ -10,11 +10,13 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase { private readonly IBackgroundJobManager _backgroundJobManager; private readonly IBackgroundJobStore _backgroundJobStore; + private readonly IAnonymousJobHandlerRegistry _anonymousJobHandlerRegistry; public BackgroundJobManager_Tests() { _backgroundJobManager = GetRequiredService(); _backgroundJobStore = GetRequiredService(); + _anonymousJobHandlerRegistry = GetRequiredService(); } [Fact] @@ -75,4 +77,19 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase jobInfo.JobArgs.ShouldContain("TestAnonymousJob"); jobInfo.JobArgs.ShouldContain("ORD-001"); } + + [Fact] + public async Task Should_Not_Wrap_If_Typed_Job_Exists_For_Same_Name() + { + var typedJobName = BackgroundJobNameAttribute.GetName(); + _anonymousJobHandlerRegistry.Register(typedJobName, (_, _) => Task.CompletedTask); + + var jobIdAsString = await _backgroundJobManager.EnqueueAsync(typedJobName, new { Value = "42" }); + jobIdAsString.ShouldNotBe(default); + + var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); + jobInfo.ShouldNotBeNull(); + jobInfo.JobName.ShouldBe(typedJobName); + jobInfo.JobName.ShouldNotBe(AnonymousJobArgs.JobNameConstant); + } } From d3f9a643c8b34482453653a18e7624a1b50b1d26 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 16:38:51 +0300 Subject: [PATCH 14/40] Update index.md --- .../framework/infrastructure/background-jobs/index.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/en/framework/infrastructure/background-jobs/index.md b/docs/en/framework/infrastructure/background-jobs/index.md index 61a4171b49..f581985df9 100644 --- a/docs/en/framework/infrastructure/background-jobs/index.md +++ b/docs/en/framework/infrastructure/background-jobs/index.md @@ -197,13 +197,15 @@ Enqueue method gets some optional arguments to control the background job: * **priority** is used to control priority of the job item. It gets an `BackgroundJobPriority` enum which has `Low`, `BelowNormal`, `Normal` (default), `AboveNormal` and `Hight` fields. * **delay** is used to wait a while (`TimeSpan`) before first try. -### Queue by Job Name +### Enqueue by ABP Job Name -You can also enqueue jobs by their name at runtime: +You can also enqueue jobs by their ABP background job name at runtime: ```csharp +var jobName = BackgroundJobNameAttribute.GetName(); // "emails" if configured via [BackgroundJobName] + await _backgroundJobManager.EnqueueAsync( - "emails", + jobName, new { EmailAddress = "user@abp.io", @@ -213,6 +215,8 @@ await _backgroundJobManager.EnqueueAsync( ); ``` +`jobName` here is the ABP background job name (configuration key), not a provider queue name (like a Hangfire queue or RabbitMQ queue). + In this case, ABP resolves the target job configuration by `jobName` and serializes the `args` object. If the `args` runtime type does not match the configured argument type, ABP normalizes the payload by serializing and deserializing it to the expected argument type. From dcf08ec627d867a0ebf94440b06d58c59533b72f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 22:51:23 +0300 Subject: [PATCH 15/40] Add dynamic background worker support Introduce runtime dynamic background workers: add DynamicBackgroundWorkerExecutionContext, DynamicBackgroundWorkerSchedule, IDynamicBackgroundWorkerHandlerRegistry and its implementation. Extend IBackgroundWorkerManager with AddAsync overloads to register handlers by name and schedule. Provide InMemoryDynamicBackgroundWorker for in-process execution and provider-specific adapters/implementations for Hangfire, Quartz and TickerQ (including Hangfire/Quartz/TickerQ adapters and manager changes) to schedule and execute dynamic handlers. Update BackgroundWorkerManager to hold IServiceProvider and the handler registry and wire DI through constructors. Add a docs example and unit tests to verify handler registration and execution. --- .../background-workers/index.md | 27 +++++++ .../BackgroundJobConfiguration.cs | 2 +- .../BackgroundJobs/BackgroundJobExecuter.cs | 2 +- .../Abp/BackgroundJobs/JobExecutionContext.cs | 2 +- .../Hangfire/HangfireJobExecutionAdapter.cs | 2 +- .../Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 2 +- .../TickerQ/AbpBackgroundJobsTickerQModule.cs | 2 +- .../Abp/BackgroundJobs/BackgroundJobWorker.cs | 2 +- .../HangfireBackgroundWorkerManager.cs | 76 +++++++++++++++++- .../HangfireDynamicBackgroundWorkerAdapter.cs | 31 ++++++++ .../Quartz/QuartzBackgroundWorkerManager.cs | 77 ++++++++++++++++++- .../QuartzDynamicBackgroundWorkerAdapter.cs | 41 ++++++++++ .../AbpTickerQBackgroundWorkerManager.cs | 69 +++++++++++++++++ .../BackgroundWorkerManager.cs | 60 ++++++++++++++- ...DynamicBackgroundWorkerExecutionContext.cs | 16 ++++ .../DynamicBackgroundWorkerHandlerRegistry.cs | 43 +++++++++++ .../DynamicBackgroundWorkerSchedule.cs | 10 +++ .../IBackgroundWorkerManager.cs | 20 ++++- ...IDynamicBackgroundWorkerHandlerRegistry.cs | 16 ++++ .../InMemoryDynamicBackgroundWorker.cs | 40 ++++++++++ .../DynamicBackgroundWorkerManager_Tests.cs | 64 +++++++++++++++ 21 files changed, 590 insertions(+), 14 deletions(-) create mode 100644 framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerAdapter.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerExecutionContext.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandlerRegistry.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerSchedule.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerHandlerRegistry.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs create mode 100644 framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs diff --git a/docs/en/framework/infrastructure/background-workers/index.md b/docs/en/framework/infrastructure/background-workers/index.md index 6204857d8c..4586f2660b 100644 --- a/docs/en/framework/infrastructure/background-workers/index.md +++ b/docs/en/framework/infrastructure/background-workers/index.md @@ -120,6 +120,33 @@ So, it resolves the given background worker and adds to the `IBackgroundWorkerMa While we generally add workers in `OnApplicationInitializationAsync`, there are no restrictions on that. You can inject `IBackgroundWorkerManager` anywhere and add workers at runtime. Background worker manager will stop and release all the registered workers when your application is being shut down. +### Add Dynamic Workers at Runtime (Handler in Add) + +You can add a runtime worker without pre-defining a dedicated worker class by passing a handler directly to `AddAsync`. + +```csharp +await backgroundWorkerManager.AddAsync( + "InventorySyncWorker", + new DynamicBackgroundWorkerSchedule + { + Period = 30000 // 30 seconds + // CronExpression = "*/30 * * * * *" // optional (provider dependent) + }, + async (context, cancellationToken) => + { + var inventorySyncAppService = context.ServiceProvider.GetRequiredService(); + await inventorySyncAppService.SyncAsync(cancellationToken); + } +); +``` + +Key points: + +* `workerName` is the runtime identifier of the dynamic worker. +* The `handler` is registered at runtime and executed through the provider-specific worker manager. +* Provider behavior is preserved. For example, providers with persistent schedulers keep their own scheduling semantics. +* The default in-process manager uses in-memory periodic execution. + ## Options `AbpBackgroundWorkerOptions` class is used to [set options](../../fundamentals/options.md) for the background workers. Currently, there is only one option: diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs index c17ccdc443..fa54ab5538 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace Volo.Abp.BackgroundJobs; diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs index 6b6d822c50..e8a840035f 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using System; diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs index ae7e098070..4ef2d2c19d 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading; using Volo.Abp.DependencyInjection; 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 8790243334..d2ac1ed9cc 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,4 @@ -using System.Threading; +using System.Threading; using System.Threading.Tasks; using Hangfire; using Microsoft.Extensions.DependencyInjection; diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index 1e2280b78a..e3435efc16 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Threading; diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs index 3d93fc68a1..76e3aee2d5 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Reflection; using Microsoft.Extensions.DependencyInjection; diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs index a015e32d66..159f11a6d3 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index 64a4a1be64..e49a99005e 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -9,6 +9,7 @@ using Hangfire.Storage; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; +using Volo.Abp.BackgroundWorkers; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; using Volo.Abp.Hangfire; @@ -20,11 +21,12 @@ namespace Volo.Abp.BackgroundWorkers.Hangfire; public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISingletonDependency { protected AbpHangfireBackgroundJobServer BackgroundJobServer { get; set; } = default!; - protected IServiceProvider ServiceProvider { get; } - public HangfireBackgroundWorkerManager(IServiceProvider serviceProvider) + public HangfireBackgroundWorkerManager( + IServiceProvider serviceProvider, + IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry) + : base(serviceProvider, dynamicBackgroundWorkerHandlerRegistry) { - ServiceProvider = serviceProvider; } public void Initialize() @@ -137,6 +139,74 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet } } + public override Task AddAsync( + string workerName, + Func handler, + CancellationToken cancellationToken = default) + { + return AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule + { + Period = DynamicBackgroundWorkerSchedule.DefaultPeriod + }, + handler, + cancellationToken + ); + } + + public override Task AddAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + Func handler, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + Check.NotNull(handler, nameof(handler)); + + DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); + + var cronExpression = schedule.CronExpression; + if (cronExpression.IsNullOrWhiteSpace()) + { + var period = schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod; + cronExpression = GetCron(period); + } + + var logger = ServiceProvider.GetRequiredService>(); + var abpHangfireOptions = ServiceProvider.GetRequiredService>().Value; + var queueName = abpHangfireOptions.DefaultQueue; + var recurringJobId = $"DynamicWorker:{workerName}"; + + if (!JobStorage.Current.HasFeature(JobStorageFeatures.JobQueueProperty)) + { + logger.LogError($"Current storage doesn't support specifying queues({queueName}) directly for a specific job. Please use the QueueAttribute instead."); + RecurringJob.AddOrUpdate( + recurringJobId, + adapter => adapter.DoWorkAsync(workerName, cancellationToken), + cronExpression, + new RecurringJobOptions + { + TimeZone = TimeZoneInfo.Utc + }); + } + else + { + RecurringJob.AddOrUpdate( + recurringJobId, + queueName, + adapter => adapter.DoWorkAsync(workerName, cancellationToken), + cronExpression, + new RecurringJobOptions + { + TimeZone = TimeZoneInfo.Utc + }); + } + + return Task.CompletedTask; + } + private static readonly MethodInfo? GetRecurringJobIdMethodInfo = typeof(RecurringJob).GetMethod("GetRecurringJobId", BindingFlags.NonPublic | BindingFlags.Static); protected virtual string? GetRecurringJobId(IBackgroundWorker worker, Expression> methodCall) { diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerAdapter.cs new file mode 100644 index 0000000000..6ae84da915 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerAdapter.cs @@ -0,0 +1,31 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BackgroundWorkers.Hangfire; + +public class HangfireDynamicBackgroundWorkerAdapter : ITransientDependency +{ + protected IDynamicBackgroundWorkerHandlerRegistry DynamicBackgroundWorkerHandlerRegistry { get; } + protected IServiceProvider ServiceProvider { get; } + + public HangfireDynamicBackgroundWorkerAdapter( + IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry, + IServiceProvider serviceProvider) + { + DynamicBackgroundWorkerHandlerRegistry = dynamicBackgroundWorkerHandlerRegistry; + ServiceProvider = serviceProvider; + } + + public virtual async Task DoWorkAsync(string workerName, CancellationToken cancellationToken = default) + { + var handler = DynamicBackgroundWorkerHandlerRegistry.Get(workerName); + if (handler == null) + { + return; + } + + await handler(new DynamicBackgroundWorkerExecutionContext(workerName, ServiceProvider), cancellationToken); + } +} 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 9854379c79..c383bdd8f4 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 @@ -1,6 +1,7 @@ using System; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Quartz; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; @@ -10,9 +11,15 @@ namespace Volo.Abp.BackgroundWorkers.Quartz; [Dependency(ReplaceServices = true)] public class QuartzBackgroundWorkerManager : BackgroundWorkerManager, ISingletonDependency { + public const string DynamicWorkerNameKey = "AbpDynamicWorkerName"; + protected IScheduler Scheduler { get; } - public QuartzBackgroundWorkerManager(IScheduler scheduler) + public QuartzBackgroundWorkerManager( + IScheduler scheduler, + IServiceProvider serviceProvider, + IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry) + : base(serviceProvider, dynamicBackgroundWorkerHandlerRegistry) { Scheduler = scheduler; } @@ -96,4 +103,72 @@ public class QuartzBackgroundWorkerManager : BackgroundWorkerManager, ISingleton await Scheduler.ScheduleJob(quartzWork.JobDetail, quartzWork.Trigger, cancellationToken); } } + + public override Task AddAsync( + string workerName, + Func handler, + CancellationToken cancellationToken = default) + { + return AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule + { + Period = DynamicBackgroundWorkerSchedule.DefaultPeriod + }, + handler, + cancellationToken + ); + } + + public override async Task AddAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + Func handler, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + Check.NotNull(handler, nameof(handler)); + + DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); + + if (schedule.Period == null && schedule.CronExpression.IsNullOrWhiteSpace()) + { + throw new AbpException($"Both 'Period' and 'CronExpression' are not set for dynamic worker {workerName}. You must set at least one of them."); + } + + var jobKey = new JobKey($"DynamicWorker:{workerName}"); + var triggerKey = new TriggerKey($"DynamicWorker:{workerName}"); + var jobDetail = JobBuilder.Create() + .WithIdentity(jobKey) + .UsingJobData(DynamicWorkerNameKey, workerName) + .Build(); + + var triggerBuilder = TriggerBuilder.Create() + .ForJob(jobDetail) + .WithIdentity(triggerKey); + + if (!schedule.CronExpression.IsNullOrWhiteSpace()) + { + triggerBuilder.WithCronSchedule(schedule.CronExpression); + } + else + { + triggerBuilder.WithSimpleSchedule(builder => + builder.WithInterval(TimeSpan.FromMilliseconds(schedule.Period!.Value)).RepeatForever()); + } + + var trigger = triggerBuilder.Build(); + + if (await Scheduler.CheckExists(jobDetail.Key, cancellationToken)) + { + await Scheduler.AddJob(jobDetail, true, true, cancellationToken); + await Scheduler.ResumeJob(jobDetail.Key, cancellationToken); + await Scheduler.RescheduleJob(trigger.Key, trigger, cancellationToken); + } + else + { + await Scheduler.ScheduleJob(jobDetail, trigger, cancellationToken); + } + } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs new file mode 100644 index 0000000000..f0c9e09ad8 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs @@ -0,0 +1,41 @@ +using System; +using System.Threading.Tasks; +using Quartz; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BackgroundWorkers.Quartz; + +public class QuartzDynamicBackgroundWorkerAdapter : IJob, ITransientDependency +{ + protected IDynamicBackgroundWorkerHandlerRegistry DynamicBackgroundWorkerHandlerRegistry { get; } + protected IServiceProvider ServiceProvider { get; } + + public QuartzDynamicBackgroundWorkerAdapter( + IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry, + IServiceProvider serviceProvider) + { + DynamicBackgroundWorkerHandlerRegistry = dynamicBackgroundWorkerHandlerRegistry; + ServiceProvider = serviceProvider; + } + + public virtual async Task Execute(IJobExecutionContext context) + { + var workerName = context.MergedJobDataMap.GetString(QuartzBackgroundWorkerManager.DynamicWorkerNameKey); + if (string.IsNullOrWhiteSpace(workerName)) + { + return; + } + + var nonNullWorkerName = workerName!; + var handler = DynamicBackgroundWorkerHandlerRegistry.Get(nonNullWorkerName); + if (handler == null) + { + return; + } + + await handler( + new DynamicBackgroundWorkerExecutionContext(nonNullWorkerName, ServiceProvider), + context.CancellationToken + ); + } +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs index 922cad294d..8eb839b9e3 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs @@ -1,8 +1,11 @@ using System; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; +using TickerQ.Utilities.Entities; using TickerQ.Utilities.Enums; +using TickerQ.Utilities.Interfaces.Managers; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; using Volo.Abp.TickerQ; @@ -14,15 +17,21 @@ public class AbpTickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingl { protected AbpTickerQFunctionProvider AbpTickerQFunctionProvider { get; } protected AbpTickerQBackgroundWorkersProvider AbpTickerQBackgroundWorkersProvider { get; } + protected ICronTickerManager CronTickerManager { get; } protected AbpBackgroundWorkersTickerQOptions Options { get; } public AbpTickerQBackgroundWorkerManager( AbpTickerQFunctionProvider abpTickerQFunctionProvider, AbpTickerQBackgroundWorkersProvider abpTickerQBackgroundWorkersProvider, + ICronTickerManager cronTickerManager, + IServiceProvider serviceProvider, + IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry, IOptions options) + : base(serviceProvider, dynamicBackgroundWorkerHandlerRegistry) { AbpTickerQFunctionProvider = abpTickerQFunctionProvider; AbpTickerQBackgroundWorkersProvider = abpTickerQBackgroundWorkersProvider; + CronTickerManager = cronTickerManager; Options = options.Value; } @@ -70,6 +79,66 @@ public class AbpTickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingl await base.AddAsync(worker, cancellationToken); } + public override Task AddAsync( + string workerName, + Func handler, + CancellationToken cancellationToken = default) + { + return AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule + { + Period = DynamicBackgroundWorkerSchedule.DefaultPeriod + }, + handler, + cancellationToken + ); + } + + public override async Task AddAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + Func handler, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + Check.NotNull(handler, nameof(handler)); + + DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); + + var cronExpression = schedule.CronExpression ?? GetCron(schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod); + var functionName = $"DynamicWorker:{workerName}"; + + AbpTickerQFunctionProvider.Functions[functionName] = + (string.Empty, TickerTaskPriority.LongRunning, async (tickerCancellationToken, serviceProvider, _) => + { + var registeredHandler = DynamicBackgroundWorkerHandlerRegistry.Get(workerName); + if (registeredHandler == null) + { + return; + } + + await registeredHandler( + new DynamicBackgroundWorkerExecutionContext(workerName, serviceProvider), + tickerCancellationToken + ); + }); + + AbpTickerQBackgroundWorkersProvider.BackgroundWorkers[functionName] = new AbpTickerQCronBackgroundWorker + { + Function = functionName, + CronExpression = cronExpression, + WorkerType = typeof(AbpTickerQBackgroundWorkerManager) + }; + + await CronTickerManager.AddAsync(new CronTickerEntity + { + Function = functionName, + Expression = cronExpression + }); + } + protected virtual string GetCron(int period) { var time = TimeSpan.FromMilliseconds(period); diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs index 8d05ce1239..ea3e18492b 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs @@ -1,8 +1,10 @@ -using System; +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; namespace Volo.Abp.BackgroundWorkers; @@ -16,13 +18,19 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen private bool _isDisposed; private readonly List _backgroundWorkers; + protected IServiceProvider ServiceProvider { get; } + protected IDynamicBackgroundWorkerHandlerRegistry DynamicBackgroundWorkerHandlerRegistry { get; } /// /// Initializes a new instance of the class. /// - public BackgroundWorkerManager() + public BackgroundWorkerManager( + IServiceProvider serviceProvider, + IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry) { _backgroundWorkers = new List(); + ServiceProvider = serviceProvider; + DynamicBackgroundWorkerHandlerRegistry = dynamicBackgroundWorkerHandlerRegistry; } public virtual async Task AddAsync(IBackgroundWorker worker, CancellationToken cancellationToken = default) @@ -35,6 +43,54 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen } } + public virtual Task AddAsync( + string workerName, + Func handler, + CancellationToken cancellationToken = default) + { + return AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule + { + Period = DynamicBackgroundWorkerSchedule.DefaultPeriod + }, + handler, + cancellationToken + ); + } + + public virtual async Task AddAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + Func handler, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + Check.NotNull(handler, nameof(handler)); + + DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); + + if (schedule.Period == null && !string.IsNullOrWhiteSpace(schedule.CronExpression)) + { + throw new AbpException("Default background worker manager does not support cron expression without period."); + } + + var timer = ServiceProvider.GetRequiredService(); + var serviceScopeFactory = ServiceProvider.GetRequiredService(); + var worker = new InMemoryDynamicBackgroundWorker( + workerName, + schedule, + timer, + serviceScopeFactory, + DynamicBackgroundWorkerHandlerRegistry + ); + worker.ServiceProvider = ServiceProvider; + worker.LazyServiceProvider = ServiceProvider.GetRequiredService(); + + await AddAsync(worker, cancellationToken); + } + public virtual void Dispose() { if (_isDisposed) diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerExecutionContext.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerExecutionContext.cs new file mode 100644 index 0000000000..edb810d105 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerExecutionContext.cs @@ -0,0 +1,16 @@ +using System; + +namespace Volo.Abp.BackgroundWorkers; + +public class DynamicBackgroundWorkerExecutionContext +{ + public string WorkerName { get; } + + public IServiceProvider ServiceProvider { get; } + + public DynamicBackgroundWorkerExecutionContext(string workerName, IServiceProvider serviceProvider) + { + WorkerName = Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + ServiceProvider = Check.NotNull(serviceProvider, nameof(serviceProvider)); + } +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandlerRegistry.cs new file mode 100644 index 0000000000..0f9ea8c022 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandlerRegistry.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BackgroundWorkers; + +public class DynamicBackgroundWorkerHandlerRegistry : IDynamicBackgroundWorkerHandlerRegistry, ISingletonDependency +{ + protected ConcurrentDictionary> Handlers { get; } + + public DynamicBackgroundWorkerHandlerRegistry() + { + Handlers = new ConcurrentDictionary>(); + } + + public virtual void Register(string workerName, Func handler) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(handler, nameof(handler)); + + Handlers[workerName] = handler; + } + + public virtual bool Unregister(string workerName) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + return Handlers.TryRemove(workerName, out _); + } + + public virtual bool IsRegistered(string workerName) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + return Handlers.ContainsKey(workerName); + } + + public virtual Func? Get(string workerName) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + return Handlers.TryGetValue(workerName, out var handler) ? handler : null; + } +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerSchedule.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerSchedule.cs new file mode 100644 index 0000000000..3652088c25 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerSchedule.cs @@ -0,0 +1,10 @@ +namespace Volo.Abp.BackgroundWorkers; + +public class DynamicBackgroundWorkerSchedule +{ + public const int DefaultPeriod = 60000; + + public int? Period { get; set; } + + public string? CronExpression { get; set; } +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs index 499524f7ca..dbff4ff067 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs @@ -1,4 +1,5 @@ -using System.Threading; +using System; +using System.Threading; using System.Threading.Tasks; using Volo.Abp.Threading; @@ -17,4 +18,21 @@ public interface IBackgroundWorkerManager : IRunnable /// /// Task AddAsync(IBackgroundWorker worker, CancellationToken cancellationToken = default); + + /// + /// Adds a dynamic worker by name and handler. + /// + Task AddAsync( + string workerName, + Func handler, + CancellationToken cancellationToken = default); + + /// + /// Adds a dynamic worker by name, schedule and handler. + /// + Task AddAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + Func handler, + CancellationToken cancellationToken = default); } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerHandlerRegistry.cs new file mode 100644 index 0000000000..eb0db0e6d0 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerHandlerRegistry.cs @@ -0,0 +1,16 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Volo.Abp.BackgroundWorkers; + +public interface IDynamicBackgroundWorkerHandlerRegistry +{ + void Register(string workerName, Func handler); + + bool Unregister(string workerName); + + bool IsRegistered(string workerName); + + Func? Get(string workerName); +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs new file mode 100644 index 0000000000..7d5cb4dd7f --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs @@ -0,0 +1,40 @@ +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Volo.Abp.Threading; + +namespace Volo.Abp.BackgroundWorkers; + +public class InMemoryDynamicBackgroundWorker : AsyncPeriodicBackgroundWorkerBase +{ + protected string WorkerName { get; } + protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; } + + public InMemoryDynamicBackgroundWorker( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + AbpAsyncTimer timer, + IServiceScopeFactory serviceScopeFactory, + IDynamicBackgroundWorkerHandlerRegistry handlerRegistry) + : base(timer, serviceScopeFactory) + { + WorkerName = Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + HandlerRegistry = Check.NotNull(handlerRegistry, nameof(handlerRegistry)); + + Timer.Period = schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod; + CronExpression = schedule.CronExpression; + } + + protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext) + { + var handler = HandlerRegistry.Get(WorkerName); + if (handler == null) + { + Logger.LogWarning("No dynamic background worker handler registered for: {WorkerName}", WorkerName); + return; + } + + await handler(new DynamicBackgroundWorkerExecutionContext(WorkerName, workerContext.ServiceProvider), workerContext.CancellationToken); + } +} diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs new file mode 100644 index 0000000000..51bae67fbe --- /dev/null +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs @@ -0,0 +1,64 @@ +using System; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.BackgroundWorkers; +using Xunit; + +namespace Volo.Abp.BackgroundJobs; + +public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase +{ + private readonly IBackgroundWorkerManager _backgroundWorkerManager; + private readonly IDynamicBackgroundWorkerHandlerRegistry _handlerRegistry; + + public DynamicBackgroundWorkerManager_Tests() + { + _backgroundWorkerManager = GetRequiredService(); + _handlerRegistry = GetRequiredService(); + } + + [Fact] + public async Task Should_Register_Dynamic_Handler_When_Added() + { + var workerName = "dynamic-worker-" + Guid.NewGuid(); + + await _backgroundWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule + { + Period = 1000 + }, + (_, _) => Task.CompletedTask + ); + + _handlerRegistry.IsRegistered(workerName).ShouldBeTrue(); + } + + [Fact] + public async Task Should_Execute_Dynamic_Handler() + { + var workerName = "dynamic-worker-" + Guid.NewGuid(); + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + await _backgroundWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule + { + Period = 50 + }, + (context, _) => + { + if (context.WorkerName == workerName) + { + tcs.TrySetResult(true); + } + + return Task.CompletedTask; + } + ); + + var completedTask = await Task.WhenAny(tcs.Task, Task.Delay(5000)); + completedTask.ShouldBe(tcs.Task); + (await tcs.Task).ShouldBeTrue(); + } +} From 15202a910cfae0e9c679a7cc1df8ada9fa046606 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Tue, 10 Mar 2026 23:31:05 +0300 Subject: [PATCH 16/40] Add dynamic worker remove/update APIs Introduce RemoveAsync and UpdateScheduleAsync to IBackgroundWorkerManager and implement them for the default in-memory manager, Hangfire, Quartz and TickerQ providers. The default BackgroundWorkerManager now tracks dynamic workers in a dictionary, supports stopping/removing workers and recreating workers with a new schedule; provider-specific managers update scheduler entries or remove recurring jobs accordingly. Documentation updated with usage examples for removing and updating schedules, and unit tests added to cover removal, schedule updates and non-existent worker behavior. --- .../background-workers/index.md | 18 +++++ .../HangfireBackgroundWorkerManager.cs | 64 ++++++++++++++++ .../Quartz/QuartzBackgroundWorkerManager.cs | 51 +++++++++++++ .../AbpTickerQBackgroundWorkerManager.cs | 44 +++++++++++ .../BackgroundWorkerManager.cs | 65 ++++++++++++++++ .../IBackgroundWorkerManager.cs | 12 +++ .../DynamicBackgroundWorkerManager_Tests.cs | 74 +++++++++++++++++++ 7 files changed, 328 insertions(+) diff --git a/docs/en/framework/infrastructure/background-workers/index.md b/docs/en/framework/infrastructure/background-workers/index.md index 4586f2660b..b56c248ffe 100644 --- a/docs/en/framework/infrastructure/background-workers/index.md +++ b/docs/en/framework/infrastructure/background-workers/index.md @@ -140,12 +140,30 @@ await backgroundWorkerManager.AddAsync( ); ``` +You can also **remove** a dynamic worker or **update its schedule** at runtime: + +```csharp +// Remove a dynamic worker +var removed = await backgroundWorkerManager.RemoveAsync("InventorySyncWorker"); + +// Update the schedule of a dynamic worker +var updated = await backgroundWorkerManager.UpdateScheduleAsync( + "InventorySyncWorker", + new DynamicBackgroundWorkerSchedule + { + Period = 60000 // change to 60 seconds + } +); +``` + Key points: * `workerName` is the runtime identifier of the dynamic worker. * The `handler` is registered at runtime and executed through the provider-specific worker manager. * Provider behavior is preserved. For example, providers with persistent schedulers keep their own scheduling semantics. * The default in-process manager uses in-memory periodic execution. +* `RemoveAsync` stops and removes a dynamic worker. Returns `true` if the worker was found and removed. +* `UpdateScheduleAsync` changes the schedule of an existing dynamic worker. Returns `true` if the worker was found and updated. The handler itself is not changed. ## Options diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index e49a99005e..6cd778c1fd 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -207,6 +207,70 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet return Task.CompletedTask; } + public override Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + + if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) + { + return Task.FromResult(false); + } + + var recurringJobId = $"DynamicWorker:{workerName}"; + RecurringJob.RemoveIfExists(recurringJobId); + DynamicBackgroundWorkerHandlerRegistry.Unregister(workerName); + + return Task.FromResult(true); + } + + public override Task UpdateScheduleAsync(string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + + if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) + { + return Task.FromResult(false); + } + + var cronExpression = schedule.CronExpression; + if (cronExpression.IsNullOrWhiteSpace()) + { + var period = schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod; + cronExpression = GetCron(period); + } + + var abpHangfireOptions = ServiceProvider.GetRequiredService>().Value; + var queueName = abpHangfireOptions.DefaultQueue; + var recurringJobId = $"DynamicWorker:{workerName}"; + + if (!JobStorage.Current.HasFeature(JobStorageFeatures.JobQueueProperty)) + { + RecurringJob.AddOrUpdate( + recurringJobId, + adapter => adapter.DoWorkAsync(workerName, cancellationToken), + cronExpression, + new RecurringJobOptions + { + TimeZone = TimeZoneInfo.Utc + }); + } + else + { + RecurringJob.AddOrUpdate( + recurringJobId, + queueName, + adapter => adapter.DoWorkAsync(workerName, cancellationToken), + cronExpression, + new RecurringJobOptions + { + TimeZone = TimeZoneInfo.Utc + }); + } + + return Task.FromResult(true); + } + private static readonly MethodInfo? GetRecurringJobIdMethodInfo = typeof(RecurringJob).GetMethod("GetRecurringJobId", BindingFlags.NonPublic | BindingFlags.Static); protected virtual string? GetRecurringJobId(IBackgroundWorker worker, Expression> methodCall) { 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 c383bdd8f4..e0d30b7d3b 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 @@ -171,4 +171,55 @@ public class QuartzBackgroundWorkerManager : BackgroundWorkerManager, ISingleton await Scheduler.ScheduleJob(jobDetail, trigger, cancellationToken); } } + + public override async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + + if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) + { + return false; + } + + var jobKey = new JobKey($"DynamicWorker:{workerName}"); + await Scheduler.DeleteJob(jobKey, cancellationToken); + DynamicBackgroundWorkerHandlerRegistry.Unregister(workerName); + + return true; + } + + public override async Task UpdateScheduleAsync(string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + + if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) + { + return false; + } + + if (schedule.Period == null && schedule.CronExpression.IsNullOrWhiteSpace()) + { + throw new AbpException($"Both 'Period' and 'CronExpression' are not set for dynamic worker {workerName}. You must set at least one of them."); + } + + var triggerKey = new TriggerKey($"DynamicWorker:{workerName}"); + var triggerBuilder = TriggerBuilder.Create() + .WithIdentity(triggerKey) + .ForJob(new JobKey($"DynamicWorker:{workerName}")); + + if (!schedule.CronExpression.IsNullOrWhiteSpace()) + { + triggerBuilder.WithCronSchedule(schedule.CronExpression); + } + else + { + triggerBuilder.WithSimpleSchedule(builder => + builder.WithInterval(TimeSpan.FromMilliseconds(schedule.Period!.Value)).RepeatForever()); + } + + await Scheduler.RescheduleJob(triggerKey, triggerBuilder.Build(), cancellationToken); + + return true; + } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs index 8eb839b9e3..6bf9e305e8 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs @@ -139,6 +139,50 @@ public class AbpTickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingl }); } + public override async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + + if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) + { + return false; + } + + var functionName = $"DynamicWorker:{workerName}"; + AbpTickerQFunctionProvider.Functions.Remove(functionName); + AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.Remove(functionName); + DynamicBackgroundWorkerHandlerRegistry.Unregister(workerName); + + return true; + } + + public override async Task UpdateScheduleAsync(string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + + if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) + { + return false; + } + + var cronExpression = schedule.CronExpression ?? GetCron(schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod); + var functionName = $"DynamicWorker:{workerName}"; + + if (AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.TryGetValue(functionName, out var existingWorker)) + { + existingWorker.CronExpression = cronExpression; + } + + await CronTickerManager.AddAsync(new CronTickerEntity + { + Function = functionName, + Expression = cronExpression + }); + + return true; + } + protected virtual string GetCron(int period) { var time = TimeSpan.FromMilliseconds(period); diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs index ea3e18492b..a5568cc5d0 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs @@ -18,6 +18,7 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen private bool _isDisposed; private readonly List _backgroundWorkers; + private readonly Dictionary _dynamicWorkers; protected IServiceProvider ServiceProvider { get; } protected IDynamicBackgroundWorkerHandlerRegistry DynamicBackgroundWorkerHandlerRegistry { get; } @@ -29,6 +30,7 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry) { _backgroundWorkers = new List(); + _dynamicWorkers = new Dictionary(); ServiceProvider = serviceProvider; DynamicBackgroundWorkerHandlerRegistry = dynamicBackgroundWorkerHandlerRegistry; } @@ -88,9 +90,72 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen worker.ServiceProvider = ServiceProvider; worker.LazyServiceProvider = ServiceProvider.GetRequiredService(); + _dynamicWorkers[workerName] = worker; + await AddAsync(worker, cancellationToken); } + public virtual async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + + if (!_dynamicWorkers.TryGetValue(workerName, out var worker)) + { + return false; + } + + await worker.StopAsync(cancellationToken); + _backgroundWorkers.Remove(worker); + _dynamicWorkers.Remove(workerName); + DynamicBackgroundWorkerHandlerRegistry.Unregister(workerName); + + return true; + } + + public virtual async Task UpdateScheduleAsync(string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + + if (!_dynamicWorkers.TryGetValue(workerName, out var oldWorker)) + { + return false; + } + + if (schedule.Period == null && !string.IsNullOrWhiteSpace(schedule.CronExpression)) + { + throw new AbpException("Default background worker manager does not support cron expression without period."); + } + + var handler = DynamicBackgroundWorkerHandlerRegistry.Get(workerName); + if (handler == null) + { + return false; + } + + await oldWorker.StopAsync(cancellationToken); + _backgroundWorkers.Remove(oldWorker); + _dynamicWorkers.Remove(workerName); + + var timer = ServiceProvider.GetRequiredService(); + var serviceScopeFactory = ServiceProvider.GetRequiredService(); + var newWorker = new InMemoryDynamicBackgroundWorker( + workerName, + schedule, + timer, + serviceScopeFactory, + DynamicBackgroundWorkerHandlerRegistry + ); + newWorker.ServiceProvider = ServiceProvider; + newWorker.LazyServiceProvider = ServiceProvider.GetRequiredService(); + + _dynamicWorkers[workerName] = newWorker; + + await AddAsync(newWorker, cancellationToken); + + return true; + } + public virtual void Dispose() { if (_isDisposed) diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs index dbff4ff067..eb22729d57 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs @@ -35,4 +35,16 @@ public interface IBackgroundWorkerManager : IRunnable DynamicBackgroundWorkerSchedule schedule, Func handler, CancellationToken cancellationToken = default); + + /// + /// Removes a previously added dynamic worker by name. + /// Returns true if the worker was found and removed; false otherwise. + /// + Task RemoveAsync(string workerName, CancellationToken cancellationToken = default); + + /// + /// Updates the schedule of a previously added dynamic worker. + /// Returns true if the worker was found and updated; false otherwise. + /// + Task UpdateScheduleAsync(string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default); } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs index 51bae67fbe..bd2685da04 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs @@ -1,4 +1,5 @@ using System; +using System.Threading; using System.Threading.Tasks; using Shouldly; using Volo.Abp.BackgroundWorkers; @@ -61,4 +62,77 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase completedTask.ShouldBe(tcs.Task); (await tcs.Task).ShouldBeTrue(); } + + [Fact] + public async Task Should_Remove_Dynamic_Worker() + { + var workerName = "dynamic-worker-" + Guid.NewGuid(); + + await _backgroundWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule + { + Period = 1000 + }, + (_, _) => Task.CompletedTask + ); + + _handlerRegistry.IsRegistered(workerName).ShouldBeTrue(); + + var result = await _backgroundWorkerManager.RemoveAsync(workerName); + result.ShouldBeTrue(); + _handlerRegistry.IsRegistered(workerName).ShouldBeFalse(); + } + + [Fact] + public async Task Should_Return_False_When_Removing_NonExistent_Worker() + { + var result = await _backgroundWorkerManager.RemoveAsync("non-existent-worker-" + Guid.NewGuid()); + result.ShouldBeFalse(); + } + + [Fact] + public async Task Should_Update_Dynamic_Worker_Schedule() + { + var workerName = "dynamic-worker-" + Guid.NewGuid(); + var executionCount = 0; + + await _backgroundWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule + { + Period = 60000 + }, + (_, _) => + { + Interlocked.Increment(ref executionCount); + return Task.CompletedTask; + } + ); + + var result = await _backgroundWorkerManager.UpdateScheduleAsync( + workerName, + new DynamicBackgroundWorkerSchedule + { + Period = 50 + } + ); + + result.ShouldBeTrue(); + _handlerRegistry.IsRegistered(workerName).ShouldBeTrue(); + + await Task.Delay(500); + executionCount.ShouldBeGreaterThan(0); + } + + [Fact] + public async Task Should_Return_False_When_Updating_NonExistent_Worker() + { + var result = await _backgroundWorkerManager.UpdateScheduleAsync( + "non-existent-worker-" + Guid.NewGuid(), + new DynamicBackgroundWorkerSchedule { Period = 1000 } + ); + + result.ShouldBeFalse(); + } } From b9a265a831757bc0a3cef96c479c56ada12c07e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Wed, 11 Mar 2026 10:44:58 +0300 Subject: [PATCH 17/40] Defer dynamic handler registration and fix outcomes Move DynamicBackgroundWorkerHandlerRegistry.Register calls to after scheduling to avoid registering handlers when scheduling fails. Adjust Quartz behaviour to return actual outcomes: only unregister when DeleteJob reports deletion and return whether RescheduleJob succeeded. Convert TickerQ RemoveAsync to a non-async Task (using Task.FromResult) and move its registration similarly. Update test to poll with a timeout (instead of a fixed 500ms delay) to wait for background worker execution. --- .../Hangfire/HangfireBackgroundWorkerManager.cs | 4 ++-- .../Quartz/QuartzBackgroundWorkerManager.cs | 17 ++++++++++------- .../AbpTickerQBackgroundWorkerManager.cs | 10 +++++----- .../BackgroundWorkerManager.cs | 4 ++-- .../DynamicBackgroundWorkerManager_Tests.cs | 8 +++++++- 5 files changed, 26 insertions(+), 17 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index 6cd778c1fd..5d82c14ba9 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -165,8 +165,6 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet Check.NotNull(schedule, nameof(schedule)); Check.NotNull(handler, nameof(handler)); - DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); - var cronExpression = schedule.CronExpression; if (cronExpression.IsNullOrWhiteSpace()) { @@ -204,6 +202,8 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet }); } + DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); + return Task.CompletedTask; } 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 e0d30b7d3b..a696f6e8ac 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 @@ -130,8 +130,6 @@ public class QuartzBackgroundWorkerManager : BackgroundWorkerManager, ISingleton Check.NotNull(schedule, nameof(schedule)); Check.NotNull(handler, nameof(handler)); - DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); - if (schedule.Period == null && schedule.CronExpression.IsNullOrWhiteSpace()) { throw new AbpException($"Both 'Period' and 'CronExpression' are not set for dynamic worker {workerName}. You must set at least one of them."); @@ -170,6 +168,8 @@ public class QuartzBackgroundWorkerManager : BackgroundWorkerManager, ISingleton { await Scheduler.ScheduleJob(jobDetail, trigger, cancellationToken); } + + DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); } public override async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) @@ -182,10 +182,13 @@ public class QuartzBackgroundWorkerManager : BackgroundWorkerManager, ISingleton } var jobKey = new JobKey($"DynamicWorker:{workerName}"); - await Scheduler.DeleteJob(jobKey, cancellationToken); - DynamicBackgroundWorkerHandlerRegistry.Unregister(workerName); + var deleted = await Scheduler.DeleteJob(jobKey, cancellationToken); + if (deleted) + { + DynamicBackgroundWorkerHandlerRegistry.Unregister(workerName); + } - return true; + return deleted; } public override async Task UpdateScheduleAsync(string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default) @@ -218,8 +221,8 @@ public class QuartzBackgroundWorkerManager : BackgroundWorkerManager, ISingleton builder.WithInterval(TimeSpan.FromMilliseconds(schedule.Period!.Value)).RepeatForever()); } - await Scheduler.RescheduleJob(triggerKey, triggerBuilder.Build(), cancellationToken); + var result = await Scheduler.RescheduleJob(triggerKey, triggerBuilder.Build(), cancellationToken); - return true; + return result != null; } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs index 6bf9e305e8..fbfc9eb47d 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs @@ -105,8 +105,6 @@ public class AbpTickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingl Check.NotNull(schedule, nameof(schedule)); Check.NotNull(handler, nameof(handler)); - DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); - var cronExpression = schedule.CronExpression ?? GetCron(schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod); var functionName = $"DynamicWorker:{workerName}"; @@ -137,15 +135,17 @@ public class AbpTickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingl Function = functionName, Expression = cronExpression }); + + DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); } - public override async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) + public override Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) { Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) { - return false; + return Task.FromResult(false); } var functionName = $"DynamicWorker:{workerName}"; @@ -153,7 +153,7 @@ public class AbpTickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingl AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.Remove(functionName); DynamicBackgroundWorkerHandlerRegistry.Unregister(workerName); - return true; + return Task.FromResult(true); } public override async Task UpdateScheduleAsync(string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default) diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs index a5568cc5d0..a1f9f78fcd 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs @@ -71,13 +71,13 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen Check.NotNull(schedule, nameof(schedule)); Check.NotNull(handler, nameof(handler)); - DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); - if (schedule.Period == null && !string.IsNullOrWhiteSpace(schedule.CronExpression)) { throw new AbpException("Default background worker manager does not support cron expression without period."); } + DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); + var timer = ServiceProvider.GetRequiredService(); var serviceScopeFactory = ServiceProvider.GetRequiredService(); var worker = new InMemoryDynamicBackgroundWorker( diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs index bd2685da04..3c2977e53c 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs @@ -121,7 +121,13 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase result.ShouldBeTrue(); _handlerRegistry.IsRegistered(workerName).ShouldBeTrue(); - await Task.Delay(500); + var timeout = TimeSpan.FromSeconds(5); + var startTime = DateTime.UtcNow; + while (executionCount == 0 && DateTime.UtcNow - startTime < timeout) + { + await Task.Delay(50); + } + executionCount.ShouldBeGreaterThan(0); } From ebb5fae17aaf5514eb8c5acc0ebd983fe22f41bc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?SAL=C4=B0H=20=C3=96ZKARA?= Date: Wed, 11 Mar 2026 11:28:46 +0300 Subject: [PATCH 18/40] Validate schedules and replace dynamic workers Add schedule validation and make dynamic workers replaceable. Introduced DynamicBackgroundWorkerSchedule.Validate (checks Period > 0) and call Validate() in all provider managers (in-memory, Hangfire, Quartz, TickerQ). Switched in-memory dynamic worker storage to ConcurrentDictionary and ensure adding a worker with an existing name stops/removes the previous instance before registering the new one; removals use TryRemove. Updated docs to clarify that adding a worker replaces an existing one and that CronExpression is only supported by scheduler-backed providers. Added tests for replacement behavior and invalid period values. --- .../background-workers/index.md | 4 +- .../HangfireBackgroundWorkerManager.cs | 4 ++ .../Quartz/QuartzBackgroundWorkerManager.cs | 4 ++ .../AbpTickerQBackgroundWorkerManager.cs | 4 ++ .../BackgroundWorkerManager.cs | 19 ++++-- .../DynamicBackgroundWorkerSchedule.cs | 12 ++++ .../DynamicBackgroundWorkerManager_Tests.cs | 68 +++++++++++++++++++ 7 files changed, 109 insertions(+), 6 deletions(-) diff --git a/docs/en/framework/infrastructure/background-workers/index.md b/docs/en/framework/infrastructure/background-workers/index.md index b56c248ffe..8200be023f 100644 --- a/docs/en/framework/infrastructure/background-workers/index.md +++ b/docs/en/framework/infrastructure/background-workers/index.md @@ -158,10 +158,10 @@ var updated = await backgroundWorkerManager.UpdateScheduleAsync( Key points: -* `workerName` is the runtime identifier of the dynamic worker. +* `workerName` is the runtime identifier of the dynamic worker. If a worker with the same name already exists, it will be replaced. * The `handler` is registered at runtime and executed through the provider-specific worker manager. * Provider behavior is preserved. For example, providers with persistent schedulers keep their own scheduling semantics. -* The default in-process manager uses in-memory periodic execution. +* The default in-process manager uses in-memory periodic execution based on `Period`. **`CronExpression` is only supported by scheduler-backed providers (Hangfire, Quartz, TickerQ).** The default in-memory provider ignores `CronExpression`. * `RemoveAsync` stops and removes a dynamic worker. Returns `true` if the worker was found and removed. * `UpdateScheduleAsync` changes the schedule of an existing dynamic worker. Returns `true` if the worker was found and updated. The handler itself is not changed. diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index 5d82c14ba9..12fd49db04 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -165,6 +165,8 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet Check.NotNull(schedule, nameof(schedule)); Check.NotNull(handler, nameof(handler)); + schedule.Validate(); + var cronExpression = schedule.CronExpression; if (cronExpression.IsNullOrWhiteSpace()) { @@ -228,6 +230,8 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); Check.NotNull(schedule, nameof(schedule)); + schedule.Validate(); + if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) { return Task.FromResult(false); 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 a696f6e8ac..d963106e02 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 @@ -130,6 +130,8 @@ public class QuartzBackgroundWorkerManager : BackgroundWorkerManager, ISingleton Check.NotNull(schedule, nameof(schedule)); Check.NotNull(handler, nameof(handler)); + schedule.Validate(); + if (schedule.Period == null && schedule.CronExpression.IsNullOrWhiteSpace()) { throw new AbpException($"Both 'Period' and 'CronExpression' are not set for dynamic worker {workerName}. You must set at least one of them."); @@ -196,6 +198,8 @@ public class QuartzBackgroundWorkerManager : BackgroundWorkerManager, ISingleton Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); Check.NotNull(schedule, nameof(schedule)); + schedule.Validate(); + if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) { return false; diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs index fbfc9eb47d..b2f0de80cf 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs @@ -105,6 +105,8 @@ public class AbpTickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingl Check.NotNull(schedule, nameof(schedule)); Check.NotNull(handler, nameof(handler)); + schedule.Validate(); + var cronExpression = schedule.CronExpression ?? GetCron(schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod); var functionName = $"DynamicWorker:{workerName}"; @@ -161,6 +163,8 @@ public class AbpTickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingl Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); Check.NotNull(schedule, nameof(schedule)); + schedule.Validate(); + if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) { return false; diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs index a1f9f78fcd..84640ff1bf 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -18,7 +19,7 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen private bool _isDisposed; private readonly List _backgroundWorkers; - private readonly Dictionary _dynamicWorkers; + private readonly ConcurrentDictionary _dynamicWorkers; protected IServiceProvider ServiceProvider { get; } protected IDynamicBackgroundWorkerHandlerRegistry DynamicBackgroundWorkerHandlerRegistry { get; } @@ -30,7 +31,7 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry) { _backgroundWorkers = new List(); - _dynamicWorkers = new Dictionary(); + _dynamicWorkers = new ConcurrentDictionary(); ServiceProvider = serviceProvider; DynamicBackgroundWorkerHandlerRegistry = dynamicBackgroundWorkerHandlerRegistry; } @@ -71,11 +72,19 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen Check.NotNull(schedule, nameof(schedule)); Check.NotNull(handler, nameof(handler)); + schedule.Validate(); + if (schedule.Period == null && !string.IsNullOrWhiteSpace(schedule.CronExpression)) { throw new AbpException("Default background worker manager does not support cron expression without period."); } + if (_dynamicWorkers.TryRemove(workerName, out var existingWorker)) + { + await existingWorker.StopAsync(cancellationToken); + _backgroundWorkers.Remove(existingWorker); + } + DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); var timer = ServiceProvider.GetRequiredService(); @@ -106,7 +115,7 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen await worker.StopAsync(cancellationToken); _backgroundWorkers.Remove(worker); - _dynamicWorkers.Remove(workerName); + _dynamicWorkers.TryRemove(workerName, out _); DynamicBackgroundWorkerHandlerRegistry.Unregister(workerName); return true; @@ -117,6 +126,8 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); Check.NotNull(schedule, nameof(schedule)); + schedule.Validate(); + if (!_dynamicWorkers.TryGetValue(workerName, out var oldWorker)) { return false; @@ -135,7 +146,7 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen await oldWorker.StopAsync(cancellationToken); _backgroundWorkers.Remove(oldWorker); - _dynamicWorkers.Remove(workerName); + _dynamicWorkers.TryRemove(workerName, out _); var timer = ServiceProvider.GetRequiredService(); var serviceScopeFactory = ServiceProvider.GetRequiredService(); diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerSchedule.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerSchedule.cs index 3652088c25..6698e2f170 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerSchedule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerSchedule.cs @@ -1,3 +1,5 @@ +using System; + namespace Volo.Abp.BackgroundWorkers; public class DynamicBackgroundWorkerSchedule @@ -7,4 +9,14 @@ public class DynamicBackgroundWorkerSchedule public int? Period { get; set; } public string? CronExpression { get; set; } + + public virtual void Validate() + { + if (Period.HasValue && Period.Value <= 0) + { + throw new ArgumentException( + $"Period must be greater than 0 when provided. Given value: {Period.Value}.", + nameof(Period)); + } + } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs index 3c2977e53c..acece7fd4b 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs @@ -141,4 +141,72 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase result.ShouldBeFalse(); } + + [Fact] + public async Task Should_Replace_Existing_Worker_When_Same_Name_Added() + { + var workerName = "dynamic-worker-" + Guid.NewGuid(); + var firstHandlerCalled = false; + var secondHandlerTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + await _backgroundWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = 60000 }, + (_, _) => + { + firstHandlerCalled = true; + return Task.CompletedTask; + } + ); + + await _backgroundWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = 50 }, + (_, _) => + { + secondHandlerTcs.TrySetResult(true); + return Task.CompletedTask; + } + ); + + var completedTask = await Task.WhenAny(secondHandlerTcs.Task, Task.Delay(5000)); + completedTask.ShouldBe(secondHandlerTcs.Task); + (await secondHandlerTcs.Task).ShouldBeTrue(); + + _handlerRegistry.IsRegistered(workerName).ShouldBeTrue(); + + var removed = await _backgroundWorkerManager.RemoveAsync(workerName); + removed.ShouldBeTrue(); + _handlerRegistry.IsRegistered(workerName).ShouldBeFalse(); + } + + [Fact] + public async Task Should_Throw_When_Period_Is_Zero() + { + var workerName = "dynamic-worker-" + Guid.NewGuid(); + + await Assert.ThrowsAsync(async () => + { + await _backgroundWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = 0 }, + (_, _) => Task.CompletedTask + ); + }); + } + + [Fact] + public async Task Should_Throw_When_Period_Is_Negative() + { + var workerName = "dynamic-worker-" + Guid.NewGuid(); + + await Assert.ThrowsAsync(async () => + { + await _backgroundWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = -1000 }, + (_, _) => Task.CompletedTask + ); + }); + } } From 5babd75f910dcbbcf94bb13b91eeea6cb825921d Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 20 Mar 2026 14:58:57 +0800 Subject: [PATCH 19/40] feat: Implement dynamic background worker management with Quartz and TickerQ --- .../background-workers/index.md | 19 +- .../BackgroundJobConfiguration.cs | 2 +- .../BackgroundJobs/BackgroundJobExecuter.cs | 2 +- .../Abp/BackgroundJobs/JobExecutionContext.cs | 2 +- .../Hangfire/HangfireJobExecutionAdapter.cs | 2 +- .../Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 2 +- .../TickerQ/AbpBackgroundJobsTickerQModule.cs | 2 +- .../Abp/BackgroundJobs/BackgroundJobWorker.cs | 2 +- .../HangfireBackgroundWorkerManager.cs | 144 +-------------- .../HangfireDynamicBackgroundWorkerAdapter.cs | 27 ++- .../HangfireDynamicBackgroundWorkerManager.cs | 168 ++++++++++++++++++ .../Quartz/QuartzBackgroundWorkerManager.cs | 135 +------------- .../QuartzDynamicBackgroundWorkerAdapter.cs | 35 ++-- .../QuartzDynamicBackgroundWorkerManager.cs | 143 +++++++++++++++ .../AbpTickerQBackgroundWorkerManager.cs | 117 ------------ .../TickerQDynamicBackgroundWorkerManager.cs | 164 +++++++++++++++++ .../BackgroundWorkerManager.cs | 136 +------------- .../DefaultDynamicBackgroundWorkerManager.cs | 144 +++++++++++++++ ...ynamicBackgroundWorkerManagerExtensions.cs | 27 +++ .../DynamicBackgroundWorkerSchedule.cs | 6 + .../IBackgroundWorkerManager.cs | 32 +--- .../IDynamicBackgroundWorkerManager.cs | 42 +++++ .../InMemoryDynamicBackgroundWorker.cs | 39 ++-- .../DynamicBackgroundWorkerManager_Tests.cs | 128 +++++++++---- 24 files changed, 889 insertions(+), 631 deletions(-) create mode 100644 framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManagerExtensions.cs create mode 100644 framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs diff --git a/docs/en/framework/infrastructure/background-workers/index.md b/docs/en/framework/infrastructure/background-workers/index.md index 8200be023f..0b53a09c48 100644 --- a/docs/en/framework/infrastructure/background-workers/index.md +++ b/docs/en/framework/infrastructure/background-workers/index.md @@ -120,17 +120,17 @@ So, it resolves the given background worker and adds to the `IBackgroundWorkerMa While we generally add workers in `OnApplicationInitializationAsync`, there are no restrictions on that. You can inject `IBackgroundWorkerManager` anywhere and add workers at runtime. Background worker manager will stop and release all the registered workers when your application is being shut down. -### Add Dynamic Workers at Runtime (Handler in Add) +### Dynamic Workers (Runtime Registration) -You can add a runtime worker without pre-defining a dedicated worker class by passing a handler directly to `AddAsync`. +You can add a runtime worker without pre-defining a dedicated worker class by injecting `IDynamicBackgroundWorkerManager` and passing a handler directly. ```csharp -await backgroundWorkerManager.AddAsync( +await dynamicBackgroundWorkerManager.AddAsync( "InventorySyncWorker", new DynamicBackgroundWorkerSchedule { Period = 30000 // 30 seconds - // CronExpression = "*/30 * * * * *" // optional (provider dependent) + // CronExpression = "*/30 * * * *" // every 30 minutes, supported by Hangfire, Quartz, TickerQ }, async (context, cancellationToken) => { @@ -144,10 +144,10 @@ You can also **remove** a dynamic worker or **update its schedule** at runtime: ```csharp // Remove a dynamic worker -var removed = await backgroundWorkerManager.RemoveAsync("InventorySyncWorker"); +var removed = await dynamicBackgroundWorkerManager.RemoveAsync("InventorySyncWorker"); // Update the schedule of a dynamic worker -var updated = await backgroundWorkerManager.UpdateScheduleAsync( +var updated = await dynamicBackgroundWorkerManager.UpdateScheduleAsync( "InventorySyncWorker", new DynamicBackgroundWorkerSchedule { @@ -158,10 +158,11 @@ var updated = await backgroundWorkerManager.UpdateScheduleAsync( Key points: +* `IDynamicBackgroundWorkerManager` is a separate interface from `IBackgroundWorkerManager`, dedicated to runtime (non-type-safe) worker management. * `workerName` is the runtime identifier of the dynamic worker. If a worker with the same name already exists, it will be replaced. -* The `handler` is registered at runtime and executed through the provider-specific worker manager. -* Provider behavior is preserved. For example, providers with persistent schedulers keep their own scheduling semantics. -* The default in-process manager uses in-memory periodic execution based on `Period`. **`CronExpression` is only supported by scheduler-backed providers (Hangfire, Quartz, TickerQ).** The default in-memory provider ignores `CronExpression`. +* The `handler` receives a `DynamicBackgroundWorkerExecutionContext` containing the worker name and a scoped `IServiceProvider`. +* At least one of `Period` or `CronExpression` must be set in `DynamicBackgroundWorkerSchedule`. +* **`CronExpression` is only supported by scheduler-backed providers (Hangfire, Quartz, TickerQ).** The default in-memory provider requires `Period` and does not support `CronExpression` alone. * `RemoveAsync` stops and removes a dynamic worker. Returns `true` if the worker was found and removed. * `UpdateScheduleAsync` changes the schedule of an existing dynamic worker. Returns `true` if the worker was found and updated. The handler itself is not changed. diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs index fa54ab5538..c17ccdc443 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace Volo.Abp.BackgroundJobs; diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs index e8a840035f..6b6d822c50 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using System; diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs index 4ef2d2c19d..ae7e098070 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading; using Volo.Abp.DependencyInjection; 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 d2ac1ed9cc..8790243334 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,4 @@ -using System.Threading; +using System.Threading; using System.Threading.Tasks; using Hangfire; using Microsoft.Extensions.DependencyInjection; diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index dff2a4e33a..ddc2613b47 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Threading; diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs index 4ff3adbfe4..157f0cc050 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Reflection; using Microsoft.Extensions.DependencyInjection; diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs index 159f11a6d3..a015e32d66 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index 12fd49db04..64a4a1be64 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -9,7 +9,6 @@ using Hangfire.Storage; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; -using Volo.Abp.BackgroundWorkers; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; using Volo.Abp.Hangfire; @@ -21,12 +20,11 @@ namespace Volo.Abp.BackgroundWorkers.Hangfire; public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISingletonDependency { protected AbpHangfireBackgroundJobServer BackgroundJobServer { get; set; } = default!; + protected IServiceProvider ServiceProvider { get; } - public HangfireBackgroundWorkerManager( - IServiceProvider serviceProvider, - IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry) - : base(serviceProvider, dynamicBackgroundWorkerHandlerRegistry) + public HangfireBackgroundWorkerManager(IServiceProvider serviceProvider) { + ServiceProvider = serviceProvider; } public void Initialize() @@ -139,142 +137,6 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet } } - public override Task AddAsync( - string workerName, - Func handler, - CancellationToken cancellationToken = default) - { - return AddAsync( - workerName, - new DynamicBackgroundWorkerSchedule - { - Period = DynamicBackgroundWorkerSchedule.DefaultPeriod - }, - handler, - cancellationToken - ); - } - - public override Task AddAsync( - string workerName, - DynamicBackgroundWorkerSchedule schedule, - Func handler, - CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - Check.NotNull(schedule, nameof(schedule)); - Check.NotNull(handler, nameof(handler)); - - schedule.Validate(); - - var cronExpression = schedule.CronExpression; - if (cronExpression.IsNullOrWhiteSpace()) - { - var period = schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod; - cronExpression = GetCron(period); - } - - var logger = ServiceProvider.GetRequiredService>(); - var abpHangfireOptions = ServiceProvider.GetRequiredService>().Value; - var queueName = abpHangfireOptions.DefaultQueue; - var recurringJobId = $"DynamicWorker:{workerName}"; - - if (!JobStorage.Current.HasFeature(JobStorageFeatures.JobQueueProperty)) - { - logger.LogError($"Current storage doesn't support specifying queues({queueName}) directly for a specific job. Please use the QueueAttribute instead."); - RecurringJob.AddOrUpdate( - recurringJobId, - adapter => adapter.DoWorkAsync(workerName, cancellationToken), - cronExpression, - new RecurringJobOptions - { - TimeZone = TimeZoneInfo.Utc - }); - } - else - { - RecurringJob.AddOrUpdate( - recurringJobId, - queueName, - adapter => adapter.DoWorkAsync(workerName, cancellationToken), - cronExpression, - new RecurringJobOptions - { - TimeZone = TimeZoneInfo.Utc - }); - } - - DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); - - return Task.CompletedTask; - } - - public override Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - - if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) - { - return Task.FromResult(false); - } - - var recurringJobId = $"DynamicWorker:{workerName}"; - RecurringJob.RemoveIfExists(recurringJobId); - DynamicBackgroundWorkerHandlerRegistry.Unregister(workerName); - - return Task.FromResult(true); - } - - public override Task UpdateScheduleAsync(string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - Check.NotNull(schedule, nameof(schedule)); - - schedule.Validate(); - - if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) - { - return Task.FromResult(false); - } - - var cronExpression = schedule.CronExpression; - if (cronExpression.IsNullOrWhiteSpace()) - { - var period = schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod; - cronExpression = GetCron(period); - } - - var abpHangfireOptions = ServiceProvider.GetRequiredService>().Value; - var queueName = abpHangfireOptions.DefaultQueue; - var recurringJobId = $"DynamicWorker:{workerName}"; - - if (!JobStorage.Current.HasFeature(JobStorageFeatures.JobQueueProperty)) - { - RecurringJob.AddOrUpdate( - recurringJobId, - adapter => adapter.DoWorkAsync(workerName, cancellationToken), - cronExpression, - new RecurringJobOptions - { - TimeZone = TimeZoneInfo.Utc - }); - } - else - { - RecurringJob.AddOrUpdate( - recurringJobId, - queueName, - adapter => adapter.DoWorkAsync(workerName, cancellationToken), - cronExpression, - new RecurringJobOptions - { - TimeZone = TimeZoneInfo.Utc - }); - } - - return Task.FromResult(true); - } - private static readonly MethodInfo? GetRecurringJobIdMethodInfo = typeof(RecurringJob).GetMethod("GetRecurringJobId", BindingFlags.NonPublic | BindingFlags.Static); protected virtual string? GetRecurringJobId(IBackgroundWorker worker, Expression> methodCall) { diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerAdapter.cs index 6ae84da915..9e6d5f2f0c 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerAdapter.cs @@ -1,31 +1,48 @@ using System; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Volo.Abp.DependencyInjection; +using Volo.Abp.ExceptionHandling; namespace Volo.Abp.BackgroundWorkers.Hangfire; public class HangfireDynamicBackgroundWorkerAdapter : ITransientDependency { - protected IDynamicBackgroundWorkerHandlerRegistry DynamicBackgroundWorkerHandlerRegistry { get; } + protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; } protected IServiceProvider ServiceProvider { get; } + public ILogger Logger { get; set; } public HangfireDynamicBackgroundWorkerAdapter( - IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry, + IDynamicBackgroundWorkerHandlerRegistry handlerRegistry, IServiceProvider serviceProvider) { - DynamicBackgroundWorkerHandlerRegistry = dynamicBackgroundWorkerHandlerRegistry; + HandlerRegistry = handlerRegistry; ServiceProvider = serviceProvider; + Logger = NullLogger.Instance; } public virtual async Task DoWorkAsync(string workerName, CancellationToken cancellationToken = default) { - var handler = DynamicBackgroundWorkerHandlerRegistry.Get(workerName); + var handler = HandlerRegistry.Get(workerName); if (handler == null) { + Logger.LogWarning("No handler registered for dynamic worker: {WorkerName}", workerName); return; } - await handler(new DynamicBackgroundWorkerExecutionContext(workerName, ServiceProvider), cancellationToken); + try + { + await handler(new DynamicBackgroundWorkerExecutionContext(workerName, ServiceProvider), cancellationToken); + } + catch (Exception ex) + { + await ServiceProvider.GetRequiredService() + .NotifyAsync(new ExceptionNotificationContext(ex)); + + throw; + } } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs new file mode 100644 index 0000000000..53820d0522 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs @@ -0,0 +1,168 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Hangfire; +using Hangfire.Storage; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Hangfire; + +namespace Volo.Abp.BackgroundWorkers.Hangfire; + +[Dependency(ReplaceServices = true)] +public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerManager, ISingletonDependency +{ + protected IServiceProvider ServiceProvider { get; } + protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; } + public ILogger Logger { get; set; } + + public HangfireDynamicBackgroundWorkerManager( + IServiceProvider serviceProvider, + IDynamicBackgroundWorkerHandlerRegistry handlerRegistry) + { + ServiceProvider = serviceProvider; + HandlerRegistry = handlerRegistry; + Logger = NullLogger.Instance; + } + + public virtual Task AddAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + Func handler, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + Check.NotNull(handler, nameof(handler)); + + schedule.Validate(); + + var cronExpression = schedule.CronExpression; + if (cronExpression.IsNullOrWhiteSpace()) + { + var period = schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod; + cronExpression = GetCron(period); + } + + ScheduleRecurringJob(workerName, cronExpression, cancellationToken); + HandlerRegistry.Register(workerName, handler); + + return Task.CompletedTask; + } + + public virtual Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + + if (!HandlerRegistry.IsRegistered(workerName)) + { + return Task.FromResult(false); + } + + var recurringJobId = $"DynamicWorker:{workerName}"; + RecurringJob.RemoveIfExists(recurringJobId); + HandlerRegistry.Unregister(workerName); + + return Task.FromResult(true); + } + + public virtual Task UpdateScheduleAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + + schedule.Validate(); + + if (!HandlerRegistry.IsRegistered(workerName)) + { + return Task.FromResult(false); + } + + var cronExpression = schedule.CronExpression; + if (cronExpression.IsNullOrWhiteSpace()) + { + var period = schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod; + cronExpression = GetCron(period); + } + + ScheduleRecurringJob(workerName, cronExpression, cancellationToken); + + return Task.FromResult(true); + } + + public virtual bool IsRegistered(string workerName) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + return HandlerRegistry.IsRegistered(workerName); + } + + protected virtual void ScheduleRecurringJob(string workerName, string cronExpression, CancellationToken cancellationToken) + { + var abpHangfireOptions = ServiceProvider.GetRequiredService>().Value; + var queueName = abpHangfireOptions.DefaultQueue; + var recurringJobId = $"DynamicWorker:{workerName}"; + + if (!JobStorage.Current.HasFeature(JobStorageFeatures.JobQueueProperty)) + { + Logger.LogWarning( + "Current storage doesn't support specifying queues ({QueueName}) directly for a specific job. Please use the QueueAttribute instead.", + queueName); + + RecurringJob.AddOrUpdate( + recurringJobId, + adapter => adapter.DoWorkAsync(workerName, cancellationToken), + cronExpression, + new RecurringJobOptions + { + TimeZone = TimeZoneInfo.Utc + }); + } + else + { + RecurringJob.AddOrUpdate( + recurringJobId, + queueName, + adapter => adapter.DoWorkAsync(workerName, cancellationToken), + cronExpression, + new RecurringJobOptions + { + TimeZone = TimeZoneInfo.Utc + }); + } + } + + protected virtual string GetCron(int period) + { + var time = TimeSpan.FromMilliseconds(period); + string cron; + + if (time.TotalSeconds <= 59) + { + cron = $"*/{time.TotalSeconds} * * * * *"; + } + else if (time.TotalMinutes <= 59) + { + cron = $"*/{time.TotalMinutes} * * * *"; + } + else if (time.TotalHours <= 23) + { + cron = $"0 */{time.TotalHours} * * *"; + } + else if (time.TotalDays <= 31) + { + cron = $"0 0 0 1/{time.TotalDays} * *"; + } + else + { + throw new AbpException($"Cannot convert period: {period} to cron expression."); + } + + return cron; + } +} 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 d963106e02..9854379c79 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 @@ -1,7 +1,6 @@ using System; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; using Quartz; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; @@ -11,15 +10,9 @@ namespace Volo.Abp.BackgroundWorkers.Quartz; [Dependency(ReplaceServices = true)] public class QuartzBackgroundWorkerManager : BackgroundWorkerManager, ISingletonDependency { - public const string DynamicWorkerNameKey = "AbpDynamicWorkerName"; - protected IScheduler Scheduler { get; } - public QuartzBackgroundWorkerManager( - IScheduler scheduler, - IServiceProvider serviceProvider, - IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry) - : base(serviceProvider, dynamicBackgroundWorkerHandlerRegistry) + public QuartzBackgroundWorkerManager(IScheduler scheduler) { Scheduler = scheduler; } @@ -103,130 +96,4 @@ public class QuartzBackgroundWorkerManager : BackgroundWorkerManager, ISingleton await Scheduler.ScheduleJob(quartzWork.JobDetail, quartzWork.Trigger, cancellationToken); } } - - public override Task AddAsync( - string workerName, - Func handler, - CancellationToken cancellationToken = default) - { - return AddAsync( - workerName, - new DynamicBackgroundWorkerSchedule - { - Period = DynamicBackgroundWorkerSchedule.DefaultPeriod - }, - handler, - cancellationToken - ); - } - - public override async Task AddAsync( - string workerName, - DynamicBackgroundWorkerSchedule schedule, - Func handler, - CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - Check.NotNull(schedule, nameof(schedule)); - Check.NotNull(handler, nameof(handler)); - - schedule.Validate(); - - if (schedule.Period == null && schedule.CronExpression.IsNullOrWhiteSpace()) - { - throw new AbpException($"Both 'Period' and 'CronExpression' are not set for dynamic worker {workerName}. You must set at least one of them."); - } - - var jobKey = new JobKey($"DynamicWorker:{workerName}"); - var triggerKey = new TriggerKey($"DynamicWorker:{workerName}"); - var jobDetail = JobBuilder.Create() - .WithIdentity(jobKey) - .UsingJobData(DynamicWorkerNameKey, workerName) - .Build(); - - var triggerBuilder = TriggerBuilder.Create() - .ForJob(jobDetail) - .WithIdentity(triggerKey); - - if (!schedule.CronExpression.IsNullOrWhiteSpace()) - { - triggerBuilder.WithCronSchedule(schedule.CronExpression); - } - else - { - triggerBuilder.WithSimpleSchedule(builder => - builder.WithInterval(TimeSpan.FromMilliseconds(schedule.Period!.Value)).RepeatForever()); - } - - var trigger = triggerBuilder.Build(); - - if (await Scheduler.CheckExists(jobDetail.Key, cancellationToken)) - { - await Scheduler.AddJob(jobDetail, true, true, cancellationToken); - await Scheduler.ResumeJob(jobDetail.Key, cancellationToken); - await Scheduler.RescheduleJob(trigger.Key, trigger, cancellationToken); - } - else - { - await Scheduler.ScheduleJob(jobDetail, trigger, cancellationToken); - } - - DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); - } - - public override async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - - if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) - { - return false; - } - - var jobKey = new JobKey($"DynamicWorker:{workerName}"); - var deleted = await Scheduler.DeleteJob(jobKey, cancellationToken); - if (deleted) - { - DynamicBackgroundWorkerHandlerRegistry.Unregister(workerName); - } - - return deleted; - } - - public override async Task UpdateScheduleAsync(string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - Check.NotNull(schedule, nameof(schedule)); - - schedule.Validate(); - - if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) - { - return false; - } - - if (schedule.Period == null && schedule.CronExpression.IsNullOrWhiteSpace()) - { - throw new AbpException($"Both 'Period' and 'CronExpression' are not set for dynamic worker {workerName}. You must set at least one of them."); - } - - var triggerKey = new TriggerKey($"DynamicWorker:{workerName}"); - var triggerBuilder = TriggerBuilder.Create() - .WithIdentity(triggerKey) - .ForJob(new JobKey($"DynamicWorker:{workerName}")); - - if (!schedule.CronExpression.IsNullOrWhiteSpace()) - { - triggerBuilder.WithCronSchedule(schedule.CronExpression); - } - else - { - triggerBuilder.WithSimpleSchedule(builder => - builder.WithInterval(TimeSpan.FromMilliseconds(schedule.Period!.Value)).RepeatForever()); - } - - var result = await Scheduler.RescheduleJob(triggerKey, triggerBuilder.Build(), cancellationToken); - - return result != null; - } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs index f0c9e09ad8..ba8d98091f 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs @@ -1,41 +1,56 @@ using System; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Quartz; using Volo.Abp.DependencyInjection; +using Volo.Abp.ExceptionHandling; namespace Volo.Abp.BackgroundWorkers.Quartz; public class QuartzDynamicBackgroundWorkerAdapter : IJob, ITransientDependency { - protected IDynamicBackgroundWorkerHandlerRegistry DynamicBackgroundWorkerHandlerRegistry { get; } + protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; } protected IServiceProvider ServiceProvider { get; } + public ILogger Logger { get; set; } public QuartzDynamicBackgroundWorkerAdapter( - IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry, + IDynamicBackgroundWorkerHandlerRegistry handlerRegistry, IServiceProvider serviceProvider) { - DynamicBackgroundWorkerHandlerRegistry = dynamicBackgroundWorkerHandlerRegistry; + HandlerRegistry = handlerRegistry; ServiceProvider = serviceProvider; + Logger = NullLogger.Instance; } public virtual async Task Execute(IJobExecutionContext context) { - var workerName = context.MergedJobDataMap.GetString(QuartzBackgroundWorkerManager.DynamicWorkerNameKey); + var workerName = context.MergedJobDataMap.GetString(QuartzDynamicBackgroundWorkerManager.DynamicWorkerNameKey); if (string.IsNullOrWhiteSpace(workerName)) { return; } - var nonNullWorkerName = workerName!; - var handler = DynamicBackgroundWorkerHandlerRegistry.Get(nonNullWorkerName); + var handler = HandlerRegistry.Get(workerName!); if (handler == null) { + Logger.LogWarning("No handler registered for dynamic worker: {WorkerName}", workerName); return; } - await handler( - new DynamicBackgroundWorkerExecutionContext(nonNullWorkerName, ServiceProvider), - context.CancellationToken - ); + try + { + await handler( + new DynamicBackgroundWorkerExecutionContext(workerName!, ServiceProvider), + context.CancellationToken); + } + catch (Exception ex) + { + await ServiceProvider.GetRequiredService() + .NotifyAsync(new ExceptionNotificationContext(ex)); + + throw; + } } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs new file mode 100644 index 0000000000..57fdda79eb --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs @@ -0,0 +1,143 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Quartz; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BackgroundWorkers.Quartz; + +[Dependency(ReplaceServices = true)] +public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerManager, ISingletonDependency +{ + public const string DynamicWorkerNameKey = "AbpDynamicWorkerName"; + + protected IScheduler Scheduler { get; } + protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; } + public ILogger Logger { get; set; } + + public QuartzDynamicBackgroundWorkerManager( + IScheduler scheduler, + IDynamicBackgroundWorkerHandlerRegistry handlerRegistry) + { + Scheduler = scheduler; + HandlerRegistry = handlerRegistry; + Logger = NullLogger.Instance; + } + + public virtual async Task AddAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + Func handler, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + Check.NotNull(handler, nameof(handler)); + + schedule.Validate(); + + var jobKey = new JobKey($"DynamicWorker:{workerName}"); + var triggerKey = new TriggerKey($"DynamicWorker:{workerName}"); + var jobDetail = JobBuilder.Create() + .WithIdentity(jobKey) + .UsingJobData(DynamicWorkerNameKey, workerName) + .Build(); + + var trigger = BuildTrigger(schedule, jobDetail, triggerKey); + + if (await Scheduler.CheckExists(jobDetail.Key, cancellationToken)) + { + await Scheduler.AddJob(jobDetail, true, true, cancellationToken); + await Scheduler.ResumeJob(jobDetail.Key, cancellationToken); + await Scheduler.RescheduleJob(trigger.Key, trigger, cancellationToken); + } + else + { + await Scheduler.ScheduleJob(jobDetail, trigger, cancellationToken); + } + + HandlerRegistry.Register(workerName, handler); + } + + public virtual async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + + if (!HandlerRegistry.IsRegistered(workerName)) + { + return false; + } + + var jobKey = new JobKey($"DynamicWorker:{workerName}"); + var deleted = await Scheduler.DeleteJob(jobKey, cancellationToken); + if (deleted) + { + HandlerRegistry.Unregister(workerName); + } + + return deleted; + } + + public virtual async Task UpdateScheduleAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + + schedule.Validate(); + + if (!HandlerRegistry.IsRegistered(workerName)) + { + return false; + } + + var triggerKey = new TriggerKey($"DynamicWorker:{workerName}"); + var jobKey = new JobKey($"DynamicWorker:{workerName}"); + + var triggerBuilder = TriggerBuilder.Create() + .WithIdentity(triggerKey) + .ForJob(jobKey); + + if (!schedule.CronExpression.IsNullOrWhiteSpace()) + { + triggerBuilder.WithCronSchedule(schedule.CronExpression); + } + else + { + triggerBuilder.WithSimpleSchedule(builder => + builder.WithInterval(TimeSpan.FromMilliseconds(schedule.Period!.Value)).RepeatForever()); + } + + var result = await Scheduler.RescheduleJob(triggerKey, triggerBuilder.Build(), cancellationToken); + return result != null; + } + + public virtual bool IsRegistered(string workerName) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + return HandlerRegistry.IsRegistered(workerName); + } + + protected virtual ITrigger BuildTrigger(DynamicBackgroundWorkerSchedule schedule, IJobDetail jobDetail, TriggerKey triggerKey) + { + var triggerBuilder = TriggerBuilder.Create() + .ForJob(jobDetail) + .WithIdentity(triggerKey); + + if (!schedule.CronExpression.IsNullOrWhiteSpace()) + { + triggerBuilder.WithCronSchedule(schedule.CronExpression); + } + else + { + triggerBuilder.WithSimpleSchedule(builder => + builder.WithInterval(TimeSpan.FromMilliseconds(schedule.Period!.Value)).RepeatForever()); + } + + return triggerBuilder.Build(); + } +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs index 1fbe1c8ad0..cc6c847197 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQBackgroundWorkerManager.cs @@ -1,11 +1,8 @@ using System; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using TickerQ.Utilities.Entities; using TickerQ.Utilities.Enums; -using TickerQ.Utilities.Interfaces.Managers; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; using Volo.Abp.TickerQ; @@ -17,21 +14,15 @@ public class AbpTickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingl { protected AbpTickerQFunctionProvider AbpTickerQFunctionProvider { get; } protected AbpTickerQBackgroundWorkersProvider AbpTickerQBackgroundWorkersProvider { get; } - protected ICronTickerManager CronTickerManager { get; } protected AbpBackgroundWorkersTickerQOptions Options { get; } public AbpTickerQBackgroundWorkerManager( AbpTickerQFunctionProvider abpTickerQFunctionProvider, AbpTickerQBackgroundWorkersProvider abpTickerQBackgroundWorkersProvider, - ICronTickerManager cronTickerManager, - IServiceProvider serviceProvider, - IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry, IOptions options) - : base(serviceProvider, dynamicBackgroundWorkerHandlerRegistry) { AbpTickerQFunctionProvider = abpTickerQFunctionProvider; AbpTickerQBackgroundWorkersProvider = abpTickerQBackgroundWorkersProvider; - CronTickerManager = cronTickerManager; Options = options.Value; } @@ -79,114 +70,6 @@ public class AbpTickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingl await base.AddAsync(worker, cancellationToken); } - public override Task AddAsync( - string workerName, - Func handler, - CancellationToken cancellationToken = default) - { - return AddAsync( - workerName, - new DynamicBackgroundWorkerSchedule - { - Period = DynamicBackgroundWorkerSchedule.DefaultPeriod - }, - handler, - cancellationToken - ); - } - - public override async Task AddAsync( - string workerName, - DynamicBackgroundWorkerSchedule schedule, - Func handler, - CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - Check.NotNull(schedule, nameof(schedule)); - Check.NotNull(handler, nameof(handler)); - - schedule.Validate(); - - var cronExpression = schedule.CronExpression ?? GetCron(schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod); - var functionName = $"DynamicWorker:{workerName}"; - - AbpTickerQFunctionProvider.Functions[functionName] = - (string.Empty, TickerTaskPriority.LongRunning, async (tickerCancellationToken, serviceProvider, _) => - { - var registeredHandler = DynamicBackgroundWorkerHandlerRegistry.Get(workerName); - if (registeredHandler == null) - { - return; - } - - await registeredHandler( - new DynamicBackgroundWorkerExecutionContext(workerName, serviceProvider), - tickerCancellationToken - ); - }); - - AbpTickerQBackgroundWorkersProvider.BackgroundWorkers[functionName] = new AbpTickerQCronBackgroundWorker - { - Function = functionName, - CronExpression = cronExpression, - WorkerType = typeof(AbpTickerQBackgroundWorkerManager) - }; - - await CronTickerManager.AddAsync(new CronTickerEntity - { - Function = functionName, - Expression = cronExpression - }); - - DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); - } - - public override Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - - if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) - { - return Task.FromResult(false); - } - - var functionName = $"DynamicWorker:{workerName}"; - AbpTickerQFunctionProvider.Functions.Remove(functionName); - AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.Remove(functionName); - DynamicBackgroundWorkerHandlerRegistry.Unregister(workerName); - - return Task.FromResult(true); - } - - public override async Task UpdateScheduleAsync(string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - Check.NotNull(schedule, nameof(schedule)); - - schedule.Validate(); - - if (!DynamicBackgroundWorkerHandlerRegistry.IsRegistered(workerName)) - { - return false; - } - - var cronExpression = schedule.CronExpression ?? GetCron(schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod); - var functionName = $"DynamicWorker:{workerName}"; - - if (AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.TryGetValue(functionName, out var existingWorker)) - { - existingWorker.CronExpression = cronExpression; - } - - await CronTickerManager.AddAsync(new CronTickerEntity - { - Function = functionName, - Expression = cronExpression - }); - - return true; - } - protected virtual string GetCron(int period) { var time = TimeSpan.FromMilliseconds(period); diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs new file mode 100644 index 0000000000..efe8f3eebf --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs @@ -0,0 +1,164 @@ +using System; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using TickerQ.Utilities.Entities; +using TickerQ.Utilities.Enums; +using TickerQ.Utilities.Interfaces.Managers; +using Volo.Abp.DependencyInjection; +using Volo.Abp.TickerQ; + +namespace Volo.Abp.BackgroundWorkers.TickerQ; + +[Dependency(ReplaceServices = true)] +public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerManager, ISingletonDependency +{ + protected AbpTickerQFunctionProvider AbpTickerQFunctionProvider { get; } + protected AbpTickerQBackgroundWorkersProvider AbpTickerQBackgroundWorkersProvider { get; } + protected ICronTickerManager CronTickerManager { get; } + protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; } + public ILogger Logger { get; set; } + + public TickerQDynamicBackgroundWorkerManager( + AbpTickerQFunctionProvider abpTickerQFunctionProvider, + AbpTickerQBackgroundWorkersProvider abpTickerQBackgroundWorkersProvider, + ICronTickerManager cronTickerManager, + IDynamicBackgroundWorkerHandlerRegistry handlerRegistry) + { + AbpTickerQFunctionProvider = abpTickerQFunctionProvider; + AbpTickerQBackgroundWorkersProvider = abpTickerQBackgroundWorkersProvider; + CronTickerManager = cronTickerManager; + HandlerRegistry = handlerRegistry; + Logger = NullLogger.Instance; + } + + public virtual async Task AddAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + Func handler, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + Check.NotNull(handler, nameof(handler)); + + schedule.Validate(); + + var cronExpression = schedule.CronExpression ?? GetCron(schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod); + var functionName = $"DynamicWorker:{workerName}"; + + AbpTickerQFunctionProvider.Functions[functionName] = + (string.Empty, TickerTaskPriority.LongRunning, async (tickerCancellationToken, serviceProvider, _) => + { + var registeredHandler = HandlerRegistry.Get(workerName); + if (registeredHandler == null) + { + return; + } + + await registeredHandler( + new DynamicBackgroundWorkerExecutionContext(workerName, serviceProvider), + tickerCancellationToken); + }, 0); + + AbpTickerQBackgroundWorkersProvider.BackgroundWorkers[functionName] = new AbpTickerQCronBackgroundWorker + { + Function = functionName, + CronExpression = cronExpression, + WorkerType = typeof(TickerQDynamicBackgroundWorkerManager) + }; + + await CronTickerManager.AddAsync(new CronTickerEntity + { + Function = functionName, + Expression = cronExpression + }); + + HandlerRegistry.Register(workerName, handler); + } + + public virtual Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + + if (!HandlerRegistry.IsRegistered(workerName)) + { + return Task.FromResult(false); + } + + var functionName = $"DynamicWorker:{workerName}"; + AbpTickerQFunctionProvider.Functions.Remove(functionName); + AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.Remove(functionName); + HandlerRegistry.Unregister(workerName); + + return Task.FromResult(true); + } + + public virtual async Task UpdateScheduleAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + + schedule.Validate(); + + if (!HandlerRegistry.IsRegistered(workerName)) + { + return false; + } + + var cronExpression = schedule.CronExpression ?? GetCron(schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod); + var functionName = $"DynamicWorker:{workerName}"; + + if (AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.TryGetValue(functionName, out var existingWorker)) + { + existingWorker.CronExpression = cronExpression; + } + + await CronTickerManager.AddAsync(new CronTickerEntity + { + Function = functionName, + Expression = cronExpression + }); + + return true; + } + + public virtual bool IsRegistered(string workerName) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + return HandlerRegistry.IsRegistered(workerName); + } + + protected virtual string GetCron(int period) + { + var time = TimeSpan.FromMilliseconds(period); + if (time.TotalMinutes < 1) + { + return "* * * * *"; + } + + if (time.TotalMinutes < 60) + { + var minutes = (int)Math.Round(time.TotalMinutes); + return $"*/{minutes} * * * *"; + } + + if (time.TotalHours < 24) + { + var hours = (int)Math.Round(time.TotalHours); + return $"0 */{hours} * * *"; + } + + if (time.TotalDays <= 31) + { + var days = (int)Math.Round(time.TotalDays); + return $"0 0 */{days} * *"; + } + + throw new AbpException($"Cannot convert period: {period} to cron expression."); + } +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs index 84640ff1bf..8d05ce1239 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/BackgroundWorkerManager.cs @@ -1,11 +1,8 @@ -using System; -using System.Collections.Concurrent; +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; -using Volo.Abp.Threading; namespace Volo.Abp.BackgroundWorkers; @@ -19,21 +16,13 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen private bool _isDisposed; private readonly List _backgroundWorkers; - private readonly ConcurrentDictionary _dynamicWorkers; - protected IServiceProvider ServiceProvider { get; } - protected IDynamicBackgroundWorkerHandlerRegistry DynamicBackgroundWorkerHandlerRegistry { get; } /// /// Initializes a new instance of the class. /// - public BackgroundWorkerManager( - IServiceProvider serviceProvider, - IDynamicBackgroundWorkerHandlerRegistry dynamicBackgroundWorkerHandlerRegistry) + public BackgroundWorkerManager() { _backgroundWorkers = new List(); - _dynamicWorkers = new ConcurrentDictionary(); - ServiceProvider = serviceProvider; - DynamicBackgroundWorkerHandlerRegistry = dynamicBackgroundWorkerHandlerRegistry; } public virtual async Task AddAsync(IBackgroundWorker worker, CancellationToken cancellationToken = default) @@ -46,127 +35,6 @@ public class BackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDepen } } - public virtual Task AddAsync( - string workerName, - Func handler, - CancellationToken cancellationToken = default) - { - return AddAsync( - workerName, - new DynamicBackgroundWorkerSchedule - { - Period = DynamicBackgroundWorkerSchedule.DefaultPeriod - }, - handler, - cancellationToken - ); - } - - public virtual async Task AddAsync( - string workerName, - DynamicBackgroundWorkerSchedule schedule, - Func handler, - CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - Check.NotNull(schedule, nameof(schedule)); - Check.NotNull(handler, nameof(handler)); - - schedule.Validate(); - - if (schedule.Period == null && !string.IsNullOrWhiteSpace(schedule.CronExpression)) - { - throw new AbpException("Default background worker manager does not support cron expression without period."); - } - - if (_dynamicWorkers.TryRemove(workerName, out var existingWorker)) - { - await existingWorker.StopAsync(cancellationToken); - _backgroundWorkers.Remove(existingWorker); - } - - DynamicBackgroundWorkerHandlerRegistry.Register(workerName, handler); - - var timer = ServiceProvider.GetRequiredService(); - var serviceScopeFactory = ServiceProvider.GetRequiredService(); - var worker = new InMemoryDynamicBackgroundWorker( - workerName, - schedule, - timer, - serviceScopeFactory, - DynamicBackgroundWorkerHandlerRegistry - ); - worker.ServiceProvider = ServiceProvider; - worker.LazyServiceProvider = ServiceProvider.GetRequiredService(); - - _dynamicWorkers[workerName] = worker; - - await AddAsync(worker, cancellationToken); - } - - public virtual async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - - if (!_dynamicWorkers.TryGetValue(workerName, out var worker)) - { - return false; - } - - await worker.StopAsync(cancellationToken); - _backgroundWorkers.Remove(worker); - _dynamicWorkers.TryRemove(workerName, out _); - DynamicBackgroundWorkerHandlerRegistry.Unregister(workerName); - - return true; - } - - public virtual async Task UpdateScheduleAsync(string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default) - { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - Check.NotNull(schedule, nameof(schedule)); - - schedule.Validate(); - - if (!_dynamicWorkers.TryGetValue(workerName, out var oldWorker)) - { - return false; - } - - if (schedule.Period == null && !string.IsNullOrWhiteSpace(schedule.CronExpression)) - { - throw new AbpException("Default background worker manager does not support cron expression without period."); - } - - var handler = DynamicBackgroundWorkerHandlerRegistry.Get(workerName); - if (handler == null) - { - return false; - } - - await oldWorker.StopAsync(cancellationToken); - _backgroundWorkers.Remove(oldWorker); - _dynamicWorkers.TryRemove(workerName, out _); - - var timer = ServiceProvider.GetRequiredService(); - var serviceScopeFactory = ServiceProvider.GetRequiredService(); - var newWorker = new InMemoryDynamicBackgroundWorker( - workerName, - schedule, - timer, - serviceScopeFactory, - DynamicBackgroundWorkerHandlerRegistry - ); - newWorker.ServiceProvider = ServiceProvider; - newWorker.LazyServiceProvider = ServiceProvider.GetRequiredService(); - - _dynamicWorkers[workerName] = newWorker; - - await AddAsync(newWorker, cancellationToken); - - return true; - } - public virtual void Dispose() { if (_isDisposed) diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs new file mode 100644 index 0000000000..3d239215dc --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs @@ -0,0 +1,144 @@ +using System; +using System.Collections.Concurrent; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; + +namespace Volo.Abp.BackgroundWorkers; + +public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerManager, ISingletonDependency, IDisposable +{ + protected IServiceProvider ServiceProvider { get; } + public ILogger Logger { get; set; } + + private readonly ConcurrentDictionary _dynamicWorkers; + private bool _isDisposed; + + public DefaultDynamicBackgroundWorkerManager(IServiceProvider serviceProvider) + { + ServiceProvider = serviceProvider; + Logger = NullLogger.Instance; + _dynamicWorkers = new ConcurrentDictionary(); + } + + public virtual async Task AddAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + Func handler, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + Check.NotNull(handler, nameof(handler)); + + schedule.Validate(); + + if (schedule.Period == null && !string.IsNullOrWhiteSpace(schedule.CronExpression)) + { + throw new AbpException( + $"The default in-memory background worker manager does not support CronExpression without Period for dynamic worker '{workerName}'. " + + "Please set Period, or use a scheduler-backed provider (Hangfire, Quartz, TickerQ)."); + } + + if (_dynamicWorkers.TryRemove(workerName, out var existingWorker)) + { + await existingWorker.StopAsync(cancellationToken); + Logger.LogInformation("Replaced existing dynamic worker: {WorkerName}", workerName); + } + + var worker = CreateDynamicWorker(workerName, schedule, handler); + _dynamicWorkers[workerName] = worker; + + await worker.StartAsync(cancellationToken); + } + + public virtual async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + + if (!_dynamicWorkers.TryRemove(workerName, out var worker)) + { + return false; + } + + await worker.StopAsync(cancellationToken); + return true; + } + + public virtual Task UpdateScheduleAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + CancellationToken cancellationToken = default) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + Check.NotNull(schedule, nameof(schedule)); + + schedule.Validate(); + + if (schedule.Period == null && !string.IsNullOrWhiteSpace(schedule.CronExpression)) + { + throw new AbpException( + $"The default in-memory background worker manager does not support CronExpression without Period for dynamic worker '{workerName}'. " + + "Please set Period, or use a scheduler-backed provider (Hangfire, Quartz, TickerQ)."); + } + + if (!_dynamicWorkers.TryGetValue(workerName, out var worker)) + { + return Task.FromResult(false); + } + + worker.UpdateSchedule(schedule); + return Task.FromResult(true); + } + + public virtual bool IsRegistered(string workerName) + { + Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); + return _dynamicWorkers.ContainsKey(workerName); + } + + public virtual void Dispose() + { + if (_isDisposed) + { + return; + } + + _isDisposed = true; + + foreach (var kvp in _dynamicWorkers) + { + try + { + kvp.Value.StopAsync(CancellationToken.None).GetAwaiter().GetResult(); + } + catch (Exception ex) + { + Logger.LogException(ex); + } + } + + _dynamicWorkers.Clear(); + } + + protected virtual InMemoryDynamicBackgroundWorker CreateDynamicWorker( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + Func handler) + { + var timer = ServiceProvider.GetRequiredService(); + var serviceScopeFactory = ServiceProvider.GetRequiredService(); + + var worker = new InMemoryDynamicBackgroundWorker( + workerName, schedule, handler, timer, serviceScopeFactory); + + worker.ServiceProvider = ServiceProvider; + worker.LazyServiceProvider = ServiceProvider.GetRequiredService(); + + return worker; + } +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManagerExtensions.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManagerExtensions.cs new file mode 100644 index 0000000000..498a37e28b --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManagerExtensions.cs @@ -0,0 +1,27 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Volo.Abp.BackgroundWorkers; + +public static class DynamicBackgroundWorkerManagerExtensions +{ + /// + /// Adds a dynamic worker with the default schedule (). + /// + public static Task AddAsync( + this IDynamicBackgroundWorkerManager manager, + string workerName, + Func handler, + CancellationToken cancellationToken = default) + { + return manager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule + { + Period = DynamicBackgroundWorkerSchedule.DefaultPeriod + }, + handler, + cancellationToken); + } +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerSchedule.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerSchedule.cs index 6698e2f170..6505492e44 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerSchedule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerSchedule.cs @@ -18,5 +18,11 @@ public class DynamicBackgroundWorkerSchedule $"Period must be greater than 0 when provided. Given value: {Period.Value}.", nameof(Period)); } + + if (Period == null && string.IsNullOrWhiteSpace(CronExpression)) + { + throw new ArgumentException( + "At least one of 'Period' or 'CronExpression' must be set."); + } } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs index eb22729d57..499524f7ca 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IBackgroundWorkerManager.cs @@ -1,5 +1,4 @@ -using System; -using System.Threading; +using System.Threading; using System.Threading.Tasks; using Volo.Abp.Threading; @@ -18,33 +17,4 @@ public interface IBackgroundWorkerManager : IRunnable /// /// Task AddAsync(IBackgroundWorker worker, CancellationToken cancellationToken = default); - - /// - /// Adds a dynamic worker by name and handler. - /// - Task AddAsync( - string workerName, - Func handler, - CancellationToken cancellationToken = default); - - /// - /// Adds a dynamic worker by name, schedule and handler. - /// - Task AddAsync( - string workerName, - DynamicBackgroundWorkerSchedule schedule, - Func handler, - CancellationToken cancellationToken = default); - - /// - /// Removes a previously added dynamic worker by name. - /// Returns true if the worker was found and removed; false otherwise. - /// - Task RemoveAsync(string workerName, CancellationToken cancellationToken = default); - - /// - /// Updates the schedule of a previously added dynamic worker. - /// Returns true if the worker was found and updated; false otherwise. - /// - Task UpdateScheduleAsync(string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default); } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs new file mode 100644 index 0000000000..317aa36433 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs @@ -0,0 +1,42 @@ +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Volo.Abp.BackgroundWorkers; + +/// +/// Manages dynamic background workers that are registered at runtime +/// without requiring a strongly-typed worker class. +/// +public interface IDynamicBackgroundWorkerManager +{ + /// + /// Adds a dynamic worker by name, schedule and handler. + /// If a worker with the same name already exists, it will be replaced. + /// + Task AddAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + Func handler, + CancellationToken cancellationToken = default); + + /// + /// Removes a previously added dynamic worker by name. + /// Returns true if the worker was found and removed; false otherwise. + /// + Task RemoveAsync(string workerName, CancellationToken cancellationToken = default); + + /// + /// Updates the schedule of a previously added dynamic worker. + /// Returns true if the worker was found and updated; false otherwise. + /// + Task UpdateScheduleAsync( + string workerName, + DynamicBackgroundWorkerSchedule schedule, + CancellationToken cancellationToken = default); + + /// + /// Checks whether a dynamic worker with the given name is registered. + /// + bool IsRegistered(string workerName); +} diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs index 7d5cb4dd7f..5001e96ff4 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs @@ -1,3 +1,5 @@ +using System; +using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; @@ -7,34 +9,45 @@ namespace Volo.Abp.BackgroundWorkers; public class InMemoryDynamicBackgroundWorker : AsyncPeriodicBackgroundWorkerBase { - protected string WorkerName { get; } - protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; } + public string WorkerName { get; } + + private readonly Func _handler; public InMemoryDynamicBackgroundWorker( string workerName, DynamicBackgroundWorkerSchedule schedule, + Func handler, AbpAsyncTimer timer, - IServiceScopeFactory serviceScopeFactory, - IDynamicBackgroundWorkerHandlerRegistry handlerRegistry) + IServiceScopeFactory serviceScopeFactory) : base(timer, serviceScopeFactory) { WorkerName = Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); Check.NotNull(schedule, nameof(schedule)); - HandlerRegistry = Check.NotNull(handlerRegistry, nameof(handlerRegistry)); + _handler = Check.NotNull(handler, nameof(handler)); Timer.Period = schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod; CronExpression = schedule.CronExpression; } + public virtual void UpdateSchedule(DynamicBackgroundWorkerSchedule schedule) + { + Check.NotNull(schedule, nameof(schedule)); + + Timer.Stop(); + Timer.Period = schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod; + CronExpression = schedule.CronExpression; + Timer.Start(StartCancellationToken); + } + protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext) { - var handler = HandlerRegistry.Get(WorkerName); - if (handler == null) - { - Logger.LogWarning("No dynamic background worker handler registered for: {WorkerName}", WorkerName); - return; - } - - await handler(new DynamicBackgroundWorkerExecutionContext(WorkerName, workerContext.ServiceProvider), workerContext.CancellationToken); + await _handler( + new DynamicBackgroundWorkerExecutionContext(WorkerName, workerContext.ServiceProvider), + workerContext.CancellationToken); + } + + public override string ToString() + { + return $"DynamicWorker:{WorkerName}"; } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs index acece7fd4b..2c3f8414e6 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs @@ -9,21 +9,19 @@ namespace Volo.Abp.BackgroundJobs; public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase { - private readonly IBackgroundWorkerManager _backgroundWorkerManager; - private readonly IDynamicBackgroundWorkerHandlerRegistry _handlerRegistry; + private readonly IDynamicBackgroundWorkerManager _dynamicWorkerManager; public DynamicBackgroundWorkerManager_Tests() { - _backgroundWorkerManager = GetRequiredService(); - _handlerRegistry = GetRequiredService(); + _dynamicWorkerManager = GetRequiredService(); } [Fact] - public async Task Should_Register_Dynamic_Handler_When_Added() + public async Task Should_Register_Dynamic_Worker() { var workerName = "dynamic-worker-" + Guid.NewGuid(); - await _backgroundWorkerManager.AddAsync( + await _dynamicWorkerManager.AddAsync( workerName, new DynamicBackgroundWorkerSchedule { @@ -32,7 +30,7 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase (_, _) => Task.CompletedTask ); - _handlerRegistry.IsRegistered(workerName).ShouldBeTrue(); + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeTrue(); } [Fact] @@ -41,7 +39,7 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase var workerName = "dynamic-worker-" + Guid.NewGuid(); var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - await _backgroundWorkerManager.AddAsync( + await _dynamicWorkerManager.AddAsync( workerName, new DynamicBackgroundWorkerSchedule { @@ -63,12 +61,25 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase (await tcs.Task).ShouldBeTrue(); } + [Fact] + public async Task Should_Add_Dynamic_Worker_With_Default_Schedule() + { + var workerName = "dynamic-worker-" + Guid.NewGuid(); + + await _dynamicWorkerManager.AddAsync( + workerName, + (_, _) => Task.CompletedTask + ); + + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeTrue(); + } + [Fact] public async Task Should_Remove_Dynamic_Worker() { var workerName = "dynamic-worker-" + Guid.NewGuid(); - await _backgroundWorkerManager.AddAsync( + await _dynamicWorkerManager.AddAsync( workerName, new DynamicBackgroundWorkerSchedule { @@ -77,17 +88,17 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase (_, _) => Task.CompletedTask ); - _handlerRegistry.IsRegistered(workerName).ShouldBeTrue(); + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeTrue(); - var result = await _backgroundWorkerManager.RemoveAsync(workerName); + var result = await _dynamicWorkerManager.RemoveAsync(workerName); result.ShouldBeTrue(); - _handlerRegistry.IsRegistered(workerName).ShouldBeFalse(); + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeFalse(); } [Fact] public async Task Should_Return_False_When_Removing_NonExistent_Worker() { - var result = await _backgroundWorkerManager.RemoveAsync("non-existent-worker-" + Guid.NewGuid()); + var result = await _dynamicWorkerManager.RemoveAsync("non-existent-worker-" + Guid.NewGuid()); result.ShouldBeFalse(); } @@ -97,7 +108,7 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase var workerName = "dynamic-worker-" + Guid.NewGuid(); var executionCount = 0; - await _backgroundWorkerManager.AddAsync( + await _dynamicWorkerManager.AddAsync( workerName, new DynamicBackgroundWorkerSchedule { @@ -110,7 +121,7 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase } ); - var result = await _backgroundWorkerManager.UpdateScheduleAsync( + var result = await _dynamicWorkerManager.UpdateScheduleAsync( workerName, new DynamicBackgroundWorkerSchedule { @@ -119,7 +130,7 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase ); result.ShouldBeTrue(); - _handlerRegistry.IsRegistered(workerName).ShouldBeTrue(); + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeTrue(); var timeout = TimeSpan.FromSeconds(5); var startTime = DateTime.UtcNow; @@ -134,7 +145,7 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase [Fact] public async Task Should_Return_False_When_Updating_NonExistent_Worker() { - var result = await _backgroundWorkerManager.UpdateScheduleAsync( + var result = await _dynamicWorkerManager.UpdateScheduleAsync( "non-existent-worker-" + Guid.NewGuid(), new DynamicBackgroundWorkerSchedule { Period = 1000 } ); @@ -146,20 +157,15 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase public async Task Should_Replace_Existing_Worker_When_Same_Name_Added() { var workerName = "dynamic-worker-" + Guid.NewGuid(); - var firstHandlerCalled = false; var secondHandlerTcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); - await _backgroundWorkerManager.AddAsync( + await _dynamicWorkerManager.AddAsync( workerName, new DynamicBackgroundWorkerSchedule { Period = 60000 }, - (_, _) => - { - firstHandlerCalled = true; - return Task.CompletedTask; - } + (_, _) => Task.CompletedTask ); - await _backgroundWorkerManager.AddAsync( + await _dynamicWorkerManager.AddAsync( workerName, new DynamicBackgroundWorkerSchedule { Period = 50 }, (_, _) => @@ -173,11 +179,11 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase completedTask.ShouldBe(secondHandlerTcs.Task); (await secondHandlerTcs.Task).ShouldBeTrue(); - _handlerRegistry.IsRegistered(workerName).ShouldBeTrue(); + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeTrue(); - var removed = await _backgroundWorkerManager.RemoveAsync(workerName); + var removed = await _dynamicWorkerManager.RemoveAsync(workerName); removed.ShouldBeTrue(); - _handlerRegistry.IsRegistered(workerName).ShouldBeFalse(); + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeFalse(); } [Fact] @@ -187,7 +193,7 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase await Assert.ThrowsAsync(async () => { - await _backgroundWorkerManager.AddAsync( + await _dynamicWorkerManager.AddAsync( workerName, new DynamicBackgroundWorkerSchedule { Period = 0 }, (_, _) => Task.CompletedTask @@ -202,11 +208,73 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase await Assert.ThrowsAsync(async () => { - await _backgroundWorkerManager.AddAsync( + await _dynamicWorkerManager.AddAsync( workerName, new DynamicBackgroundWorkerSchedule { Period = -1000 }, (_, _) => Task.CompletedTask ); }); } + + [Fact] + public async Task Should_Throw_When_No_Period_And_No_CronExpression() + { + var workerName = "dynamic-worker-" + Guid.NewGuid(); + + await Assert.ThrowsAsync(async () => + { + await _dynamicWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule(), + (_, _) => Task.CompletedTask + ); + }); + } + + [Fact] + public async Task Should_Continue_Running_After_Handler_Throws_Exception() + { + var workerName = "dynamic-worker-" + Guid.NewGuid(); + var callCount = 0; + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + await _dynamicWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = 50 }, + (_, _) => + { + var count = Interlocked.Increment(ref callCount); + if (count == 1) + { + throw new InvalidOperationException("Simulated failure"); + } + + tcs.TrySetResult(true); + return Task.CompletedTask; + } + ); + + var completedTask = await Task.WhenAny(tcs.Task, Task.Delay(5000)); + completedTask.ShouldBe(tcs.Task); + callCount.ShouldBeGreaterThan(1); + } + + [Fact] + public async Task Should_Not_Be_Registered_After_Remove() + { + var workerName = "dynamic-worker-" + Guid.NewGuid(); + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeFalse(); + + await _dynamicWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = 1000 }, + (_, _) => Task.CompletedTask + ); + + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeTrue(); + + await _dynamicWorkerManager.RemoveAsync(workerName); + + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeFalse(); + } } From 7e12823cd59d3fb5ac51e6e4178c48ce951451b1 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 20 Mar 2026 15:13:17 +0800 Subject: [PATCH 20/40] fix: Simplify cron expression generation and improve error handling in background worker managers --- .../HangfireDynamicBackgroundWorkerManager.cs | 28 ++++++++++--------- .../TickerQDynamicBackgroundWorkerManager.cs | 7 +++++ .../DefaultDynamicBackgroundWorkerManager.cs | 4 +-- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs index 53820d0522..040be6b3e5 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs @@ -140,29 +140,31 @@ public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMa protected virtual string GetCron(int period) { var time = TimeSpan.FromMilliseconds(period); - string cron; if (time.TotalSeconds <= 59) { - cron = $"*/{time.TotalSeconds} * * * * *"; + var seconds = (int)Math.Round(time.TotalSeconds); + return $"*/{seconds} * * * * *"; } - else if (time.TotalMinutes <= 59) - { - cron = $"*/{time.TotalMinutes} * * * *"; - } - else if (time.TotalHours <= 23) + + if (time.TotalMinutes <= 59) { - cron = $"0 */{time.TotalHours} * * *"; + var minutes = (int)Math.Round(time.TotalMinutes); + return $"*/{minutes} * * * *"; } - else if (time.TotalDays <= 31) + + if (time.TotalHours <= 23) { - cron = $"0 0 0 1/{time.TotalDays} * *"; + var hours = (int)Math.Round(time.TotalHours); + return $"0 */{hours} * * *"; } - else + + if (time.TotalDays <= 31) { - throw new AbpException($"Cannot convert period: {period} to cron expression."); + var days = (int)Math.Round(time.TotalDays); + return $"0 0 */{days} * *"; } - return cron; + throw new AbpException($"Cannot convert period: {period} to cron expression."); } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs index efe8f3eebf..e5409b1b9a 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs @@ -92,6 +92,10 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.Remove(functionName); HandlerRegistry.Unregister(workerName); + // Note: ICronTickerManager does not provide a remove API. + // The handler is unregistered above, so any persisted cron entry will + // find a null handler and skip execution silently. + return Task.FromResult(true); } @@ -138,6 +142,9 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan var time = TimeSpan.FromMilliseconds(period); if (time.TotalMinutes < 1) { + Logger.LogWarning( + "TickerQ does not support sub-minute intervals. Period {Period}ms will be rounded up to every minute.", + period); return "* * * * *"; } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs index 3d239215dc..030b6299d0 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs @@ -37,7 +37,7 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan schedule.Validate(); - if (schedule.Period == null && !string.IsNullOrWhiteSpace(schedule.CronExpression)) + if (schedule.Period == null) { throw new AbpException( $"The default in-memory background worker manager does not support CronExpression without Period for dynamic worker '{workerName}'. " + @@ -79,7 +79,7 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan schedule.Validate(); - if (schedule.Period == null && !string.IsNullOrWhiteSpace(schedule.CronExpression)) + if (schedule.Period == null) { throw new AbpException( $"The default in-memory background worker manager does not support CronExpression without Period for dynamic worker '{workerName}'. " + From 43e7365e226bbd946f4d54500564b3d58e7fcfd2 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 20 Mar 2026 15:24:55 +0800 Subject: [PATCH 21/40] fix: Streamline job deletion and enhance exception handling in TickerQ background worker manager --- .../QuartzDynamicBackgroundWorkerManager.cs | 9 +++---- .../TickerQDynamicBackgroundWorkerManager.cs | 27 ++++++++++++++----- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs index 57fdda79eb..7ff3f85a1d 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs @@ -71,13 +71,10 @@ public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMana } var jobKey = new JobKey($"DynamicWorker:{workerName}"); - var deleted = await Scheduler.DeleteJob(jobKey, cancellationToken); - if (deleted) - { - HandlerRegistry.Unregister(workerName); - } + await Scheduler.DeleteJob(jobKey, cancellationToken); + HandlerRegistry.Unregister(workerName); - return deleted; + return true; } public virtual async Task UpdateScheduleAsync( diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs index e5409b1b9a..f4850777dd 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs @@ -1,12 +1,14 @@ using System; using System.Threading; using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using TickerQ.Utilities.Entities; using TickerQ.Utilities.Enums; using TickerQ.Utilities.Interfaces.Managers; using Volo.Abp.DependencyInjection; +using Volo.Abp.ExceptionHandling; using Volo.Abp.TickerQ; namespace Volo.Abp.BackgroundWorkers.TickerQ; @@ -57,9 +59,19 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan return; } - await registeredHandler( - new DynamicBackgroundWorkerExecutionContext(workerName, serviceProvider), - tickerCancellationToken); + try + { + await registeredHandler( + new DynamicBackgroundWorkerExecutionContext(workerName, serviceProvider), + tickerCancellationToken); + } + catch (Exception ex) + { + await serviceProvider.GetRequiredService() + .NotifyAsync(new ExceptionNotificationContext(ex)); + + throw; + } }, 0); AbpTickerQBackgroundWorkersProvider.BackgroundWorkers[functionName] = new AbpTickerQCronBackgroundWorker @@ -92,9 +104,12 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.Remove(functionName); HandlerRegistry.Unregister(workerName); - // Note: ICronTickerManager does not provide a remove API. - // The handler is unregistered above, so any persisted cron entry will - // find a null handler and skip execution silently. + // ICronTickerManager does not provide a remove API, so the persisted + // cron entry will remain in storage. The handler is unregistered above, + // so the entry will find a null handler and skip execution silently. + Logger.LogWarning( + "Dynamic worker '{WorkerName}' removed from memory, but the persisted TickerQ cron entry may remain in storage.", + workerName); return Task.FromResult(true); } From fa19685a5bbc87133a2c1184438bcbf9622acc8f Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 20 Mar 2026 15:34:21 +0800 Subject: [PATCH 22/40] fix: Enhance dynamic background worker management by improving cron entry handling --- .../TickerQDynamicBackgroundWorkerManager.cs | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs index f4850777dd..41209cce68 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; @@ -22,6 +23,8 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; } public ILogger Logger { get; set; } + private readonly ConcurrentDictionary _cronTickerIds; + public TickerQDynamicBackgroundWorkerManager( AbpTickerQFunctionProvider abpTickerQFunctionProvider, AbpTickerQBackgroundWorkersProvider abpTickerQBackgroundWorkersProvider, @@ -33,6 +36,7 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan CronTickerManager = cronTickerManager; HandlerRegistry = handlerRegistry; Logger = NullLogger.Instance; + _cronTickerIds = new ConcurrentDictionary(); } public virtual async Task AddAsync( @@ -47,6 +51,12 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan schedule.Validate(); + // If replacing an existing worker, delete the old cron entry first + if (_cronTickerIds.TryRemove(workerName, out var existingId)) + { + await CronTickerManager.DeleteAsync(existingId, cancellationToken); + } + var cronExpression = schedule.CronExpression ?? GetCron(schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod); var functionName = $"DynamicWorker:{workerName}"; @@ -81,22 +91,27 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan WorkerType = typeof(TickerQDynamicBackgroundWorkerManager) }; - await CronTickerManager.AddAsync(new CronTickerEntity + var result = await CronTickerManager.AddAsync(new CronTickerEntity { Function = functionName, Expression = cronExpression - }); + }, cancellationToken); + + if (result.IsSucceeded && result.Result != null) + { + _cronTickerIds[workerName] = result.Result.Id; + } HandlerRegistry.Register(workerName, handler); } - public virtual Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) + public virtual async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) { Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); if (!HandlerRegistry.IsRegistered(workerName)) { - return Task.FromResult(false); + return false; } var functionName = $"DynamicWorker:{workerName}"; @@ -104,14 +119,12 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.Remove(functionName); HandlerRegistry.Unregister(workerName); - // ICronTickerManager does not provide a remove API, so the persisted - // cron entry will remain in storage. The handler is unregistered above, - // so the entry will find a null handler and skip execution silently. - Logger.LogWarning( - "Dynamic worker '{WorkerName}' removed from memory, but the persisted TickerQ cron entry may remain in storage.", - workerName); + if (_cronTickerIds.TryRemove(workerName, out var cronTickerId)) + { + await CronTickerManager.DeleteAsync(cronTickerId, cancellationToken); + } - return Task.FromResult(true); + return true; } public virtual async Task UpdateScheduleAsync( @@ -137,11 +150,22 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan existingWorker.CronExpression = cronExpression; } - await CronTickerManager.AddAsync(new CronTickerEntity + // Delete old entry and create new one with updated expression + if (_cronTickerIds.TryRemove(workerName, out var oldCronTickerId)) + { + await CronTickerManager.DeleteAsync(oldCronTickerId, cancellationToken); + } + + var result = await CronTickerManager.AddAsync(new CronTickerEntity { Function = functionName, Expression = cronExpression - }); + }, cancellationToken); + + if (result.IsSucceeded && result.Result != null) + { + _cronTickerIds[workerName] = result.Result.Id; + } return true; } From bcc13c5337dbdd2f3b63f70a97ea46f7b451b8cc Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 20 Mar 2026 15:36:35 +0800 Subject: [PATCH 23/40] fix: Improve dynamic background worker management with runtime registration examples and clarifications --- .../background-workers/index.md | 65 +++++++++++-------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/docs/en/framework/infrastructure/background-workers/index.md b/docs/en/framework/infrastructure/background-workers/index.md index 0b53a09c48..46b192180e 100644 --- a/docs/en/framework/infrastructure/background-workers/index.md +++ b/docs/en/framework/infrastructure/background-workers/index.md @@ -122,47 +122,58 @@ While we generally add workers in `OnApplicationInitializationAsync`, there are ### Dynamic Workers (Runtime Registration) -You can add a runtime worker without pre-defining a dedicated worker class by injecting `IDynamicBackgroundWorkerManager` and passing a handler directly. +You can add a runtime worker without pre-defining a dedicated worker class. Inject `IDynamicBackgroundWorkerManager` and pass a handler directly: -```csharp -await dynamicBackgroundWorkerManager.AddAsync( - "InventorySyncWorker", - new DynamicBackgroundWorkerSchedule - { - Period = 30000 // 30 seconds - // CronExpression = "*/30 * * * *" // every 30 minutes, supported by Hangfire, Quartz, TickerQ - }, - async (context, cancellationToken) => +````csharp +public class MyModule : AbpModule +{ + public override async Task OnApplicationInitializationAsync( + ApplicationInitializationContext context) { - var inventorySyncAppService = context.ServiceProvider.GetRequiredService(); - await inventorySyncAppService.SyncAsync(cancellationToken); + var dynamicWorkerManager = context.ServiceProvider + .GetRequiredService(); + + await dynamicWorkerManager.AddAsync( + "InventorySyncWorker", + new DynamicBackgroundWorkerSchedule + { + Period = 30000 //30 seconds + //CronExpression = "*/30 * * * *" //Every 30 minutes. Only for Hangfire, Quartz or TickerQ integration. + }, + async (workerContext, cancellationToken) => + { + var inventorySyncAppService = workerContext + .ServiceProvider + .GetRequiredService(); + + await inventorySyncAppService.SyncAsync(cancellationToken); + } + ); } -); -``` +} +```` You can also **remove** a dynamic worker or **update its schedule** at runtime: -```csharp -// Remove a dynamic worker -var removed = await dynamicBackgroundWorkerManager.RemoveAsync("InventorySyncWorker"); +````csharp +//Remove a dynamic worker +var removed = await dynamicWorkerManager.RemoveAsync("InventorySyncWorker"); -// Update the schedule of a dynamic worker -var updated = await dynamicBackgroundWorkerManager.UpdateScheduleAsync( +//Update the schedule of a dynamic worker +var updated = await dynamicWorkerManager.UpdateScheduleAsync( "InventorySyncWorker", new DynamicBackgroundWorkerSchedule { - Period = 60000 // change to 60 seconds + Period = 60000 //Change to 60 seconds } ); -``` - -Key points: +```` -* `IDynamicBackgroundWorkerManager` is a separate interface from `IBackgroundWorkerManager`, dedicated to runtime (non-type-safe) worker management. -* `workerName` is the runtime identifier of the dynamic worker. If a worker with the same name already exists, it will be replaced. -* The `handler` receives a `DynamicBackgroundWorkerExecutionContext` containing the worker name and a scoped `IServiceProvider`. +* `IDynamicBackgroundWorkerManager` is a **separate interface** from `IBackgroundWorkerManager`, dedicated to runtime (non-type-safe) worker management. +* `workerName` is the runtime identifier of the dynamic worker. If a worker with the same name already exists, it will be **replaced**. +* The `handler` receives a `DynamicBackgroundWorkerExecutionContext` containing the worker name and a scoped `IServiceProvider`. It is a good practice to **resolve dependencies** from the `workerContext.ServiceProvider` instead of constructor injection. * At least one of `Period` or `CronExpression` must be set in `DynamicBackgroundWorkerSchedule`. -* **`CronExpression` is only supported by scheduler-backed providers (Hangfire, Quartz, TickerQ).** The default in-memory provider requires `Period` and does not support `CronExpression` alone. +* **`CronExpression` is only supported by scheduler-backed providers ([Hangfire](./hangfire.md), [Quartz](./quartz.md), [TickerQ](./tickerq.md)).** The default in-memory provider requires `Period` and does not support `CronExpression` alone. * `RemoveAsync` stops and removes a dynamic worker. Returns `true` if the worker was found and removed. * `UpdateScheduleAsync` changes the schedule of an existing dynamic worker. Returns `true` if the worker was found and updated. The handler itself is not changed. From ad4c47a39c70a456d6a0eb93c73aac78e0653dd8 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 20 Mar 2026 16:42:12 +0800 Subject: [PATCH 24/40] fix: Update documentation and improve dynamic background worker management for TickerQ and Quartz integration --- .../background-workers/index.md | 3 +- .../HangfireDynamicBackgroundWorkerManager.cs | 4 +- .../TickerQDynamicBackgroundWorkerManager.cs | 194 ++---------------- .../DemoAppQuartzModule.cs | 4 +- ...o.Abp.BackgroundJobs.DemoApp.Quartz.csproj | 1 + .../DemoAppSharedModule.cs | 67 +++++- ....cs => 20260320082618_Initial.Designer.cs} | 2 +- ...7_Initial.cs => 20260320082618_Initial.cs} | 0 8 files changed, 88 insertions(+), 187 deletions(-) rename modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/{20260119064307_Initial.Designer.cs => 20260320082618_Initial.Designer.cs} (98%) rename modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/{20260119064307_Initial.cs => 20260320082618_Initial.cs} (100%) diff --git a/docs/en/framework/infrastructure/background-workers/index.md b/docs/en/framework/infrastructure/background-workers/index.md index 46b192180e..ab5f42b207 100644 --- a/docs/en/framework/infrastructure/background-workers/index.md +++ b/docs/en/framework/infrastructure/background-workers/index.md @@ -173,7 +173,8 @@ var updated = await dynamicWorkerManager.UpdateScheduleAsync( * `workerName` is the runtime identifier of the dynamic worker. If a worker with the same name already exists, it will be **replaced**. * The `handler` receives a `DynamicBackgroundWorkerExecutionContext` containing the worker name and a scoped `IServiceProvider`. It is a good practice to **resolve dependencies** from the `workerContext.ServiceProvider` instead of constructor injection. * At least one of `Period` or `CronExpression` must be set in `DynamicBackgroundWorkerSchedule`. -* **`CronExpression` is only supported by scheduler-backed providers ([Hangfire](./hangfire.md), [Quartz](./quartz.md), [TickerQ](./tickerq.md)).** The default in-memory provider requires `Period` and does not support `CronExpression` alone. +* **`CronExpression` is only supported by scheduler-backed providers ([Hangfire](./hangfire.md), [Quartz](./quartz.md)).** The default in-memory provider requires `Period` and does not support `CronExpression` alone. +* **[TickerQ](./tickerq.md) does not support dynamic background workers** because it uses `FrozenDictionary` for function registration, which requires all functions to be registered before the application starts. * `RemoveAsync` stops and removes a dynamic worker. Returns `true` if the worker was found and removed. * `UpdateScheduleAsync` changes the schedule of an existing dynamic worker. Returns `true` if the worker was found and updated. The handler itself is not changed. diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs index 040be6b3e5..5f310827a2 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs @@ -116,7 +116,7 @@ public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMa RecurringJob.AddOrUpdate( recurringJobId, - adapter => adapter.DoWorkAsync(workerName, cancellationToken), + adapter => adapter.DoWorkAsync(workerName, CancellationToken.None), cronExpression, new RecurringJobOptions { @@ -128,7 +128,7 @@ public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMa RecurringJob.AddOrUpdate( recurringJobId, queueName, - adapter => adapter.DoWorkAsync(workerName, cancellationToken), + adapter => adapter.DoWorkAsync(workerName, CancellationToken.None), cronExpression, new RecurringJobOptions { diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs index 41209cce68..5cbeb12faf 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs @@ -1,210 +1,44 @@ using System; -using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; -using TickerQ.Utilities.Entities; -using TickerQ.Utilities.Enums; -using TickerQ.Utilities.Interfaces.Managers; using Volo.Abp.DependencyInjection; -using Volo.Abp.ExceptionHandling; -using Volo.Abp.TickerQ; namespace Volo.Abp.BackgroundWorkers.TickerQ; [Dependency(ReplaceServices = true)] public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerManager, ISingletonDependency { - protected AbpTickerQFunctionProvider AbpTickerQFunctionProvider { get; } - protected AbpTickerQBackgroundWorkersProvider AbpTickerQBackgroundWorkersProvider { get; } - protected ICronTickerManager CronTickerManager { get; } - protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; } - public ILogger Logger { get; set; } - - private readonly ConcurrentDictionary _cronTickerIds; - - public TickerQDynamicBackgroundWorkerManager( - AbpTickerQFunctionProvider abpTickerQFunctionProvider, - AbpTickerQBackgroundWorkersProvider abpTickerQBackgroundWorkersProvider, - ICronTickerManager cronTickerManager, - IDynamicBackgroundWorkerHandlerRegistry handlerRegistry) - { - AbpTickerQFunctionProvider = abpTickerQFunctionProvider; - AbpTickerQBackgroundWorkersProvider = abpTickerQBackgroundWorkersProvider; - CronTickerManager = cronTickerManager; - HandlerRegistry = handlerRegistry; - Logger = NullLogger.Instance; - _cronTickerIds = new ConcurrentDictionary(); - } - - public virtual async Task AddAsync( + public virtual Task AddAsync( string workerName, DynamicBackgroundWorkerSchedule schedule, Func handler, CancellationToken cancellationToken = default) { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - Check.NotNull(schedule, nameof(schedule)); - Check.NotNull(handler, nameof(handler)); - - schedule.Validate(); - - // If replacing an existing worker, delete the old cron entry first - if (_cronTickerIds.TryRemove(workerName, out var existingId)) - { - await CronTickerManager.DeleteAsync(existingId, cancellationToken); - } - - var cronExpression = schedule.CronExpression ?? GetCron(schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod); - var functionName = $"DynamicWorker:{workerName}"; - - AbpTickerQFunctionProvider.Functions[functionName] = - (string.Empty, TickerTaskPriority.LongRunning, async (tickerCancellationToken, serviceProvider, _) => - { - var registeredHandler = HandlerRegistry.Get(workerName); - if (registeredHandler == null) - { - return; - } - - try - { - await registeredHandler( - new DynamicBackgroundWorkerExecutionContext(workerName, serviceProvider), - tickerCancellationToken); - } - catch (Exception ex) - { - await serviceProvider.GetRequiredService() - .NotifyAsync(new ExceptionNotificationContext(ex)); - - throw; - } - }, 0); - - AbpTickerQBackgroundWorkersProvider.BackgroundWorkers[functionName] = new AbpTickerQCronBackgroundWorker - { - Function = functionName, - CronExpression = cronExpression, - WorkerType = typeof(TickerQDynamicBackgroundWorkerManager) - }; - - var result = await CronTickerManager.AddAsync(new CronTickerEntity - { - Function = functionName, - Expression = cronExpression - }, cancellationToken); - - if (result.IsSucceeded && result.Result != null) - { - _cronTickerIds[workerName] = result.Result.Id; - } - - HandlerRegistry.Register(workerName, handler); + throw new AbpException( + "TickerQ does not support dynamic background worker registration at runtime. " + + "TickerQ uses FrozenDictionary for function registration, which requires all functions to be registered before the application starts. " + + "Please use Hangfire or Quartz provider for dynamic background workers."); } - public virtual async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) + public virtual Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - - if (!HandlerRegistry.IsRegistered(workerName)) - { - return false; - } - - var functionName = $"DynamicWorker:{workerName}"; - AbpTickerQFunctionProvider.Functions.Remove(functionName); - AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.Remove(functionName); - HandlerRegistry.Unregister(workerName); - - if (_cronTickerIds.TryRemove(workerName, out var cronTickerId)) - { - await CronTickerManager.DeleteAsync(cronTickerId, cancellationToken); - } - - return true; + throw new AbpException( + "TickerQ does not support dynamic background worker registration at runtime. " + + "Please use Hangfire or Quartz provider for dynamic background workers."); } - public virtual async Task UpdateScheduleAsync( + public virtual Task UpdateScheduleAsync( string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default) { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - Check.NotNull(schedule, nameof(schedule)); - - schedule.Validate(); - - if (!HandlerRegistry.IsRegistered(workerName)) - { - return false; - } - - var cronExpression = schedule.CronExpression ?? GetCron(schedule.Period ?? DynamicBackgroundWorkerSchedule.DefaultPeriod); - var functionName = $"DynamicWorker:{workerName}"; - - if (AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.TryGetValue(functionName, out var existingWorker)) - { - existingWorker.CronExpression = cronExpression; - } - - // Delete old entry and create new one with updated expression - if (_cronTickerIds.TryRemove(workerName, out var oldCronTickerId)) - { - await CronTickerManager.DeleteAsync(oldCronTickerId, cancellationToken); - } - - var result = await CronTickerManager.AddAsync(new CronTickerEntity - { - Function = functionName, - Expression = cronExpression - }, cancellationToken); - - if (result.IsSucceeded && result.Result != null) - { - _cronTickerIds[workerName] = result.Result.Id; - } - - return true; + throw new AbpException( + "TickerQ does not support dynamic background worker registration at runtime. " + + "Please use Hangfire or Quartz provider for dynamic background workers."); } public virtual bool IsRegistered(string workerName) { - Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - return HandlerRegistry.IsRegistered(workerName); - } - - protected virtual string GetCron(int period) - { - var time = TimeSpan.FromMilliseconds(period); - if (time.TotalMinutes < 1) - { - Logger.LogWarning( - "TickerQ does not support sub-minute intervals. Period {Period}ms will be rounded up to every minute.", - period); - return "* * * * *"; - } - - if (time.TotalMinutes < 60) - { - var minutes = (int)Math.Round(time.TotalMinutes); - return $"*/{minutes} * * * *"; - } - - if (time.TotalHours < 24) - { - var hours = (int)Math.Round(time.TotalHours); - return $"0 */{hours} * * *"; - } - - if (time.TotalDays <= 31) - { - var days = (int)Math.Round(time.TotalDays); - return $"0 0 */{days} * *"; - } - - throw new AbpException($"Cannot convert period: {period} to cron expression."); + return false; } } diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/DemoAppQuartzModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/DemoAppQuartzModule.cs index 0d521baf3d..b8aaf6e519 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/DemoAppQuartzModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/DemoAppQuartzModule.cs @@ -1,6 +1,7 @@ using Volo.Abp.Autofac; using Volo.Abp.BackgroundJobs.DemoApp.Shared; using Volo.Abp.BackgroundJobs.Quartz; +using Volo.Abp.BackgroundWorkers.Quartz; using Volo.Abp.Modularity; namespace Volo.Abp.BackgroundJobs.DemoApp.Quartz; @@ -8,7 +9,8 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Quartz; [DependsOn( typeof(DemoAppSharedModule), typeof(AbpAutofacModule), - typeof(AbpBackgroundJobsQuartzModule) + typeof(AbpBackgroundJobsQuartzModule), + typeof(AbpBackgroundWorkersQuartzModule) )] public class DemoAppQuartzModule : AbpModule { diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj index 8faef0c291..5f2be2b49b 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Quartz/Volo.Abp.BackgroundJobs.DemoApp.Quartz.csproj @@ -12,6 +12,7 @@ + diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs index 713355636f..53b5d38032 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs @@ -1,5 +1,9 @@ -using Microsoft.Extensions.DependencyInjection; +using System; +using System.Threading.Tasks; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs; +using Volo.Abp.BackgroundWorkers; using Volo.Abp.Modularity; using Volo.Abp.MultiTenancy; @@ -8,11 +12,70 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared [DependsOn(typeof(AbpMultiTenancyModule))] public class DemoAppSharedModule : AbpModule { - public override void OnPostApplicationInitialization(ApplicationInitializationContext context) + public override async Task OnPostApplicationInitializationAsync(ApplicationInitializationContext context) { context.ServiceProvider .GetRequiredService() .CreateJobs(); + + await DynamicBackgroundWorkerDemoAsync(context); + } + + private async Task DynamicBackgroundWorkerDemoAsync(ApplicationInitializationContext context) + { + var dynamicWorkerManager = context.ServiceProvider + .GetService(); + + if (dynamicWorkerManager == null) + { + return; + } + + // AddAsync: Register a dynamic worker with a schedule and handler + await dynamicWorkerManager.AddAsync( + "DemoHeartbeatWorker", + new DynamicBackgroundWorkerSchedule + { + Period = 5000 //5 seconds + }, + async (workerContext, cancellationToken) => + { + Console.WriteLine($"[{DateTime.Now}] DemoHeartbeatWorker executed."); + await Task.CompletedTask; + } + ); + + // IsRegistered: Check if a dynamic worker is registered + var isRegistered = dynamicWorkerManager.IsRegistered("DemoHeartbeatWorker"); + Console.WriteLine($"DemoHeartbeatWorker is registered: {isRegistered}"); + + // UpdateScheduleAsync: Update the schedule of an existing dynamic worker + var updated = await dynamicWorkerManager.UpdateScheduleAsync( + "DemoHeartbeatWorker", + new DynamicBackgroundWorkerSchedule + { + Period = 10000 //Change to 10 seconds + } + ); + Console.WriteLine($"DemoHeartbeatWorker schedule updated: {updated}"); + + // RemoveAsync: Remove a dynamic worker + var removed = await dynamicWorkerManager.RemoveAsync("DemoHeartbeatWorker"); + Console.WriteLine($"DemoHeartbeatWorker removed: {removed}"); + + // Re-add the worker to keep it running for demo purposes + await dynamicWorkerManager.AddAsync( + "DemoHeartbeatWorker", + new DynamicBackgroundWorkerSchedule + { + Period = 10000 //10 seconds + }, + async (workerContext, cancellationToken) => + { + Console.WriteLine($"[{DateTime.Now}] DemoHeartbeatWorker executed."); + await Task.CompletedTask; + } + ); } } } diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20260119064307_Initial.Designer.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20260320082618_Initial.Designer.cs similarity index 98% rename from modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20260119064307_Initial.Designer.cs rename to modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20260320082618_Initial.Designer.cs index 3225815926..fd21dc852f 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20260119064307_Initial.Designer.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20260320082618_Initial.Designer.cs @@ -13,7 +13,7 @@ using Volo.Abp.EntityFrameworkCore; namespace Volo.Abp.BackgroundJobs.DemoApp.Migrations { [DbContext(typeof(DemoAppDbContext))] - [Migration("20260119064307_Initial")] + [Migration("20260320082618_Initial")] partial class Initial { /// diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20260119064307_Initial.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20260320082618_Initial.cs similarity index 100% rename from modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20260119064307_Initial.cs rename to modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp/Migrations/20260320082618_Initial.cs From fa15bc4cae2acca8cc7a5af37a7e8852ba5f8a2f Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 20 Mar 2026 17:09:04 +0800 Subject: [PATCH 25/40] Add SemaphoreSlim for thread safety and concurrency tests Add SemaphoreSlim to DefaultDynamicBackgroundWorkerManager to protect AddAsync/RemoveAsync/UpdateScheduleAsync from concurrent access on the same worker name. Add 3 concurrency test cases covering concurrent same-name add, concurrent add+remove, and concurrent mixed operations. --- .../DefaultDynamicBackgroundWorkerManager.cs | 63 ++++++++--- .../DynamicBackgroundWorkerManager_Tests.cs | 106 ++++++++++++++++++ 2 files changed, 151 insertions(+), 18 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs index 030b6299d0..598bd74014 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs @@ -16,6 +16,7 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan public ILogger Logger { get; set; } private readonly ConcurrentDictionary _dynamicWorkers; + private readonly SemaphoreSlim _semaphore; private bool _isDisposed; public DefaultDynamicBackgroundWorkerManager(IServiceProvider serviceProvider) @@ -23,6 +24,7 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan ServiceProvider = serviceProvider; Logger = NullLogger.Instance; _dynamicWorkers = new ConcurrentDictionary(); + _semaphore = new SemaphoreSlim(1, 1); } public virtual async Task AddAsync( @@ -44,32 +46,48 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan "Please set Period, or use a scheduler-backed provider (Hangfire, Quartz, TickerQ)."); } - if (_dynamicWorkers.TryRemove(workerName, out var existingWorker)) + await _semaphore.WaitAsync(cancellationToken); + try { - await existingWorker.StopAsync(cancellationToken); - Logger.LogInformation("Replaced existing dynamic worker: {WorkerName}", workerName); - } + if (_dynamicWorkers.TryRemove(workerName, out var existingWorker)) + { + await existingWorker.StopAsync(cancellationToken); + Logger.LogInformation("Replaced existing dynamic worker: {WorkerName}", workerName); + } - var worker = CreateDynamicWorker(workerName, schedule, handler); - _dynamicWorkers[workerName] = worker; + var worker = CreateDynamicWorker(workerName, schedule, handler); + _dynamicWorkers[workerName] = worker; - await worker.StartAsync(cancellationToken); + await worker.StartAsync(cancellationToken); + } + finally + { + _semaphore.Release(); + } } public virtual async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) { Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - if (!_dynamicWorkers.TryRemove(workerName, out var worker)) + await _semaphore.WaitAsync(cancellationToken); + try { - return false; - } + if (!_dynamicWorkers.TryRemove(workerName, out var worker)) + { + return false; + } - await worker.StopAsync(cancellationToken); - return true; + await worker.StopAsync(cancellationToken); + return true; + } + finally + { + _semaphore.Release(); + } } - public virtual Task UpdateScheduleAsync( + public virtual async Task UpdateScheduleAsync( string workerName, DynamicBackgroundWorkerSchedule schedule, CancellationToken cancellationToken = default) @@ -86,13 +104,21 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan "Please set Period, or use a scheduler-backed provider (Hangfire, Quartz, TickerQ)."); } - if (!_dynamicWorkers.TryGetValue(workerName, out var worker)) + await _semaphore.WaitAsync(cancellationToken); + try { - return Task.FromResult(false); - } + if (!_dynamicWorkers.TryGetValue(workerName, out var worker)) + { + return false; + } - worker.UpdateSchedule(schedule); - return Task.FromResult(true); + worker.UpdateSchedule(schedule); + return true; + } + finally + { + _semaphore.Release(); + } } public virtual bool IsRegistered(string workerName) @@ -123,6 +149,7 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan } _dynamicWorkers.Clear(); + _semaphore.Dispose(); } protected virtual InMemoryDynamicBackgroundWorker CreateDynamicWorker( diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs index 2c3f8414e6..be99167d85 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs @@ -1,4 +1,7 @@ using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; using System.Threading; using System.Threading.Tasks; using Shouldly; @@ -277,4 +280,107 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase _dynamicWorkerManager.IsRegistered(workerName).ShouldBeFalse(); } + + [Fact] + public async Task Should_Handle_Concurrent_Add_With_Same_Name() + { + var workerName = "concurrent-worker-" + Guid.NewGuid(); + var executedHandlerIds = new ConcurrentBag(); + + var tasks = Enumerable.Range(0, 10).Select(i => + _dynamicWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = 60000 }, + (_, _) => + { + executedHandlerIds.Add(i); + return Task.CompletedTask; + } + ) + ).ToList(); + + await Task.WhenAll(tasks); + + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeTrue(); + + var removed = await _dynamicWorkerManager.RemoveAsync(workerName); + removed.ShouldBeTrue(); + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeFalse(); + } + + [Fact] + public async Task Should_Handle_Concurrent_Add_And_Remove() + { + var workerNames = Enumerable.Range(0, 10) + .Select(i => $"concurrent-worker-{i}-" + Guid.NewGuid()) + .ToList(); + + var addTasks = workerNames.Select(name => + _dynamicWorkerManager.AddAsync( + name, + new DynamicBackgroundWorkerSchedule { Period = 60000 }, + (_, _) => Task.CompletedTask + ) + ).ToList(); + + await Task.WhenAll(addTasks); + + foreach (var name in workerNames) + { + _dynamicWorkerManager.IsRegistered(name).ShouldBeTrue(); + } + + var removeTasks = workerNames.Select(name => + _dynamicWorkerManager.RemoveAsync(name) + ).ToList(); + + var results = await Task.WhenAll(removeTasks); + + results.ShouldAllBe(r => r); + + foreach (var name in workerNames) + { + _dynamicWorkerManager.IsRegistered(name).ShouldBeFalse(); + } + } + + [Fact] + public async Task Should_Handle_Concurrent_Add_Remove_Update() + { + var workerName = "concurrent-mixed-" + Guid.NewGuid(); + + await _dynamicWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = 60000 }, + (_, _) => Task.CompletedTask + ); + + var tasks = new List + { + _dynamicWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = 30000 }, + (_, _) => Task.CompletedTask + ), + _dynamicWorkerManager.UpdateScheduleAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = 20000 } + ), + _dynamicWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = 10000 }, + (_, _) => Task.CompletedTask + ) + }; + + await Task.WhenAll(tasks); + + // After all concurrent operations, worker should still be in a consistent state + var isRegistered = _dynamicWorkerManager.IsRegistered(workerName); + isRegistered.ShouldBeTrue(); + + var removed = await _dynamicWorkerManager.RemoveAsync(workerName); + removed.ShouldBeTrue(); + _dynamicWorkerManager.IsRegistered(workerName).ShouldBeFalse(); + } } From 70c333ad97a564f5c1a62f869f1b449a2cebf097 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 20 Mar 2026 18:06:33 +0800 Subject: [PATCH 26/40] Refactor background job execution and management --- .../background-jobs/hangfire.md | 2 - .../infrastructure/background-jobs/index.md | 147 +++++++++--------- .../BackgroundJobs/AbpBackgroundJobOptions.cs | 39 +---- .../AnonymousJobExecutorAsyncBackgroundJob.cs | 12 +- .../AnonymousJobHandlerRegistry.cs | 62 -------- .../BackgroundJobs/BackgroundJobExecuter.cs | 16 +- .../DefaultDynamicBackgroundJobManager.cs | 112 +++++++++++++ ...> DynamicBackgroundJobExecutionContext.cs} | 4 +- .../DynamicBackgroundJobHandler.cs | 9 ++ .../DynamicBackgroundJobHandlerRegistry.cs | 40 +++++ .../IAnonymousJobHandlerRegistry.cs | 17 -- .../BackgroundJobs/IBackgroundJobManager.cs | 15 -- .../IDynamicBackgroundJobHandlerRegistry.cs | 12 ++ .../IDynamicBackgroundJobManager.cs | 51 ++++++ .../NullBackgroundJobManager.cs | 6 - .../Hangfire/AbpDashboardOptionsProvider.cs | 53 ------- .../Hangfire/HangfireBackgroundJobManager.cs | 62 +------- .../Hangfire/HangfireJobExecutionAdapter.cs | 48 +----- .../Quartz/AbpBackgroundJobsQuartzModule.cs | 1 - .../Quartz/QuartzBackgroundJobManager.cs | 59 +------ .../Quartz/QuartzJobExecutionAdapter.cs | 61 +------- .../Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs | 11 +- .../RabbitMQ/IJobQueueManager.cs | 2 - .../Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 14 -- .../RabbitMQ/JobQueueManager.cs | 27 ---- .../RabbitMQ/RabbitMqBackgroundJobManager.cs | 55 +------ .../TickerQ/AbpBackgroundJobsTickerQModule.cs | 4 +- .../TickerQ/AbpTickerQBackgroundJobManager.cs | 68 +------- .../DefaultBackgroundJobManager.cs | 33 +--- .../AbpBackgroundJobsTestModule.cs | 16 +- .../BackgroundJobExecuter_Tests.cs | 51 ------ .../BackgroundJobManager_Tests.cs | 38 +++-- .../DemoAppSharedModule.cs | 29 ++-- .../Jobs/SampleJobCreator.cs | 47 +++--- 34 files changed, 419 insertions(+), 804 deletions(-) delete mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs rename framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/{AnonymousJobExecutionContext.cs => DynamicBackgroundJobExecutionContext.cs} (83%) create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandler.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerRegistry.cs delete mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAnonymousJobHandlerRegistry.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerRegistry.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobManager.cs diff --git a/docs/en/framework/infrastructure/background-jobs/hangfire.md b/docs/en/framework/infrastructure/background-jobs/hangfire.md index 3ea466d83b..05cd214016 100644 --- a/docs/en/framework/infrastructure/background-jobs/hangfire.md +++ b/docs/en/framework/infrastructure/background-jobs/hangfire.md @@ -149,8 +149,6 @@ namespace MyProject Hangfire Dashboard provides information about your background jobs, including method names and serialized arguments as well as gives you an opportunity to manage them by performing different actions – retry, delete, trigger, etc. So it is important to restrict access to the Dashboard. To make it secure by default, only local requests are allowed, however you can change this by following the [official documentation](http://docs.hangfire.io/en/latest/configuration/using-dashboard.html) of Hangfire. -When you enqueue jobs via anonymous handlers (`IBackgroundJobManager.EnqueueAsync(string jobName, object args)` + `IAnonymousJobHandlerRegistry`), ABP uses an internal transport job name (`Abp.AnonymousJob`), but the Hangfire dashboard display name tries to show the effective job name from payload (for example, `ProcessOrder`). - You can integrate the Hangfire dashboard to [ABP authorization system](../../fundamentals/authorization/index.md) using the **AbpHangfireAuthorizationFilter** class. This class is defined in the `Volo.Abp.Hangfire` package. The following example, checks if the current user is logged in to the application: diff --git a/docs/en/framework/infrastructure/background-jobs/index.md b/docs/en/framework/infrastructure/background-jobs/index.md index f581985df9..c4393c0d2d 100644 --- a/docs/en/framework/infrastructure/background-jobs/index.md +++ b/docs/en/framework/infrastructure/background-jobs/index.md @@ -197,76 +197,6 @@ Enqueue method gets some optional arguments to control the background job: * **priority** is used to control priority of the job item. It gets an `BackgroundJobPriority` enum which has `Low`, `BelowNormal`, `Normal` (default), `AboveNormal` and `Hight` fields. * **delay** is used to wait a while (`TimeSpan`) before first try. -### Enqueue by ABP Job Name - -You can also enqueue jobs by their ABP background job name at runtime: - -```csharp -var jobName = BackgroundJobNameAttribute.GetName(); // "emails" if configured via [BackgroundJobName] - -await _backgroundJobManager.EnqueueAsync( - jobName, - new - { - EmailAddress = "user@abp.io", - Subject = "Welcome", - Body = "..." - } -); -``` - -`jobName` here is the ABP background job name (configuration key), not a provider queue name (like a Hangfire queue or RabbitMQ queue). - -In this case, ABP resolves the target job configuration by `jobName` and serializes the `args` object. -If the `args` runtime type does not match the configured argument type, ABP normalizes the payload by serializing and deserializing it to the expected argument type. - -### Anonymous Job Handlers - -ABP supports registering runtime-resolved anonymous handlers keyed by a job name. - -You can register handlers at startup: - -```csharp -Configure(options => -{ - options.AddAnonymousJobHandler("ProcessOrder", (context, cancellationToken) => - { - // Parse or deserialize context.JsonData and run your logic. - return Task.CompletedTask; - }); -}); -``` - -You can also register/unregister handlers at runtime: - -```csharp -public class MyService : ITransientDependency -{ - private readonly IAnonymousJobHandlerRegistry _anonymousJobHandlerRegistry; - - public MyService(IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry) - { - _anonymousJobHandlerRegistry = anonymousJobHandlerRegistry; - } - - public void Register() - { - _anonymousJobHandlerRegistry.Register("ProcessOrder", (context, cancellationToken) => - { - return Task.CompletedTask; - }); - } -} -``` - -Then enqueue it by name: - -```csharp -await _backgroundJobManager.EnqueueAsync("ProcessOrder", new { OrderId = "42" }); -``` - -ABP keeps a stable internal transport job name (`Abp.AnonymousJob`) for provider compatibility, while preserving your effective job name (`ProcessOrder`) in the payload. - ### Disable Job Execution You may want to disable background job execution for your application. This is generally needed if you want to execute background jobs in another process and disable it for the current process. @@ -416,6 +346,83 @@ If you don't want to use a distributed lock provider, you may go with the follow * Stop the background job manager (set `AbpBackgroundJobOptions.IsJobExecutionEnabled` to `false` as explained in the *Disable Job Execution* section) in all application instances except one of them, so only the single instance executes the jobs (while other application instances can still queue jobs). * Stop the background job manager (set `AbpBackgroundJobOptions.IsJobExecutionEnabled` to `false` as explained in the *Disable Job Execution* section) in all application instances and create a dedicated application (maybe a console application running in its own container or a Windows Service running in the background) to execute all the background jobs. This can be a good option if your background jobs consume high system resources (CPU, RAM or Disk), so you can deploy that background application to a dedicated server and your background jobs don't affect your application's performance. +## Dynamic Background Jobs + +ABP provides `IDynamicBackgroundJobManager` for scenarios where you need to enqueue jobs by name at runtime, without requiring a strongly-typed job args class at compile time. This is useful for plugin systems, dynamic workflows, or any case where job types are not known ahead of time. + +### Enqueue by Job Name (Typed Job) + +If a typed job is already registered (e.g., via `[BackgroundJobName("emails")]`), you can enqueue it by name: + +````csharp +public class MyService : ApplicationService +{ + private readonly IDynamicBackgroundJobManager _dynamicJobManager; + + public MyService(IDynamicBackgroundJobManager dynamicJobManager) + { + _dynamicJobManager = dynamicJobManager; + } + + public async Task DoSomethingAsync() + { + await _dynamicJobManager.EnqueueAsync("emails", new + { + EmailAddress = "user@abp.io", + Subject = "Hello", + Body = "World" + }); + } +} +```` + +The `IDynamicBackgroundJobManager` will look up the typed job configuration, deserialize the args to the expected type, and enqueue through the standard typed pipeline. + +### Dynamic Job Handlers + +You can also register dynamic handlers at runtime for jobs that don't have a pre-defined typed job class: + +````csharp +public override void OnApplicationInitialization(ApplicationInitializationContext context) +{ + var dynamicJobManager = context.ServiceProvider + .GetRequiredService(); + + dynamicJobManager.RegisterHandler("ProcessOrder", async (context, ct) => + { + var json = context.JsonData; + var serviceProvider = context.ServiceProvider; + // Process the order using JsonData and resolved services... + }); +} +```` + +Then enqueue jobs using the registered name: + +````csharp +await _dynamicJobManager.EnqueueAsync("ProcessOrder", new +{ + OrderId = "ORD-001", + Amount = 99.99 +}); +```` + +### Handler Management + +````csharp +// Check if a handler is registered +bool exists = _dynamicJobManager.IsHandlerRegistered("ProcessOrder"); + +// Unregister a handler +bool removed = _dynamicJobManager.UnregisterHandler("ProcessOrder"); +```` + +### How It Works + +- **Typed job path**: When the job name matches a registered typed job configuration, the args are serialized to JSON and deserialized to the expected args type, then enqueued through `IBackgroundJobManager.EnqueueAsync`. +- **Dynamic handler path**: When the job name matches a registered dynamic handler, the args are wrapped as `AnonymousJobArgs` (an internal transport type) and enqueued through `IBackgroundJobManager.EnqueueAsync`. When the job executes, the framework looks up the handler by name and invokes it. +- All dynamic jobs go through the **standard typed job pipeline**, which means they work with all providers (Default, Hangfire, Quartz, RabbitMQ, TickerQ) without any provider-specific changes. + ## Integrations Background job system is extensible and you can change the default background job manager with your own implementation or on of the pre-built integrations. 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 f98d2d89f4..8494f5df3e 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 @@ -1,17 +1,13 @@ using System; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; -using System.Threading; -using System.Threading.Tasks; namespace Volo.Abp.BackgroundJobs; public class AbpBackgroundJobOptions { private readonly Dictionary _jobConfigurationsByArgsType; - private readonly ConcurrentDictionary _jobConfigurationsByName; - private readonly ConcurrentDictionary> _anonymousHandlers = new(); + private readonly Dictionary _jobConfigurationsByName; /// /// Default: true. @@ -27,7 +23,7 @@ public class AbpBackgroundJobOptions public AbpBackgroundJobOptions() { _jobConfigurationsByArgsType = new Dictionary(); - _jobConfigurationsByName = new ConcurrentDictionary(); + _jobConfigurationsByName = new Dictionary(); GetBackgroundJobName = BackgroundJobNameAttribute.GetName; } @@ -62,7 +58,7 @@ public class AbpBackgroundJobOptions public BackgroundJobConfiguration? GetJobOrNull(string name) { - return _jobConfigurationsByName.TryGetValue(name, out var config) ? config : null; + return _jobConfigurationsByName.GetOrDefault(name); } public IReadOnlyList GetJobs() @@ -85,33 +81,4 @@ public class AbpBackgroundJobOptions _jobConfigurationsByArgsType[jobConfiguration.ArgsType] = jobConfiguration; _jobConfigurationsByName[jobConfiguration.JobName] = jobConfiguration; } - - public void AddAnonymousJobHandler(string jobName, Func handler) - { - Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); - Check.NotNull(handler, nameof(handler)); - - _anonymousHandlers[jobName] = handler; - } - - public void AddAnonymousJobHandler(string jobName, Action handler) - { - Check.NotNull(handler, nameof(handler)); - - AddAnonymousJobHandler(jobName, (context, ct) => - { - handler(context, ct); - return Task.CompletedTask; - }); - } - - internal bool TryGetAnonymousHandler(string jobName, out Func? handler) - { - return _anonymousHandlers.TryGetValue(jobName, out handler); - } - - internal bool IsAnonymousJobRegistered(string jobName) - { - return _anonymousHandlers.ContainsKey(jobName); - } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs index e06b092fe9..e3c95996d0 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs @@ -9,11 +9,11 @@ namespace Volo.Abp.BackgroundJobs; public class AnonymousJobExecutorAsyncBackgroundJob : AsyncBackgroundJob, ITransientDependency { - protected IAnonymousJobHandlerRegistry HandlerRegistry { get; } + protected IDynamicBackgroundJobHandlerRegistry HandlerRegistry { get; } protected IServiceProvider ServiceProvider { get; } public AnonymousJobExecutorAsyncBackgroundJob( - IAnonymousJobHandlerRegistry handlerRegistry, + IDynamicBackgroundJobHandlerRegistry handlerRegistry, IServiceProvider serviceProvider) { HandlerRegistry = handlerRegistry; @@ -23,7 +23,7 @@ public class AnonymousJobExecutorAsyncBackgroundJob : AsyncBackgroundJob().Token; - var executionContext = new AnonymousJobExecutionContext(args.JobName, args.JsonData, ServiceProvider); + var executionContext = new DynamicBackgroundJobExecutionContext(args.JobName, args.JsonData, ServiceProvider); await handler(executionContext, cancellationToken); } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs deleted file mode 100644 index 24810d7de9..0000000000 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobHandlerRegistry.cs +++ /dev/null @@ -1,62 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.Extensions.Options; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.BackgroundJobs; - -public class AnonymousJobHandlerRegistry : IAnonymousJobHandlerRegistry, ISingletonDependency -{ - private readonly ConcurrentDictionary> _handlers = new(); - private readonly AbpBackgroundJobOptions _options; - - public AnonymousJobHandlerRegistry(IOptions options) - { - _options = options.Value; - } - - public virtual void Register(string jobName, Func handler) - { - Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); - Check.NotNull(handler, nameof(handler)); - - _handlers[jobName] = handler; - } - - public virtual void Register(string jobName, Action handler) - { - Check.NotNull(handler, nameof(handler)); - - Register(jobName, (context, ct) => - { - handler(context, ct); - return Task.CompletedTask; - }); - } - - public virtual bool Unregister(string jobName) - { - Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); - return _handlers.TryRemove(jobName, out _); - } - - public virtual bool IsRegistered(string jobName) - { - Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); - return _handlers.ContainsKey(jobName) || _options.IsAnonymousJobRegistered(jobName); - } - - public virtual Func? Get(string jobName) - { - Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); - - if (_handlers.TryGetValue(jobName, out var handler)) - { - return handler; - } - - return _options.TryGetAnonymousHandler(jobName, out handler) ? handler : null; - } -} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs index 0170b881df..e8a840035f 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs @@ -16,7 +16,7 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc public ILogger Logger { protected get; set; } protected AbpBackgroundJobOptions Options { get; } - + protected ICurrentTenant CurrentTenant { get; } public BackgroundJobExecuter(IOptions options, ICurrentTenant currentTenant) @@ -28,11 +28,6 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc } public virtual async Task ExecuteAsync(JobExecutionContext context) - { - await ExecuteTypedHandlerAsync(context); - } - - protected virtual async Task ExecuteTypedHandlerAsync(JobExecutionContext context) { var job = context.ServiceProvider.GetService(context.JobType); if (job == null) @@ -50,7 +45,7 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc try { - using (CurrentTenant.Change(GetJobArgsTenantId(context.JobArgs))) + using(CurrentTenant.Change(GetJobArgsTenantId(context.JobArgs))) { var cancellationTokenProvider = context.ServiceProvider.GetRequiredService(); @@ -59,14 +54,15 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc { if (jobExecuteMethod.Name == nameof(IAsyncBackgroundJob.ExecuteAsync)) { - await ((Task)jobExecuteMethod.Invoke(job, [context.JobArgs])!); + await ((Task)jobExecuteMethod.Invoke(job, new[] { context.JobArgs })!); } else { - jobExecuteMethod.Invoke(job, [context.JobArgs]); + jobExecuteMethod.Invoke(job, new[] { context.JobArgs }); } } } + } catch (Exception ex) { @@ -83,7 +79,7 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc }; } } - + protected virtual Guid? GetJobArgsTenantId(object jobArgs) { return jobArgs switch diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs new file mode 100644 index 0000000000..4d462b8529 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs @@ -0,0 +1,112 @@ +using System; +using System.Collections.Concurrent; +using System.Reflection; +using System.Threading.Tasks; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Json; + +namespace Volo.Abp.BackgroundJobs; + +public class DefaultDynamicBackgroundJobManager : IDynamicBackgroundJobManager, ITransientDependency +{ + private static readonly ConcurrentDictionary EnqueueMethodCache = new(); + + protected IBackgroundJobManager BackgroundJobManager { get; } + protected IDynamicBackgroundJobHandlerRegistry HandlerRegistry { get; } + protected AbpBackgroundJobOptions BackgroundJobOptions { get; } + protected IJsonSerializer JsonSerializer { get; } + + public DefaultDynamicBackgroundJobManager( + IBackgroundJobManager backgroundJobManager, + IDynamicBackgroundJobHandlerRegistry handlerRegistry, + IOptions backgroundJobOptions, + IJsonSerializer jsonSerializer) + { + BackgroundJobManager = backgroundJobManager; + HandlerRegistry = handlerRegistry; + BackgroundJobOptions = backgroundJobOptions.Value; + JsonSerializer = jsonSerializer; + } + + public virtual async Task EnqueueAsync( + string jobName, + object args, + BackgroundJobPriority priority = BackgroundJobPriority.Normal, + TimeSpan? delay = null) + { + Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); + Check.NotNull(args, nameof(args)); + + var jobConfiguration = BackgroundJobOptions.GetJobOrNull(jobName); + if (jobConfiguration != null) + { + return await EnqueueTypedJobAsync(jobConfiguration, args, priority, delay); + } + + if (HandlerRegistry.IsRegistered(jobName)) + { + return await EnqueueAnonymousJobAsync(jobName, args, priority, delay); + } + + throw new AbpException( + $"No typed job configuration or dynamic handler registered for job name: {jobName}"); + } + + public virtual void RegisterHandler( + string jobName, + DynamicBackgroundJobHandler handler) + { + HandlerRegistry.Register(jobName, handler); + } + + public virtual bool UnregisterHandler(string jobName) + { + return HandlerRegistry.Unregister(jobName); + } + + public virtual bool IsHandlerRegistered(string jobName) + { + return HandlerRegistry.IsRegistered(jobName); + } + + protected virtual async Task EnqueueTypedJobAsync( + BackgroundJobConfiguration jobConfiguration, + object args, + BackgroundJobPriority priority, + TimeSpan? delay) + { + var argsType = jobConfiguration.ArgsType; + + // Normalize args to the expected type via JSON round-trip + var json = JsonSerializer.Serialize(args); + var typedArgs = JsonSerializer.Deserialize(argsType, json); + + var enqueueMethod = GetOrCreateEnqueueMethod(argsType); + var task = (Task)enqueueMethod.Invoke(BackgroundJobManager, [typedArgs, priority, delay])!; + return await task; + } + + protected virtual Task EnqueueAnonymousJobAsync( + string jobName, + object args, + BackgroundJobPriority priority, + TimeSpan? delay) + { + var jsonData = JsonSerializer.Serialize(args); + var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); + return BackgroundJobManager.EnqueueAsync(anonymousArgs, priority, delay); + } + + private static MethodInfo GetOrCreateEnqueueMethod(Type argsType) + { + return EnqueueMethodCache.GetOrAdd(argsType, static type => + { + var method = typeof(IBackgroundJobManager).GetMethod( + nameof(IBackgroundJobManager.EnqueueAsync), + BindingFlags.Public | BindingFlags.Instance); + + return method!.MakeGenericMethod(type); + }); + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutionContext.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobExecutionContext.cs similarity index 83% rename from framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutionContext.cs rename to framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobExecutionContext.cs index 42fb470c6a..6b207cac97 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutionContext.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobExecutionContext.cs @@ -2,7 +2,7 @@ using System; namespace Volo.Abp.BackgroundJobs; -public class AnonymousJobExecutionContext +public class DynamicBackgroundJobExecutionContext { public string JobName { get; } @@ -10,7 +10,7 @@ public class AnonymousJobExecutionContext public IServiceProvider ServiceProvider { get; } - public AnonymousJobExecutionContext( + public DynamicBackgroundJobExecutionContext( string jobName, string jsonData, IServiceProvider serviceProvider) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandler.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandler.cs new file mode 100644 index 0000000000..f1f9d17602 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandler.cs @@ -0,0 +1,9 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace Volo.Abp.BackgroundJobs; + +/// +/// Represents a handler delegate for dynamic background jobs. +/// +public delegate Task DynamicBackgroundJobHandler(DynamicBackgroundJobExecutionContext context, CancellationToken cancellationToken); diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerRegistry.cs new file mode 100644 index 0000000000..ce5710dd14 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerRegistry.cs @@ -0,0 +1,40 @@ +using System.Collections.Concurrent; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BackgroundJobs; + +public class DynamicBackgroundJobHandlerRegistry : IDynamicBackgroundJobHandlerRegistry, ISingletonDependency +{ + protected ConcurrentDictionary Handlers { get; } + + public DynamicBackgroundJobHandlerRegistry() + { + Handlers = new ConcurrentDictionary(); + } + + public virtual void Register(string jobName, DynamicBackgroundJobHandler handler) + { + Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); + Check.NotNull(handler, nameof(handler)); + + Handlers[jobName] = handler; + } + + public virtual bool Unregister(string jobName) + { + Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); + return Handlers.TryRemove(jobName, out _); + } + + public virtual bool IsRegistered(string jobName) + { + Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); + return Handlers.ContainsKey(jobName); + } + + public virtual DynamicBackgroundJobHandler? Get(string jobName) + { + Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); + return Handlers.TryGetValue(jobName, out var handler) ? handler : null; + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAnonymousJobHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAnonymousJobHandlerRegistry.cs deleted file mode 100644 index 7c38631018..0000000000 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAnonymousJobHandlerRegistry.cs +++ /dev/null @@ -1,17 +0,0 @@ -using System; -using System.Threading.Tasks; - -namespace Volo.Abp.BackgroundJobs; - -public interface IAnonymousJobHandlerRegistry -{ - void Register(string jobName, Func handler); - - void Register(string jobName, Action handler); - - bool Unregister(string jobName); - - bool IsRegistered(string jobName); - - Func? Get(string jobName); -} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs index dd32de559f..9b7ee34842 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs @@ -21,19 +21,4 @@ public interface IBackgroundJobManager BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null ); - - /// - /// Enqueues a job to be executed by its name. - /// - /// Name of the background job. - /// Job arguments. - /// Job priority. - /// Job delay (wait duration before first try). - /// Unique identifier of a background job. - Task EnqueueAsync( - string jobName, - object args, - BackgroundJobPriority priority = BackgroundJobPriority.Normal, - TimeSpan? delay = null - ); } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerRegistry.cs new file mode 100644 index 0000000000..dff212d65b --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerRegistry.cs @@ -0,0 +1,12 @@ +namespace Volo.Abp.BackgroundJobs; + +public interface IDynamicBackgroundJobHandlerRegistry +{ + void Register(string jobName, DynamicBackgroundJobHandler handler); + + bool Unregister(string jobName); + + bool IsRegistered(string jobName); + + DynamicBackgroundJobHandler? Get(string jobName); +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobManager.cs new file mode 100644 index 0000000000..d053a7a976 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobManager.cs @@ -0,0 +1,51 @@ +using System; +using System.Threading.Tasks; + +namespace Volo.Abp.BackgroundJobs; + +/// +/// Manages dynamic background jobs that can be enqueued by name +/// without requiring a strongly-typed job args class at compile time. +/// Also supports registering dynamic job handlers at runtime. +/// +public interface IDynamicBackgroundJobManager +{ + /// + /// Enqueues a job by name with dynamic payload. + /// If a typed job configuration exists for this name, the args will be + /// deserialized to the configured args type and enqueued through the typed pipeline. + /// If a dynamic handler is registered, the args will be wrapped as + /// and enqueued through the standard typed pipeline. + /// + /// Name of the background job. + /// Job arguments (will be serialized to JSON). + /// Job priority. + /// Job delay (wait duration before first try). + /// Unique identifier of a background job. + Task EnqueueAsync( + string jobName, + object args, + BackgroundJobPriority priority = BackgroundJobPriority.Normal, + TimeSpan? delay = null); + + /// + /// Registers a dynamic job handler at runtime. + /// + /// Unique name for the dynamic job. + /// The handler delegate to execute when the job runs. + void RegisterHandler(string jobName, DynamicBackgroundJobHandler handler); + + /// + /// Unregisters a previously registered dynamic job handler. + /// + /// Name of the dynamic job to unregister. + /// True if the handler was found and removed; false otherwise. + bool UnregisterHandler(string jobName); + + /// + /// Checks whether a dynamic handler is registered for the given job name. + /// + /// Name of the dynamic job. + /// True if registered; false otherwise. + bool IsHandlerRegistered(string jobName); +} 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 602cbef17b..e291ff7c18 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 @@ -21,10 +21,4 @@ public class NullBackgroundJobManager : IBackgroundJobManager, ISingletonDepende { 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."); } - - public virtual Task EnqueueAsync(string jobName, object 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."); - } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs index 9a09fd9ce0..989cfb4357 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs @@ -1,5 +1,4 @@ using System.Linq; -using System.Text.Json; using System.Threading; using Hangfire; using Microsoft.Extensions.Options; @@ -23,65 +22,13 @@ public class AbpDashboardOptionsProvider : ITransientDependency DisplayNameFunc = (_, job) => { var jobName = job.ToString(); - if (job.Args.Count == 3 && job.Args.Last() is CancellationToken) { - if (job.Args[1] is AnonymousJobArgs anonymousJobArgs) - { - return anonymousJobArgs.JobName; - } - jobName = AbpBackgroundJobOptions.GetJob(job.Args[1].GetType()).JobName; } - if (job.Args.Count == 4 && job.Args.Last() is CancellationToken) - { - if (job.Args[1] is string transportJobName) - { - if (transportJobName == AnonymousJobArgs.JobNameConstant && - job.Args[2] is string serializedArgs && - TryGetEffectiveJobName(serializedArgs, out var effectiveJobName)) - { - return effectiveJobName; - } - - return transportJobName; - } - } - return jobName; } }; } - - protected virtual bool TryGetEffectiveJobName(string serializedArgs, out string effectiveJobName) - { - effectiveJobName = string.Empty; - - try - { - using var document = JsonDocument.Parse(serializedArgs); - if (TryGetJobNameElement(document.RootElement, out var jobNameElement)) - { - var jobName = jobNameElement.GetString(); - if (!string.IsNullOrWhiteSpace(jobName)) - { - effectiveJobName = jobName!; - return true; - } - } - } - catch - { - // Ignore parse errors and fallback to transport job name. - } - - return false; - } - - protected virtual bool TryGetJobNameElement(JsonElement rootElement, out JsonElement jobNameElement) - { - return rootElement.TryGetProperty(nameof(AnonymousJobArgs.JobName), out jobNameElement) - || rootElement.TryGetProperty("jobName", out jobNameElement); - } } 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 9d84f1f329..004a6856ce 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 @@ -3,12 +3,9 @@ using System.Reflection; using System.Threading.Tasks; using Hangfire; using Hangfire.States; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Hangfire; -using Volo.Abp.Json; namespace Volo.Abp.BackgroundJobs.Hangfire; @@ -17,21 +14,11 @@ public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDep { protected IOptions BackgroundJobOptions { get; } protected IOptions HangfireOptions { get; } - protected IJsonSerializer JsonSerializer { get; } - protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } - public ILogger Logger { get; set; } - public HangfireBackgroundJobManager( - IOptions backgroundJobOptions, - IOptions hangfireOptions, - IJsonSerializer jsonSerializer, - IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry) + public HangfireBackgroundJobManager(IOptions backgroundJobOptions, IOptions hangfireOptions) { BackgroundJobOptions = backgroundJobOptions; HangfireOptions = hangfireOptions; - JsonSerializer = jsonSerializer; - AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; - Logger = NullLogger.Instance; } public virtual Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, @@ -47,54 +34,9 @@ public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDep )); } - public virtual Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, - TimeSpan? delay = null) - { - if (ShouldWrapAsAnonymousJob(jobName)) - { - Logger.LogInformation( - "Wrapping job into anonymous transport. TransportJobName: {TransportJobName}, EffectiveJobName: {EffectiveJobName}", - AnonymousJobArgs.JobNameConstant, - jobName - ); - var jsonData = JsonSerializer.Serialize(args); - var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); - return EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); - } - - var serializedArgs = JsonSerializer.Serialize(args); - var queueName = GetQueueName(jobName); - - return Task.FromResult(delay.HasValue - ? BackgroundJob.Schedule( - adapter => adapter.ExecuteAsync(queueName, jobName, serializedArgs, default), - delay.Value - ) - : BackgroundJob.Enqueue( - adapter => adapter.ExecuteAsync(queueName, jobName, serializedArgs, default) - )); - } - - protected virtual bool ShouldWrapAsAnonymousJob(string jobName) - { - return jobName != AnonymousJobArgs.JobNameConstant && - AnonymousJobHandlerRegistry.IsRegistered(jobName) && - BackgroundJobOptions.Value.GetJobOrNull(jobName) == null; - } - protected virtual string GetQueueName(Type argsType) { - return GetQueueName(BackgroundJobOptions.Value.GetJob(argsType)); - } - - protected virtual string GetQueueName(string jobName) - { - return GetQueueName(BackgroundJobOptions.Value.GetJob(jobName)); - } - - protected virtual string GetQueueName(BackgroundJobConfiguration jobConfiguration) - { - var queueAttribute = jobConfiguration.JobType.GetCustomAttribute(); + var queueAttribute = BackgroundJobOptions.Value.GetJob(argsType).JobType.GetCustomAttribute(); return queueAttribute != null ? HangfireOptions.Value.DefaultQueuePrefix + queueAttribute.Queue : HangfireOptions.Value.DefaultQueue; } } 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 38d6bbdf52..d2ac1ed9cc 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 @@ -3,7 +3,6 @@ using System.Threading.Tasks; using Hangfire; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; -using Volo.Abp.Json; namespace Volo.Abp.BackgroundJobs.Hangfire; @@ -39,51 +38,8 @@ public class HangfireJobExecutionAdapter using (var scope = ServiceScopeFactory.CreateScope()) { - var jobConfiguration = Options.GetJob(typeof(TArgs)); - var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType!, args!, cancellationToken: cancellationToken); - await JobExecuter.ExecuteAsync(context); - } - } -} - -public class HangfireJobExecutionAdapter -{ - protected AbpBackgroundJobOptions Options { get; } - protected IServiceScopeFactory ServiceScopeFactory { get; } - protected IBackgroundJobExecuter JobExecuter { get; } - protected IJsonSerializer JsonSerializer { get; } - - public HangfireJobExecutionAdapter( - IOptions options, - IBackgroundJobExecuter jobExecuter, - IServiceScopeFactory serviceScopeFactory, - IJsonSerializer jsonSerializer) - { - JobExecuter = jobExecuter; - ServiceScopeFactory = serviceScopeFactory; - JsonSerializer = jsonSerializer; - Options = options.Value; - } - - [Queue("{0}")] - public async Task ExecuteAsync(string queue, string jobName, string serializedArgs, CancellationToken cancellationToken = default) - { - if (!Options.IsJobExecutionEnabled) - { - throw new AbpException( - "Background job execution is disabled. " + - "This method should not be called! " + - "If you want to enable the background job execution, " + - $"set {nameof(AbpBackgroundJobOptions)}.{nameof(AbpBackgroundJobOptions.IsJobExecutionEnabled)} to true! " + - "If you've intentionally disabled job execution and this seems a bug, please report it." - ); - } - - using (var scope = ServiceScopeFactory.CreateScope()) - { - var jobConfiguration = Options.GetJob(jobName); - var args = JsonSerializer.Deserialize(jobConfiguration.ArgsType, serializedArgs); - var context = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, args, cancellationToken: cancellationToken); + var jobType = Options.GetJob(typeof(TArgs)).JobType; + var context = new JobExecutionContext(scope.ServiceProvider, jobType, args!, cancellationToken: cancellationToken); await JobExecuter.ExecuteAsync(context); } } 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 8e92b4544a..0589518c6f 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 @@ -15,7 +15,6 @@ public class AbpBackgroundJobsQuartzModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddTransient(typeof(QuartzJobExecutionAdapter<>)); - context.Services.AddTransient(); } public override void OnPreApplicationInitialization(ApplicationInitializationContext context) 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 a30b8bc9dd..b116eae539 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,7 +1,5 @@ using System; using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Quartz; using Volo.Abp.DependencyInjection; @@ -18,26 +16,14 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen protected IScheduler Scheduler { get; } protected AbpBackgroundJobQuartzOptions Options { get; } - protected AbpBackgroundJobOptions BackgroundJobOptions { get; } protected IJsonSerializer JsonSerializer { get; } - protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } - public ILogger Logger { get; set; } - - public QuartzBackgroundJobManager( - IScheduler scheduler, - IOptions options, - IOptions backgroundJobOptions, - IJsonSerializer jsonSerializer, - IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry) + public QuartzBackgroundJobManager(IScheduler scheduler, IOptions options, IJsonSerializer jsonSerializer) { Scheduler = scheduler; JsonSerializer = jsonSerializer; Options = options.Value; - BackgroundJobOptions = backgroundJobOptions.Value; - AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; - Logger = NullLogger.Instance; } public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, @@ -46,31 +32,6 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen return await ReEnqueueAsync(args, Options.RetryCount, Options.RetryIntervalMillisecond, priority, delay); } - public virtual async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, - TimeSpan? delay = null) - { - if (ShouldWrapAsAnonymousJob(jobName)) - { - Logger.LogInformation( - "Wrapping job into anonymous transport. TransportJobName: {TransportJobName}, EffectiveJobName: {EffectiveJobName}", - AnonymousJobArgs.JobNameConstant, - jobName - ); - var jsonData = JsonSerializer.Serialize(args); - var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); - return await EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); - } - - return await ReEnqueueAsync(jobName, args, Options.RetryCount, Options.RetryIntervalMillisecond, priority, delay); - } - - protected virtual bool ShouldWrapAsAnonymousJob(string jobName) - { - return jobName != AnonymousJobArgs.JobNameConstant && - AnonymousJobHandlerRegistry.IsRegistered(jobName) && - BackgroundJobOptions.GetJobOrNull(jobName) == null; - } - public virtual async Task ReEnqueueAsync(TArgs args, int retryCount, int retryIntervalMillisecond, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { @@ -87,22 +48,4 @@ public class QuartzBackgroundJobManager : IBackgroundJobManager, ITransientDepen await Scheduler.ScheduleJob(jobDetail, trigger); return jobDetail.Key.ToString(); } - - public virtual async Task ReEnqueueAsync(string jobName, object args, int retryCount, int retryIntervalMillisecond, - BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) - { - var jobDataMap = new JobDataMap - { - {QuartzJobExecutionAdapter.JobNameKey, jobName}, - {QuartzJobExecutionAdapter.JobArgsKey, JsonSerializer.Serialize(args)}, - {JobDataPrefix + nameof(Options.RetryCount), retryCount.ToString()}, - {JobDataPrefix + nameof(Options.RetryIntervalMillisecond), retryIntervalMillisecond.ToString()}, - {JobDataPrefix + 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); - 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 bba43b4156..640a01d7a0 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 @@ -39,65 +39,8 @@ public class QuartzJobExecutionAdapter : IJob using (var scope = ServiceScopeFactory.CreateScope()) { var args = JsonSerializer.Deserialize(context.JobDetail.JobDataMap.GetString(nameof(TArgs))!); - var jobConfiguration = Options.GetJob(typeof(TArgs)); - var jobContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType!, args!, context.CancellationToken); - try - { - await JobExecuter.ExecuteAsync(jobContext); - } - catch (Exception exception) - { - var jobExecutionException = new JobExecutionException(exception); - - var retryIndex = context.JobDetail.JobDataMap.GetString(QuartzBackgroundJobManager.JobDataPrefix + QuartzBackgroundJobManager.RetryIndex)!.To(); - retryIndex++; - context.JobDetail.JobDataMap.Put(QuartzBackgroundJobManager.JobDataPrefix + QuartzBackgroundJobManager.RetryIndex, retryIndex.ToString()); - - await BackgroundJobQuartzOptions.RetryStrategy.Invoke(retryIndex, context, jobExecutionException); - - throw jobExecutionException; - } - } - } -} - -public class QuartzJobExecutionAdapter : IJob -{ - public const string JobNameKey = "AbpJobName"; - public const string JobArgsKey = "AbpJobArgs"; - - public ILogger Logger { get; set; } - - protected AbpBackgroundJobOptions Options { get; } - protected AbpBackgroundJobQuartzOptions BackgroundJobQuartzOptions { get; } - protected IServiceScopeFactory ServiceScopeFactory { get; } - protected IBackgroundJobExecuter JobExecuter { get; } - protected IJsonSerializer JsonSerializer { get; } - - public QuartzJobExecutionAdapter( - IOptions options, - IOptions backgroundJobQuartzOptions, - IBackgroundJobExecuter jobExecuter, - IServiceScopeFactory serviceScopeFactory, - IJsonSerializer jsonSerializer) - { - JobExecuter = jobExecuter; - ServiceScopeFactory = serviceScopeFactory; - JsonSerializer = jsonSerializer; - Options = options.Value; - BackgroundJobQuartzOptions = backgroundJobQuartzOptions.Value; - Logger = NullLogger.Instance; - } - - public async Task Execute(IJobExecutionContext context) - { - using (var scope = ServiceScopeFactory.CreateScope()) - { - var jobName = context.JobDetail.JobDataMap.GetString(JobNameKey)!; - var serializedArgs = context.JobDetail.JobDataMap.GetString(JobArgsKey)!; - var jobConfiguration = Options.GetJob(jobName); - var args = JsonSerializer.Deserialize(jobConfiguration.ArgsType, serializedArgs); - var jobContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, args, cancellationToken: context.CancellationToken); + var jobType = Options.GetJob(typeof(TArgs)).JobType; + var jobContext = new JobExecutionContext(scope.ServiceProvider, jobType, args!, cancellationToken: context.CancellationToken); try { await JobExecuter.ExecuteAsync(jobContext); diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs index 3b99a68437..f265c488ad 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs @@ -4,16 +4,7 @@ using Volo.Abp.Threading; namespace Volo.Abp.BackgroundJobs.RabbitMQ; -public interface IJobQueue : IRunnable, IDisposable -{ - Task EnqueueAsync( - object args, - BackgroundJobPriority priority = BackgroundJobPriority.Normal, - TimeSpan? delay = null - ); -} - -public interface IJobQueue : IJobQueue +public interface IJobQueue : IRunnable, IDisposable { Task EnqueueAsync( TArgs args, diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueueManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueueManager.cs index 25339ab544..928e145b44 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueueManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueueManager.cs @@ -6,6 +6,4 @@ namespace Volo.Abp.BackgroundJobs.RabbitMQ; public interface IJobQueueManager : IRunnable { Task> GetAsync(); - - Task GetAsync(string jobName); } diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index 43250824f3..dff2a4e33a 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -75,20 +75,6 @@ public class JobQueue : IJobQueue ); } - async Task IJobQueue.EnqueueAsync( - object args, - BackgroundJobPriority priority, - TimeSpan? delay) - { - if (args is TArgs typedArgs) - { - return await EnqueueAsync(typedArgs, priority, delay); - } - - var serializedArgs = Serializer.Serialize(args); - return await EnqueueAsync((TArgs)Serializer.Deserialize(serializedArgs, typeof(TArgs)), priority, delay); - } - public virtual async Task EnqueueAsync( TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs index 48bd96bc8d..f9c7b4b1fb 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs @@ -80,31 +80,4 @@ public class JobQueueManager : IJobQueueManager, ISingletonDependency return (IJobQueue)jobQueue; } } - - public async Task GetAsync(string jobName) - { - if (JobQueues.TryGetValue(jobName, out var jobQueue)) - { - return (IJobQueue)jobQueue; - } - - using (await SyncSemaphore.LockAsync()) - { - if (JobQueues.TryGetValue(jobName, out jobQueue)) - { - return (IJobQueue)jobQueue; - } - - var jobConfiguration = Options.GetJob(jobName); - - jobQueue = (IRunnable)ServiceProvider - .GetRequiredService(typeof(IJobQueue<>).MakeGenericType(jobConfiguration.ArgsType)); - - await jobQueue.StartAsync(); - - JobQueues.TryAdd(jobName, jobQueue); - - return (IJobQueue)jobQueue; - } - } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs index 71510e83ff..79f368a778 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs @@ -1,70 +1,25 @@ using System; using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; -using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; -using Volo.Abp.Json; namespace Volo.Abp.BackgroundJobs.RabbitMQ; [Dependency(ReplaceServices = true)] public class RabbitMqBackgroundJobManager : IBackgroundJobManager, ITransientDependency { - protected IJobQueueManager JobQueueManager { get; } - protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } - protected AbpBackgroundJobOptions BackgroundJobOptions { get; } - protected IJsonSerializer JsonSerializer { get; } - public ILogger Logger { get; set; } + private readonly IJobQueueManager _jobQueueManager; - public RabbitMqBackgroundJobManager( - IJobQueueManager jobQueueManager, - IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry, - IOptions backgroundJobOptions, - IJsonSerializer jsonSerializer) + public RabbitMqBackgroundJobManager(IJobQueueManager jobQueueManager) { - JobQueueManager = jobQueueManager; - AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; - BackgroundJobOptions = backgroundJobOptions.Value; - JsonSerializer = jsonSerializer; - Logger = NullLogger.Instance; + _jobQueueManager = jobQueueManager; } - public virtual async Task EnqueueAsync( + public async Task EnqueueAsync( TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { - var jobQueue = await JobQueueManager.GetAsync(); + var jobQueue = await _jobQueueManager.GetAsync(); return (await jobQueue.EnqueueAsync(args, priority, delay))!; } - - public virtual async Task EnqueueAsync( - string jobName, - object args, - BackgroundJobPriority priority = BackgroundJobPriority.Normal, - TimeSpan? delay = null) - { - if (ShouldWrapAsAnonymousJob(jobName)) - { - Logger.LogInformation( - "Wrapping job into anonymous transport. TransportJobName: {TransportJobName}, EffectiveJobName: {EffectiveJobName}", - AnonymousJobArgs.JobNameConstant, - jobName - ); - var jsonData = JsonSerializer.Serialize(args); - var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); - return await EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); - } - - var jobQueue = await JobQueueManager.GetAsync(jobName); - return (await jobQueue.EnqueueAsync(args, priority, delay))!; - } - - protected virtual bool ShouldWrapAsAnonymousJob(string jobName) - { - return jobName != AnonymousJobArgs.JobNameConstant && - AnonymousJobHandlerRegistry.IsRegistered(jobName) && - BackgroundJobOptions.GetJobOrNull(jobName) == null; - } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs index 421fc752e6..4ff3adbfe4 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs @@ -54,8 +54,8 @@ public class AbpBackgroundJobsTickerQModule : AbpModule { var jobExecuter = serviceProvider.GetRequiredService(); var args = await TickerRequestProvider.GetRequestAsync(context, cancellationToken); - var jobConfiguration = options.GetJob(typeof(TArgs)); - var jobExecutionContext = new JobExecutionContext(scope.ServiceProvider, jobConfiguration.JobType, args!, cancellationToken: cancellationToken); + var jobType = options.GetJob(typeof(TArgs)).JobType; + var jobExecutionContext = new JobExecutionContext(scope.ServiceProvider, jobType, args!, cancellationToken: cancellationToken); await jobExecuter.ExecuteAsync(jobExecutionContext); } }; diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs index 82df9e2fe7..daeb92cc78 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs @@ -1,85 +1,39 @@ using System; -using System.Reflection; using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using TickerQ.Utilities; using TickerQ.Utilities.Entities; using TickerQ.Utilities.Interfaces.Managers; using Volo.Abp.DependencyInjection; -using Volo.Abp.Json; namespace Volo.Abp.BackgroundJobs.TickerQ; [Dependency(ReplaceServices = true)] public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientDependency { - private readonly static MethodInfo CreateTickerRequestMethod = typeof(TickerHelper).GetMethod(nameof(TickerHelper.CreateTickerRequest), BindingFlags.Public | BindingFlags.Static)!; - protected ITimeTickerManager TimeTickerManager { get; } protected AbpBackgroundJobOptions Options { get; } protected AbpBackgroundJobsTickerQOptions TickerQOptions { get; } - protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } - protected IJsonSerializer JsonSerializer { get; } - public ILogger Logger { get; set; } public AbpTickerQBackgroundJobManager( ITimeTickerManager timeTickerManager, IOptions options, - IOptions tickerQOptions, - IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry, - IJsonSerializer jsonSerializer) + IOptions tickerQOptions) { TimeTickerManager = timeTickerManager; Options = options.Value; TickerQOptions = tickerQOptions.Value; - AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; - JsonSerializer = jsonSerializer; - Logger = NullLogger.Instance; } public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { var job = Options.GetJob(typeof(TArgs)); - return await EnqueueAsync(job, args!, priority, delay); - } - - public virtual async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) - { - if (ShouldWrapAsAnonymousJob(jobName)) - { - Logger.LogInformation( - "Wrapping job into anonymous transport. TransportJobName: {TransportJobName}, EffectiveJobName: {EffectiveJobName}", - AnonymousJobArgs.JobNameConstant, - jobName - ); - var jsonData = JsonSerializer.Serialize(args); - var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); - return await EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); - } - - var job = Options.GetJob(jobName); - return await EnqueueAsync(job, args, priority, delay); - } - - protected virtual bool ShouldWrapAsAnonymousJob(string jobName) - { - return jobName != AnonymousJobArgs.JobNameConstant && - AnonymousJobHandlerRegistry.IsRegistered(jobName) && - Options.GetJobOrNull(jobName) == null; - } - - protected virtual async Task EnqueueAsync(BackgroundJobConfiguration job, object args, BackgroundJobPriority priority, TimeSpan? delay) - { - var normalizedArgs = NormalizeArgs(job.ArgsType, args); - var timeTicker = new TimeTickerEntity { Id = Guid.NewGuid(), Function = job.JobName, ExecutionTime = delay == null ? DateTime.UtcNow : DateTime.UtcNow.Add(delay.Value), - Request = CreateTickerRequest(job.ArgsType, normalizedArgs), + Request = TickerHelper.CreateTickerRequest(args), }; var config = TickerQOptions.GetConfigurationOrNull(job.JobType); @@ -93,22 +47,4 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD var result = await TimeTickerManager.AddAsync(timeTicker); return !result.IsSucceeded ? timeTicker.Id.ToString() : result.Result.Id.ToString(); } - - protected virtual object NormalizeArgs(Type argsType, object args) - { - if (argsType.IsInstanceOfType(args)) - { - return args; - } - - var serialized = JsonSerializer.Serialize(args); - return JsonSerializer.Deserialize(argsType, serialized)!; - } - - protected virtual byte[]? CreateTickerRequest(Type argsType, object args) - { - return (byte[]?)CreateTickerRequestMethod - .MakeGenericMethod(argsType) - .Invoke(null, [args]); - } } diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs index 4714e11e72..fb0891d8aa 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs @@ -1,7 +1,5 @@ using System; using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Volo.Abp.BackgroundWorkers; using Volo.Abp.DependencyInjection; @@ -20,50 +18,34 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe protected IBackgroundJobSerializer Serializer { get; } protected IGuidGenerator GuidGenerator { get; } protected IBackgroundJobStore Store { get; } - protected IAnonymousJobHandlerRegistry AnonymousJobHandlerRegistry { get; } protected IOptions BackgroundJobOptions { get; } protected IOptions BackgroundJobWorkerOptions { get; } - public ILogger Logger { get; set; } public DefaultBackgroundJobManager( IClock clock, IBackgroundJobSerializer serializer, IBackgroundJobStore store, IGuidGenerator guidGenerator, - IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry, IOptions backgroundJobOptions, IOptions backgroundJobWorkerOptions) { Clock = clock; Serializer = serializer; GuidGenerator = guidGenerator; - AnonymousJobHandlerRegistry = anonymousJobHandlerRegistry; BackgroundJobOptions = backgroundJobOptions; BackgroundJobWorkerOptions = backgroundJobWorkerOptions; Store = store; - Logger = NullLogger.Instance; } public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { var jobName = BackgroundJobOptions.Value.GetBackgroundJobName(typeof(TArgs)); - return await EnqueueAsync(jobName, args!, priority, delay); + var jobId = await EnqueueAsync(jobName, args!, priority, delay); + return jobId.ToString(); } - public virtual async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) + protected virtual async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { - if (ShouldWrapAsAnonymousJob(jobName)) - { - Logger.LogInformation( - "Wrapping job into anonymous transport. TransportJobName: {TransportJobName}, EffectiveJobName: {EffectiveJobName}", - AnonymousJobArgs.JobNameConstant, - jobName - ); - var jsonData = Serializer.Serialize(args); - var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); - return await EnqueueAsync(AnonymousJobArgs.JobNameConstant, anonymousArgs, priority, delay); - } - var jobInfo = new BackgroundJobInfo { Id = GuidGenerator.Create(), @@ -82,13 +64,6 @@ public class DefaultBackgroundJobManager : IBackgroundJobManager, ITransientDepe await Store.InsertAsync(jobInfo); - return jobInfo.Id.ToString(); - } - - protected virtual bool ShouldWrapAsAnonymousJob(string jobName) - { - return jobName != AnonymousJobArgs.JobNameConstant && - AnonymousJobHandlerRegistry.IsRegistered(jobName) && - BackgroundJobOptions.Value.GetJobOrNull(jobName) == null; + return jobInfo.Id; } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs index 72ada6dbd8..8eaca8928d 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs @@ -14,15 +14,17 @@ public class AbpBackgroundJobsTestModule : AbpModule public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddSingleton(); + } + + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var dynamicJobManager = context.ServiceProvider.GetRequiredService(); + var tracker = context.ServiceProvider.GetRequiredService(); - Configure(options => + dynamicJobManager.RegisterHandler("TestAnonymousJob", (ctx, ct) => { - options.AddAnonymousJobHandler("TestAnonymousJob", (context, ct) => - { - var tracker = context.ServiceProvider.GetRequiredService(); - tracker.ExecutedJsonData.Add(context.JsonData); - return System.Threading.Tasks.Task.CompletedTask; - }); + tracker.ExecutedJsonData.Add(ctx.JsonData); + return System.Threading.Tasks.Task.CompletedTask; }); } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs index 3b7173942b..db7b5f5cc8 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Shouldly; @@ -137,54 +136,4 @@ public class BackgroundJobExecuter_Tests : BackgroundJobsTestBase //Assert asyncJobObject.Canceled.ShouldBeTrue(); } - - [Fact] - public async Task Should_Execute_Anonymous_Job_Handler() - { - var tracker = GetRequiredService(); - tracker.ExecutedJsonData.ShouldBeEmpty(); - - var args = new AnonymousJobArgs("TestAnonymousJob", "{\"OrderId\":\"ORD-001\"}"); - - await _backgroundJobExecuter.ExecuteAsync( - new JobExecutionContext( - ServiceProvider, - typeof(AnonymousJobExecutorAsyncBackgroundJob), - args - ) - ); - - tracker.ExecutedJsonData.Count.ShouldBe(1); - tracker.ExecutedJsonData[0].ShouldContain("ORD-001"); - } - - [Fact] - public async Task Should_Execute_Anonymous_Job_Handler_Registered_At_Runtime() - { - var handlerRegistry = GetRequiredService(); - var executedValues = new List(); - - handlerRegistry.Register("RuntimeAnonymousJob", (context, ct) => - { - executedValues.Add(context.JsonData); - return Task.CompletedTask; - }); - - var args = new AnonymousJobArgs("RuntimeAnonymousJob", "{\"Message\":\"hello-runtime\"}"); - - await _backgroundJobExecuter.ExecuteAsync( - new JobExecutionContext( - ServiceProvider, - typeof(AnonymousJobExecutorAsyncBackgroundJob), - args - ) - ); - - executedValues.Count.ShouldBe(1); - executedValues[0].ShouldContain("hello-runtime"); - - handlerRegistry.IsRegistered("RuntimeAnonymousJob").ShouldBeTrue(); - handlerRegistry.Unregister("RuntimeAnonymousJob").ShouldBeTrue(); - handlerRegistry.IsRegistered("RuntimeAnonymousJob").ShouldBeFalse(); - } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs index 948c1b9f4a..ebfd04c20e 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs @@ -1,5 +1,4 @@ using System; -using System.Collections.Generic; using System.Threading.Tasks; using Shouldly; using Xunit; @@ -9,14 +8,14 @@ namespace Volo.Abp.BackgroundJobs; public class BackgroundJobManager_Tests : BackgroundJobsTestBase { private readonly IBackgroundJobManager _backgroundJobManager; + private readonly IDynamicBackgroundJobManager _dynamicBackgroundJobManager; private readonly IBackgroundJobStore _backgroundJobStore; - private readonly IAnonymousJobHandlerRegistry _anonymousJobHandlerRegistry; public BackgroundJobManager_Tests() { _backgroundJobManager = GetRequiredService(); + _dynamicBackgroundJobManager = GetRequiredService(); _backgroundJobStore = GetRequiredService(); - _anonymousJobHandlerRegistry = GetRequiredService(); } [Fact] @@ -39,7 +38,7 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase public async Task Should_Store_Jobs_With_JobName() { var jobName = BackgroundJobNameAttribute.GetName(); - var jobIdAsString = await _backgroundJobManager.EnqueueAsync(jobName, (object)new + var jobIdAsString = await _dynamicBackgroundJobManager.EnqueueAsync(jobName, new { Value = "42" }); @@ -54,10 +53,7 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase public async Task Should_Store_Async_Jobs_With_JobName() { var jobName = BackgroundJobNameAttribute.GetName(); - var jobIdAsString = await _backgroundJobManager.EnqueueAsync(jobName, (object)new Dictionary() - { - ["Value"] = "42" - }); + var jobIdAsString = await _dynamicBackgroundJobManager.EnqueueAsync(jobName, new { Value = "42" }); jobIdAsString.ShouldNotBe(default); var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); @@ -68,7 +64,7 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase [Fact] public async Task Should_Store_Anonymous_Jobs() { - var jobIdAsString = await _backgroundJobManager.EnqueueAsync("TestAnonymousJob", new { OrderId = "ORD-001" }); + var jobIdAsString = await _dynamicBackgroundJobManager.EnqueueAsync("TestAnonymousJob", new { OrderId = "ORD-001" }); jobIdAsString.ShouldNotBe(default); var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); @@ -82,9 +78,9 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase public async Task Should_Not_Wrap_If_Typed_Job_Exists_For_Same_Name() { var typedJobName = BackgroundJobNameAttribute.GetName(); - _anonymousJobHandlerRegistry.Register(typedJobName, (_, _) => Task.CompletedTask); + _dynamicBackgroundJobManager.RegisterHandler(typedJobName, (_, _) => Task.CompletedTask); - var jobIdAsString = await _backgroundJobManager.EnqueueAsync(typedJobName, new { Value = "42" }); + var jobIdAsString = await _dynamicBackgroundJobManager.EnqueueAsync(typedJobName, new { Value = "42" }); jobIdAsString.ShouldNotBe(default); var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); @@ -92,4 +88,24 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase jobInfo.JobName.ShouldBe(typedJobName); jobInfo.JobName.ShouldNotBe(AnonymousJobArgs.JobNameConstant); } + + [Fact] + public async Task Should_Throw_For_Unknown_Job_Name() + { + await Assert.ThrowsAsync(() => + _dynamicBackgroundJobManager.EnqueueAsync("NonExistentJob", new { Value = "42" }) + ); + } + + [Fact] + public void Should_Register_And_Unregister_Handler() + { + _dynamicBackgroundJobManager.IsHandlerRegistered("TestDynamic").ShouldBeFalse(); + + _dynamicBackgroundJobManager.RegisterHandler("TestDynamic", (_, _) => Task.CompletedTask); + _dynamicBackgroundJobManager.IsHandlerRegistered("TestDynamic").ShouldBeTrue(); + + _dynamicBackgroundJobManager.UnregisterHandler("TestDynamic").ShouldBeTrue(); + _dynamicBackgroundJobManager.IsHandlerRegistered("TestDynamic").ShouldBeFalse(); + } } diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs index 7e9e4076ec..3c03e7bac6 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs @@ -11,23 +11,26 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared [DependsOn(typeof(AbpMultiTenancyModule))] public class DemoAppSharedModule : AbpModule { - public override void ConfigureServices(ServiceConfigurationContext context) + public override void OnApplicationInitialization(ApplicationInitializationContext context) { - Configure(options => + var dynamicJobManager = context.ServiceProvider.GetService(); + if (dynamicJobManager == null) { - options.AddAnonymousJobHandler("CompileTimeAnonymousJob", (ctx, ct) => + return; + } + + dynamicJobManager.RegisterHandler("CompileTimeAnonymousJob", (ctx, ct) => + { + using (var doc = JsonDocument.Parse(ctx.JsonData)) { - using (var doc = JsonDocument.Parse(ctx.JsonData)) - { - var value = doc.RootElement.TryGetProperty("value", out var prop) + var value = doc.RootElement.TryGetProperty("value", out var prop) + ? prop.GetString() + : doc.RootElement.TryGetProperty("Value", out prop) ? prop.GetString() - : doc.RootElement.TryGetProperty("Value", out prop) - ? prop.GetString() - : null; - Console.WriteLine($"[ANONYMOUS-COMPILE] {value}"); - return Task.CompletedTask; - } - }); + : null; + Console.WriteLine($"[ANONYMOUS-COMPILE] {value}"); + return Task.CompletedTask; + } }); } diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs index 8fa6c1af88..ac0d662e26 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs @@ -9,14 +9,14 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs public class SampleJobCreator : ITransientDependency { private readonly IBackgroundJobManager _backgroundJobManager; - private readonly IAnonymousJobHandlerRegistry _anonymousJobHandlerRegistry; + private readonly IDynamicBackgroundJobManager? _dynamicBackgroundJobManager; public SampleJobCreator( IBackgroundJobManager backgroundJobManager, - IAnonymousJobHandlerRegistry anonymousJobHandlerRegistry) + IDynamicBackgroundJobManager? dynamicBackgroundJobManager = null) { _backgroundJobManager = backgroundJobManager; - _anonymousJobHandlerRegistry = anonymousJobHandlerRegistry; + _dynamicBackgroundJobManager = dynamicBackgroundJobManager; } public void CreateJobs() @@ -26,7 +26,17 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs public async Task CreateJobsAsync() { - _anonymousJobHandlerRegistry.Register("RuntimeAnonymousJob", (context, ct) => + // Type-safe enqueue (existing) + await _backgroundJobManager.EnqueueAsync(new WriteToConsoleGreenJobArgs { Value = "test 1 (green) - typed" }); + await _backgroundJobManager.EnqueueAsync(new WriteToConsoleYellowJobArgs { Value = "test 1 (yellow) - typed" }); + + if (_dynamicBackgroundJobManager == null) + { + return; + } + + // Register runtime dynamic handler + _dynamicBackgroundJobManager.RegisterHandler("RuntimeAnonymousJob", (context, ct) => { using (var doc = JsonDocument.Parse(context.JsonData)) { @@ -40,35 +50,32 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs } }); - // Type-safe enqueue (existing) - await _backgroundJobManager.EnqueueAsync(new WriteToConsoleGreenJobArgs { Value = "test 1 (green) - typed" }); - await _backgroundJobManager.EnqueueAsync(new WriteToConsoleYellowJobArgs { Value = "test 1 (yellow) - typed" }); - - // String-based enqueue with strongly-typed args - await _backgroundJobManager.EnqueueAsync( + // String-based enqueue with typed job (by name) + await _dynamicBackgroundJobManager.EnqueueAsync( "GreenJob", - (object)new WriteToConsoleGreenJobArgs { Value = "test 2 (green) - by name, typed args" } + new WriteToConsoleGreenJobArgs { Value = "test 2 (green) - by name, typed args" } ); - await _backgroundJobManager.EnqueueAsync( + await _dynamicBackgroundJobManager.EnqueueAsync( "YellowJob", - (object)new WriteToConsoleYellowJobArgs { Value = "test 2 (yellow) - by name, typed args" } + new WriteToConsoleYellowJobArgs { Value = "test 2 (yellow) - by name, typed args" } ); - // String-based enqueue with anonymous object - await _backgroundJobManager.EnqueueAsync( + // String-based enqueue with anonymous object (typed job path) + await _dynamicBackgroundJobManager.EnqueueAsync( "GreenJob", - (object)new { Value = "test 3 (green) - by name, anonymous", Time = DateTime.Now } + new { Value = "test 3 (green) - by name, anonymous", Time = DateTime.Now } ); - await _backgroundJobManager.EnqueueAsync( + await _dynamicBackgroundJobManager.EnqueueAsync( "YellowJob", - (object)new { Value = "test 3 (yellow) - by name, anonymous", Time = DateTime.Now } + new { Value = "test 3 (yellow) - by name, anonymous", Time = DateTime.Now } ); - await _backgroundJobManager.EnqueueAsync( + // Dynamic job handlers + await _dynamicBackgroundJobManager.EnqueueAsync( "CompileTimeAnonymousJob", new { Value = "test 4 (anonymous) - compile-time" } ); - await _backgroundJobManager.EnqueueAsync( + await _dynamicBackgroundJobManager.EnqueueAsync( "RuntimeAnonymousJob", new { Value = "test 5 (anonymous) - runtime" } ); From a18cd1c5e9e81da63da1e90cc9d80d3106afed47 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 20 Mar 2026 18:18:16 +0800 Subject: [PATCH 27/40] fix: Refactor background worker handler to use delegate type for improved clarity and consistency --- .../HangfireDynamicBackgroundWorkerManager.cs | 2 +- .../Quartz/QuartzDynamicBackgroundWorkerManager.cs | 2 +- .../TickerQ/TickerQDynamicBackgroundWorkerManager.cs | 3 +-- .../DefaultDynamicBackgroundWorkerManager.cs | 4 ++-- .../DynamicBackgroundWorkerHandler.cs | 6 ++++++ .../DynamicBackgroundWorkerHandlerRegistry.cs | 11 ++++------- .../DynamicBackgroundWorkerManagerExtensions.cs | 3 +-- .../IDynamicBackgroundWorkerHandlerRegistry.cs | 8 ++------ .../IDynamicBackgroundWorkerManager.cs | 3 +-- .../InMemoryDynamicBackgroundWorker.cs | 6 ++---- 10 files changed, 21 insertions(+), 27 deletions(-) create mode 100644 framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandler.cs diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs index 5f310827a2..77e7d37a97 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs @@ -31,7 +31,7 @@ public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMa public virtual Task AddAsync( string workerName, DynamicBackgroundWorkerSchedule schedule, - Func handler, + DynamicBackgroundWorkerHandler handler, CancellationToken cancellationToken = default) { Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs index 7ff3f85a1d..8f409e011d 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs @@ -29,7 +29,7 @@ public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMana public virtual async Task AddAsync( string workerName, DynamicBackgroundWorkerSchedule schedule, - Func handler, + DynamicBackgroundWorkerHandler handler, CancellationToken cancellationToken = default) { Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs index 5cbeb12faf..b5f1cfcbe4 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs @@ -1,4 +1,3 @@ -using System; using System.Threading; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; @@ -11,7 +10,7 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan public virtual Task AddAsync( string workerName, DynamicBackgroundWorkerSchedule schedule, - Func handler, + DynamicBackgroundWorkerHandler handler, CancellationToken cancellationToken = default) { throw new AbpException( diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs index 598bd74014..a3073d0e53 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs @@ -30,7 +30,7 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan public virtual async Task AddAsync( string workerName, DynamicBackgroundWorkerSchedule schedule, - Func handler, + DynamicBackgroundWorkerHandler handler, CancellationToken cancellationToken = default) { Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); @@ -155,7 +155,7 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan protected virtual InMemoryDynamicBackgroundWorker CreateDynamicWorker( string workerName, DynamicBackgroundWorkerSchedule schedule, - Func handler) + DynamicBackgroundWorkerHandler handler) { var timer = ServiceProvider.GetRequiredService(); var serviceScopeFactory = ServiceProvider.GetRequiredService(); diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandler.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandler.cs new file mode 100644 index 0000000000..28f5c933d8 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandler.cs @@ -0,0 +1,6 @@ +using System.Threading; +using System.Threading.Tasks; + +namespace Volo.Abp.BackgroundWorkers; + +public delegate Task DynamicBackgroundWorkerHandler(DynamicBackgroundWorkerExecutionContext context, CancellationToken cancellationToken); \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandlerRegistry.cs index 0f9ea8c022..a30ea3e95a 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandlerRegistry.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandlerRegistry.cs @@ -1,21 +1,18 @@ -using System; using System.Collections.Concurrent; -using System.Threading; -using System.Threading.Tasks; using Volo.Abp.DependencyInjection; namespace Volo.Abp.BackgroundWorkers; public class DynamicBackgroundWorkerHandlerRegistry : IDynamicBackgroundWorkerHandlerRegistry, ISingletonDependency { - protected ConcurrentDictionary> Handlers { get; } + protected ConcurrentDictionary Handlers { get; } public DynamicBackgroundWorkerHandlerRegistry() { - Handlers = new ConcurrentDictionary>(); + Handlers = new ConcurrentDictionary(); } - public virtual void Register(string workerName, Func handler) + public virtual void Register(string workerName, DynamicBackgroundWorkerHandler handler) { Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); Check.NotNull(handler, nameof(handler)); @@ -35,7 +32,7 @@ public class DynamicBackgroundWorkerHandlerRegistry : IDynamicBackgroundWorkerHa return Handlers.ContainsKey(workerName); } - public virtual Func? Get(string workerName) + public virtual DynamicBackgroundWorkerHandler? Get(string workerName) { Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); return Handlers.TryGetValue(workerName, out var handler) ? handler : null; diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManagerExtensions.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManagerExtensions.cs index 498a37e28b..5fedbf1360 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManagerExtensions.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManagerExtensions.cs @@ -1,4 +1,3 @@ -using System; using System.Threading; using System.Threading.Tasks; @@ -12,7 +11,7 @@ public static class DynamicBackgroundWorkerManagerExtensions public static Task AddAsync( this IDynamicBackgroundWorkerManager manager, string workerName, - Func handler, + DynamicBackgroundWorkerHandler handler, CancellationToken cancellationToken = default) { return manager.AddAsync( diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerHandlerRegistry.cs index eb0db0e6d0..7915f108db 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerHandlerRegistry.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerHandlerRegistry.cs @@ -1,16 +1,12 @@ -using System; -using System.Threading; -using System.Threading.Tasks; - namespace Volo.Abp.BackgroundWorkers; public interface IDynamicBackgroundWorkerHandlerRegistry { - void Register(string workerName, Func handler); + void Register(string workerName, DynamicBackgroundWorkerHandler handler); bool Unregister(string workerName); bool IsRegistered(string workerName); - Func? Get(string workerName); + DynamicBackgroundWorkerHandler? Get(string workerName); } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs index 317aa36433..5054f67897 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs @@ -1,4 +1,3 @@ -using System; using System.Threading; using System.Threading.Tasks; @@ -17,7 +16,7 @@ public interface IDynamicBackgroundWorkerManager Task AddAsync( string workerName, DynamicBackgroundWorkerSchedule schedule, - Func handler, + DynamicBackgroundWorkerHandler handler, CancellationToken cancellationToken = default); /// diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs index 5001e96ff4..bab468a655 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/InMemoryDynamicBackgroundWorker.cs @@ -1,8 +1,6 @@ -using System; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using Volo.Abp.Threading; namespace Volo.Abp.BackgroundWorkers; @@ -11,12 +9,12 @@ public class InMemoryDynamicBackgroundWorker : AsyncPeriodicBackgroundWorkerBase { public string WorkerName { get; } - private readonly Func _handler; + private readonly DynamicBackgroundWorkerHandler _handler; public InMemoryDynamicBackgroundWorker( string workerName, DynamicBackgroundWorkerSchedule schedule, - Func handler, + DynamicBackgroundWorkerHandler handler, AbpAsyncTimer timer, IServiceScopeFactory serviceScopeFactory) : base(timer, serviceScopeFactory) From 5d74d97566a0ae4850f4f720af69bbe9310a836f Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 20 Mar 2026 20:01:07 +0800 Subject: [PATCH 28/40] Fix whitespace issues and update job handler registration in background job management --- .../BackgroundJobConfiguration.cs | 2 +- .../BackgroundJobs/BackgroundJobExecuter.cs | 2 +- .../DefaultDynamicBackgroundJobManager.cs | 9 ++-- .../Abp/BackgroundJobs/JobExecutionContext.cs | 2 +- .../Hangfire/AbpDashboardOptionsProvider.cs | 11 ++++- .../Hangfire/HangfireBackgroundJobManager.cs | 2 +- .../Hangfire/HangfireJobExecutionAdapter.cs | 2 +- .../Quartz/AbpBackgroundJobsQuartzModule.cs | 2 +- .../Quartz/QuartzBackgroundJobManager.cs | 2 +- .../Quartz/QuartzJobExecutionAdapter.cs | 2 +- .../Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs | 2 +- .../RabbitMQ/IJobQueueManager.cs | 2 +- .../Abp/BackgroundJobs/RabbitMQ/JobQueue.cs | 2 +- .../RabbitMQ/JobQueueManager.cs | 2 +- .../RabbitMQ/RabbitMqBackgroundJobManager.cs | 2 +- .../TickerQ/AbpBackgroundJobsTickerQModule.cs | 2 +- .../TickerQ/AbpTickerQBackgroundJobManager.cs | 2 +- .../Abp/BackgroundJobs/BackgroundJobWorker.cs | 2 +- .../DefaultBackgroundJobManager.cs | 2 +- .../AbpBackgroundJobsTestModule.cs | 8 ++-- .../BackgroundJobManager_Tests.cs | 42 ++++++++++++++----- ...acker.cs => DynamicJobExecutionTracker.cs} | 2 +- .../DemoAppSharedModule.cs | 6 +-- .../Jobs/SampleJobCreator.cs | 9 +--- 24 files changed, 71 insertions(+), 50 deletions(-) rename framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/{AnonymousJobExecutionTracker.cs => DynamicJobExecutionTracker.cs} (76%) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs index fa54ab5538..c17ccdc443 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobConfiguration.cs @@ -1,4 +1,4 @@ -using System; +using System; namespace Volo.Abp.BackgroundJobs; diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs index e8a840035f..6b6d822c50 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs @@ -1,4 +1,4 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using System; diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs index 4d462b8529..ce1696ca50 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Concurrent; +using System.Linq; using System.Reflection; using System.Threading.Tasks; using Microsoft.Extensions.Options; @@ -102,11 +103,11 @@ public class DefaultDynamicBackgroundJobManager : IDynamicBackgroundJobManager, { return EnqueueMethodCache.GetOrAdd(argsType, static type => { - var method = typeof(IBackgroundJobManager).GetMethod( - nameof(IBackgroundJobManager.EnqueueAsync), - BindingFlags.Public | BindingFlags.Instance); + var method = typeof(IBackgroundJobManager) + .GetMethods(BindingFlags.Public | BindingFlags.Instance) + .Single(m => m.Name == nameof(IBackgroundJobManager.EnqueueAsync) && m.IsGenericMethodDefinition); - return method!.MakeGenericMethod(type); + return method.MakeGenericMethod(type); }); } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs index 4ef2d2c19d..ae7e098070 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading; using Volo.Abp.DependencyInjection; diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs index 989cfb4357..68a6784cb5 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs @@ -1,4 +1,4 @@ -using System.Linq; +using System.Linq; using System.Threading; using Hangfire; using Microsoft.Extensions.Options; @@ -24,7 +24,14 @@ public class AbpDashboardOptionsProvider : ITransientDependency var jobName = job.ToString(); if (job.Args.Count == 3 && job.Args.Last() is CancellationToken) { - jobName = AbpBackgroundJobOptions.GetJob(job.Args[1].GetType()).JobName; + if (job.Args[1] is AnonymousJobArgs anonymousJobArgs) + { + jobName = anonymousJobArgs.JobName; + } + else + { + jobName = AbpBackgroundJobOptions.GetJob(job.Args[1].GetType()).JobName; + } } return jobName; 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 004a6856ce..0a47399e49 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 @@ -1,4 +1,4 @@ -using System; +using System; using System.Reflection; using System.Threading.Tasks; using Hangfire; 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 d2ac1ed9cc..8790243334 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,4 @@ -using System.Threading; +using System.Threading; using System.Threading.Tasks; using Hangfire; using Microsoft.Extensions.DependencyInjection; 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 0589518c6f..6b2d8f36e0 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,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Modularity; 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 b116eae539..135c2fc6f7 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,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Options; using Quartz; 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 640a01d7a0..9005164043 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,4 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs index f265c488ad..b285f598cc 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueue.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Volo.Abp.Threading; diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueueManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueueManager.cs index 928e145b44..5e0ef18270 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueueManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/IJobQueueManager.cs @@ -1,4 +1,4 @@ -using System.Threading.Tasks; +using System.Threading.Tasks; using Volo.Abp.Threading; namespace Volo.Abp.BackgroundJobs.RabbitMQ; diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs index dff2a4e33a..ddc2613b47 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueue.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Globalization; using System.Threading; diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs index f9c7b4b1fb..09d27aea23 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/JobQueueManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Concurrent; using System.Threading; using System.Threading.Tasks; diff --git a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs index 79f368a778..d81b2758b0 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.RabbitMQ/Volo/Abp/BackgroundJobs/RabbitMQ/RabbitMqBackgroundJobManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs index 4ff3adbfe4..157f0cc050 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using System.Reflection; using Microsoft.Extensions.DependencyInjection; diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs index daeb92cc78..638c1845f2 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Options; using TickerQ.Utilities; diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs index 159f11a6d3..a015e32d66 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Linq; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs index fb0891d8aa..586b66b5d1 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/DefaultBackgroundJobManager.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Threading.Tasks; using Microsoft.Extensions.Options; using Volo.Abp.BackgroundWorkers; diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs index 8eaca8928d..8f08d67c79 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs @@ -13,15 +13,17 @@ public class AbpBackgroundJobsTestModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { - context.Services.AddSingleton(); + context.Services.AddSingleton(); } public override void OnApplicationInitialization(ApplicationInitializationContext context) { + // Register handler via the singleton registry (through the transient manager). + // The handler persists because IDynamicBackgroundJobHandlerRegistry is a singleton. var dynamicJobManager = context.ServiceProvider.GetRequiredService(); - var tracker = context.ServiceProvider.GetRequiredService(); + var tracker = context.ServiceProvider.GetRequiredService(); - dynamicJobManager.RegisterHandler("TestAnonymousJob", (ctx, ct) => + dynamicJobManager.RegisterHandler("TestDynamicJob", (ctx, ct) => { tracker.ExecutedJsonData.Add(ctx.JsonData); return System.Threading.Tasks.Task.CompletedTask; diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs index ebfd04c20e..c414e7b01a 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs @@ -10,12 +10,16 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase private readonly IBackgroundJobManager _backgroundJobManager; private readonly IDynamicBackgroundJobManager _dynamicBackgroundJobManager; private readonly IBackgroundJobStore _backgroundJobStore; + private readonly IBackgroundJobExecuter _backgroundJobExecuter; + private readonly DynamicJobExecutionTracker _tracker; public BackgroundJobManager_Tests() { _backgroundJobManager = GetRequiredService(); _dynamicBackgroundJobManager = GetRequiredService(); _backgroundJobStore = GetRequiredService(); + _backgroundJobExecuter = GetRequiredService(); + _tracker = GetRequiredService(); } [Fact] @@ -35,7 +39,7 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase } [Fact] - public async Task Should_Store_Jobs_With_JobName() + public async Task Should_Enqueue_Typed_Job_By_Name() { var jobName = BackgroundJobNameAttribute.GetName(); var jobIdAsString = await _dynamicBackgroundJobManager.EnqueueAsync(jobName, new @@ -50,7 +54,7 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase } [Fact] - public async Task Should_Store_Async_Jobs_With_JobName() + public async Task Should_Enqueue_Async_Typed_Job_By_Name() { var jobName = BackgroundJobNameAttribute.GetName(); var jobIdAsString = await _dynamicBackgroundJobManager.EnqueueAsync(jobName, new { Value = "42" }); @@ -62,20 +66,36 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase } [Fact] - public async Task Should_Store_Anonymous_Jobs() + public async Task Should_Enqueue_Dynamic_Handler_Job() { - var jobIdAsString = await _dynamicBackgroundJobManager.EnqueueAsync("TestAnonymousJob", new { OrderId = "ORD-001" }); + var jobIdAsString = await _dynamicBackgroundJobManager.EnqueueAsync("TestDynamicJob", new { OrderId = "ORD-001" }); jobIdAsString.ShouldNotBe(default); var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); jobInfo.ShouldNotBeNull(); jobInfo.JobName.ShouldBe(AnonymousJobArgs.JobNameConstant); - jobInfo.JobArgs.ShouldContain("TestAnonymousJob"); + jobInfo.JobArgs.ShouldContain("TestDynamicJob"); jobInfo.JobArgs.ShouldContain("ORD-001"); } [Fact] - public async Task Should_Not_Wrap_If_Typed_Job_Exists_For_Same_Name() + public async Task Should_Execute_Dynamic_Handler_Job() + { + _tracker.ExecutedJsonData.ShouldBeEmpty(); + + await _backgroundJobExecuter.ExecuteAsync( + new JobExecutionContext( + ServiceProvider, + typeof(AnonymousJobExecutorAsyncBackgroundJob), + new AnonymousJobArgs("TestDynamicJob", "{\"OrderId\":\"ORD-001\"}") + ) + ); + + _tracker.ExecutedJsonData.ShouldContain(d => d.Contains("ORD-001")); + } + + [Fact] + public async Task Should_Prefer_Typed_Job_Over_Dynamic_Handler() { var typedJobName = BackgroundJobNameAttribute.GetName(); _dynamicBackgroundJobManager.RegisterHandler(typedJobName, (_, _) => Task.CompletedTask); @@ -100,12 +120,12 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase [Fact] public void Should_Register_And_Unregister_Handler() { - _dynamicBackgroundJobManager.IsHandlerRegistered("TestDynamic").ShouldBeFalse(); + _dynamicBackgroundJobManager.IsHandlerRegistered("TestRegister").ShouldBeFalse(); - _dynamicBackgroundJobManager.RegisterHandler("TestDynamic", (_, _) => Task.CompletedTask); - _dynamicBackgroundJobManager.IsHandlerRegistered("TestDynamic").ShouldBeTrue(); + _dynamicBackgroundJobManager.RegisterHandler("TestRegister", (_, _) => Task.CompletedTask); + _dynamicBackgroundJobManager.IsHandlerRegistered("TestRegister").ShouldBeTrue(); - _dynamicBackgroundJobManager.UnregisterHandler("TestDynamic").ShouldBeTrue(); - _dynamicBackgroundJobManager.IsHandlerRegistered("TestDynamic").ShouldBeFalse(); + _dynamicBackgroundJobManager.UnregisterHandler("TestRegister").ShouldBeTrue(); + _dynamicBackgroundJobManager.IsHandlerRegistered("TestRegister").ShouldBeFalse(); } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AnonymousJobExecutionTracker.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs similarity index 76% rename from framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AnonymousJobExecutionTracker.cs rename to framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs index b3160a2829..1885d39c2d 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AnonymousJobExecutionTracker.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs @@ -2,7 +2,7 @@ using System.Collections.Generic; namespace Volo.Abp.BackgroundJobs; -public class AnonymousJobExecutionTracker +public class DynamicJobExecutionTracker { public List ExecutedJsonData { get; } = new(); } diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs index 3c03e7bac6..79b9c655ca 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs @@ -13,11 +13,7 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared { public override void OnApplicationInitialization(ApplicationInitializationContext context) { - var dynamicJobManager = context.ServiceProvider.GetService(); - if (dynamicJobManager == null) - { - return; - } + var dynamicJobManager = context.ServiceProvider.GetRequiredService(); dynamicJobManager.RegisterHandler("CompileTimeAnonymousJob", (ctx, ct) => { diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs index ac0d662e26..1c63411a9f 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs @@ -9,11 +9,11 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs public class SampleJobCreator : ITransientDependency { private readonly IBackgroundJobManager _backgroundJobManager; - private readonly IDynamicBackgroundJobManager? _dynamicBackgroundJobManager; + private readonly IDynamicBackgroundJobManager _dynamicBackgroundJobManager; public SampleJobCreator( IBackgroundJobManager backgroundJobManager, - IDynamicBackgroundJobManager? dynamicBackgroundJobManager = null) + IDynamicBackgroundJobManager dynamicBackgroundJobManager) { _backgroundJobManager = backgroundJobManager; _dynamicBackgroundJobManager = dynamicBackgroundJobManager; @@ -30,11 +30,6 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs await _backgroundJobManager.EnqueueAsync(new WriteToConsoleGreenJobArgs { Value = "test 1 (green) - typed" }); await _backgroundJobManager.EnqueueAsync(new WriteToConsoleYellowJobArgs { Value = "test 1 (yellow) - typed" }); - if (_dynamicBackgroundJobManager == null) - { - return; - } - // Register runtime dynamic handler _dynamicBackgroundJobManager.RegisterHandler("RuntimeAnonymousJob", (context, ct) => { From 92a72fcef5cd4a317d9ab72612f4bd3f0d9aa871 Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 20 Mar 2026 20:14:54 +0800 Subject: [PATCH 29/40] Implement dynamic background job handling with new DynamicBackgroundJobArgs and executor --- .../infrastructure/background-jobs/index.md | 2 +- .../DefaultDynamicBackgroundJobManager.cs | 8 ++++---- ...ousJobArgs.cs => DynamicBackgroundJobArgs.cs} | 6 +++--- ...Job.cs => DynamicBackgroundJobExecutorJob.cs} | 8 ++++---- .../IDynamicBackgroundJobManager.cs | 2 +- .../Hangfire/AbpDashboardOptionsProvider.cs | 4 ++-- .../BackgroundJobs/BackgroundJobManager_Tests.cs | 8 ++++---- .../DemoAppSharedModule.cs | 4 ++-- .../Jobs/SampleJobCreator.cs | 16 ++++++++-------- 9 files changed, 29 insertions(+), 29 deletions(-) rename framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/{AnonymousJobArgs.cs => DynamicBackgroundJobArgs.cs} (63%) rename framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/{AnonymousJobExecutorAsyncBackgroundJob.cs => DynamicBackgroundJobExecutorJob.cs} (82%) diff --git a/docs/en/framework/infrastructure/background-jobs/index.md b/docs/en/framework/infrastructure/background-jobs/index.md index c4393c0d2d..4a67077e0e 100644 --- a/docs/en/framework/infrastructure/background-jobs/index.md +++ b/docs/en/framework/infrastructure/background-jobs/index.md @@ -420,7 +420,7 @@ bool removed = _dynamicJobManager.UnregisterHandler("ProcessOrder"); ### How It Works - **Typed job path**: When the job name matches a registered typed job configuration, the args are serialized to JSON and deserialized to the expected args type, then enqueued through `IBackgroundJobManager.EnqueueAsync`. -- **Dynamic handler path**: When the job name matches a registered dynamic handler, the args are wrapped as `AnonymousJobArgs` (an internal transport type) and enqueued through `IBackgroundJobManager.EnqueueAsync`. When the job executes, the framework looks up the handler by name and invokes it. +- **Dynamic handler path**: When the job name matches a registered dynamic handler, the args are wrapped as `DynamicBackgroundJobArgs` (an internal transport type) and enqueued through `IBackgroundJobManager.EnqueueAsync`. When the job executes, the framework looks up the handler by name and invokes it. - All dynamic jobs go through the **standard typed job pipeline**, which means they work with all providers (Default, Hangfire, Quartz, RabbitMQ, TickerQ) without any provider-specific changes. ## Integrations diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs index ce1696ca50..93f72788fe 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs @@ -47,7 +47,7 @@ public class DefaultDynamicBackgroundJobManager : IDynamicBackgroundJobManager, if (HandlerRegistry.IsRegistered(jobName)) { - return await EnqueueAnonymousJobAsync(jobName, args, priority, delay); + return await EnqueueDynamicHandlerJobAsync(jobName, args, priority, delay); } throw new AbpException( @@ -88,15 +88,15 @@ public class DefaultDynamicBackgroundJobManager : IDynamicBackgroundJobManager, return await task; } - protected virtual Task EnqueueAnonymousJobAsync( + protected virtual Task EnqueueDynamicHandlerJobAsync( string jobName, object args, BackgroundJobPriority priority, TimeSpan? delay) { var jsonData = JsonSerializer.Serialize(args); - var anonymousArgs = new AnonymousJobArgs(jobName, jsonData); - return BackgroundJobManager.EnqueueAsync(anonymousArgs, priority, delay); + var dynamicArgs = new DynamicBackgroundJobArgs(jobName, jsonData); + return BackgroundJobManager.EnqueueAsync(dynamicArgs, priority, delay); } private static MethodInfo GetOrCreateEnqueueMethod(Type argsType) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobArgs.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs similarity index 63% rename from framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobArgs.cs rename to framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs index 09f9dc0f9f..9eaf2b00b2 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobArgs.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs @@ -1,15 +1,15 @@ namespace Volo.Abp.BackgroundJobs; [BackgroundJobName(JobNameConstant)] -public class AnonymousJobArgs +public class DynamicBackgroundJobArgs { - public const string JobNameConstant = "Abp.AnonymousJob"; + public const string JobNameConstant = "Abp.DynamicJob"; public string JobName { get; } public string JsonData { get; } - public AnonymousJobArgs(string jobName, string jsonData) + public DynamicBackgroundJobArgs(string jobName, string jsonData) { JobName = Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); JsonData = Check.NotNull(jsonData, nameof(jsonData)); diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobExecutorJob.cs similarity index 82% rename from framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs rename to framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobExecutorJob.cs index e3c95996d0..7462f5b3e5 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AnonymousJobExecutorAsyncBackgroundJob.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobExecutorJob.cs @@ -7,12 +7,12 @@ using Volo.Abp.Threading; namespace Volo.Abp.BackgroundJobs; -public class AnonymousJobExecutorAsyncBackgroundJob : AsyncBackgroundJob, ITransientDependency +public class DynamicBackgroundJobExecutorJob : AsyncBackgroundJob, ITransientDependency { protected IDynamicBackgroundJobHandlerRegistry HandlerRegistry { get; } protected IServiceProvider ServiceProvider { get; } - public AnonymousJobExecutorAsyncBackgroundJob( + public DynamicBackgroundJobExecutorJob( IDynamicBackgroundJobHandlerRegistry handlerRegistry, IServiceProvider serviceProvider) { @@ -20,11 +20,11 @@ public class AnonymousJobExecutorAsyncBackgroundJob : AsyncBackgroundJob and enqueued through the standard typed pipeline. + /// and enqueued through the standard typed pipeline. /// /// Name of the background job. /// Job arguments (will be serialized to JSON). diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs index 68a6784cb5..2f861a33b5 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpDashboardOptionsProvider.cs @@ -24,9 +24,9 @@ public class AbpDashboardOptionsProvider : ITransientDependency var jobName = job.ToString(); if (job.Args.Count == 3 && job.Args.Last() is CancellationToken) { - if (job.Args[1] is AnonymousJobArgs anonymousJobArgs) + if (job.Args[1] is DynamicBackgroundJobArgs dynamicJobArgs) { - jobName = anonymousJobArgs.JobName; + jobName = dynamicJobArgs.JobName; } else { diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs index c414e7b01a..10981af5a4 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs @@ -73,7 +73,7 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); jobInfo.ShouldNotBeNull(); - jobInfo.JobName.ShouldBe(AnonymousJobArgs.JobNameConstant); + jobInfo.JobName.ShouldBe(DynamicBackgroundJobArgs.JobNameConstant); jobInfo.JobArgs.ShouldContain("TestDynamicJob"); jobInfo.JobArgs.ShouldContain("ORD-001"); } @@ -86,8 +86,8 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase await _backgroundJobExecuter.ExecuteAsync( new JobExecutionContext( ServiceProvider, - typeof(AnonymousJobExecutorAsyncBackgroundJob), - new AnonymousJobArgs("TestDynamicJob", "{\"OrderId\":\"ORD-001\"}") + typeof(DynamicBackgroundJobExecutorJob), + new DynamicBackgroundJobArgs("TestDynamicJob", "{\"OrderId\":\"ORD-001\"}") ) ); @@ -106,7 +106,7 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); jobInfo.ShouldNotBeNull(); jobInfo.JobName.ShouldBe(typedJobName); - jobInfo.JobName.ShouldNotBe(AnonymousJobArgs.JobNameConstant); + jobInfo.JobName.ShouldNotBe(DynamicBackgroundJobArgs.JobNameConstant); } [Fact] diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs index 79b9c655ca..3c5e91958a 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs @@ -15,7 +15,7 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared { var dynamicJobManager = context.ServiceProvider.GetRequiredService(); - dynamicJobManager.RegisterHandler("CompileTimeAnonymousJob", (ctx, ct) => + dynamicJobManager.RegisterHandler("CompileTimeDynamicJob", (ctx, ct) => { using (var doc = JsonDocument.Parse(ctx.JsonData)) { @@ -24,7 +24,7 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared : doc.RootElement.TryGetProperty("Value", out prop) ? prop.GetString() : null; - Console.WriteLine($"[ANONYMOUS-COMPILE] {value}"); + Console.WriteLine($"[DYNAMIC-COMPILE] {value}"); return Task.CompletedTask; } }); diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs index 1c63411a9f..61a715d84d 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Jobs/SampleJobCreator.cs @@ -31,7 +31,7 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs await _backgroundJobManager.EnqueueAsync(new WriteToConsoleYellowJobArgs { Value = "test 1 (yellow) - typed" }); // Register runtime dynamic handler - _dynamicBackgroundJobManager.RegisterHandler("RuntimeAnonymousJob", (context, ct) => + _dynamicBackgroundJobManager.RegisterHandler("RuntimeDynamicJob", (context, ct) => { using (var doc = JsonDocument.Parse(context.JsonData)) { @@ -40,7 +40,7 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs : doc.RootElement.TryGetProperty("Value", out prop) ? prop.GetString() : null; - Console.WriteLine($"[ANONYMOUS-RUNTIME] {value}"); + Console.WriteLine($"[DYNAMIC-RUNTIME] {value}"); return Task.CompletedTask; } }); @@ -58,21 +58,21 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs // String-based enqueue with anonymous object (typed job path) await _dynamicBackgroundJobManager.EnqueueAsync( "GreenJob", - new { Value = "test 3 (green) - by name, anonymous", Time = DateTime.Now } + new { Value = "test 3 (green) - by name, dynamic", Time = DateTime.Now } ); await _dynamicBackgroundJobManager.EnqueueAsync( "YellowJob", - new { Value = "test 3 (yellow) - by name, anonymous", Time = DateTime.Now } + new { Value = "test 3 (yellow) - by name, dynamic", Time = DateTime.Now } ); // Dynamic job handlers await _dynamicBackgroundJobManager.EnqueueAsync( - "CompileTimeAnonymousJob", - new { Value = "test 4 (anonymous) - compile-time" } + "CompileTimeDynamicJob", + new { Value = "test 4 (dynamic) - compile-time" } ); await _dynamicBackgroundJobManager.EnqueueAsync( - "RuntimeAnonymousJob", - new { Value = "test 5 (anonymous) - runtime" } + "RuntimeDynamicJob", + new { Value = "test 5 (dynamic) - runtime" } ); } } From 7c95bd6796208e914c7abe98aaf6c8ba3cf254cb Mon Sep 17 00:00:00 2001 From: maliming Date: Fri, 20 Mar 2026 21:01:03 +0800 Subject: [PATCH 30/40] Fix dynamic background job code review issues --- .../DefaultDynamicBackgroundJobManager.cs | 42 +++++++++++++++---- .../DynamicBackgroundJobArgs.cs | 2 +- .../BackgroundJobManager_Tests.cs | 23 ++++++---- .../DynamicJobExecutionTracker.cs | 4 +- 4 files changed, 51 insertions(+), 20 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs index 93f72788fe..121c9819cc 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Concurrent; using System.Linq; +using System.Linq.Expressions; using System.Reflection; using System.Threading.Tasks; using Microsoft.Extensions.Options; @@ -11,7 +12,7 @@ namespace Volo.Abp.BackgroundJobs; public class DefaultDynamicBackgroundJobManager : IDynamicBackgroundJobManager, ITransientDependency { - private static readonly ConcurrentDictionary EnqueueMethodCache = new(); + private static readonly ConcurrentDictionary>> EnqueueDelegateCache = new(); protected IBackgroundJobManager BackgroundJobManager { get; } protected IDynamicBackgroundJobHandlerRegistry HandlerRegistry { get; } @@ -83,9 +84,8 @@ public class DefaultDynamicBackgroundJobManager : IDynamicBackgroundJobManager, var json = JsonSerializer.Serialize(args); var typedArgs = JsonSerializer.Deserialize(argsType, json); - var enqueueMethod = GetOrCreateEnqueueMethod(argsType); - var task = (Task)enqueueMethod.Invoke(BackgroundJobManager, [typedArgs, priority, delay])!; - return await task; + var enqueueDelegate = GetOrCreateEnqueueDelegate(argsType); + return await enqueueDelegate(BackgroundJobManager, typedArgs, priority, delay); } protected virtual Task EnqueueDynamicHandlerJobAsync( @@ -99,15 +99,39 @@ public class DefaultDynamicBackgroundJobManager : IDynamicBackgroundJobManager, return BackgroundJobManager.EnqueueAsync(dynamicArgs, priority, delay); } - private static MethodInfo GetOrCreateEnqueueMethod(Type argsType) + private static Func> GetOrCreateEnqueueDelegate(Type argsType) { - return EnqueueMethodCache.GetOrAdd(argsType, static type => + return EnqueueDelegateCache.GetOrAdd(argsType, static type => { var method = typeof(IBackgroundJobManager) .GetMethods(BindingFlags.Public | BindingFlags.Instance) - .Single(m => m.Name == nameof(IBackgroundJobManager.EnqueueAsync) && m.IsGenericMethodDefinition); - - return method.MakeGenericMethod(type); + .FirstOrDefault(m => m.Name == nameof(IBackgroundJobManager.EnqueueAsync) + && m.IsGenericMethodDefinition + && m.GetParameters().Length == 3); + + if (method == null) + { + throw new AbpException( + $"Could not find the generic EnqueueAsync method on {nameof(IBackgroundJobManager)}."); + } + + var genericMethod = method.MakeGenericMethod(type); + + // Build: (manager, args, priority, delay) => manager.EnqueueAsync((TArgs)args, priority, delay) + var managerParam = Expression.Parameter(typeof(IBackgroundJobManager), "manager"); + var argsParam = Expression.Parameter(typeof(object), "args"); + var priorityParam = Expression.Parameter(typeof(BackgroundJobPriority), "priority"); + var delayParam = Expression.Parameter(typeof(TimeSpan?), "delay"); + + var call = Expression.Call( + managerParam, + genericMethod, + Expression.Convert(argsParam, type), + priorityParam, + delayParam); + + return Expression.Lambda>>( + call, managerParam, argsParam, priorityParam, delayParam).Compile(); }); } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs index 9eaf2b00b2..e10f789889 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs @@ -12,6 +12,6 @@ public class DynamicBackgroundJobArgs public DynamicBackgroundJobArgs(string jobName, string jsonData) { JobName = Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); - JsonData = Check.NotNull(jsonData, nameof(jsonData)); + JsonData = Check.NotNullOrWhiteSpace(jsonData, nameof(jsonData)); } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs index 10981af5a4..8183d49c26 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs @@ -81,7 +81,7 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase [Fact] public async Task Should_Execute_Dynamic_Handler_Job() { - _tracker.ExecutedJsonData.ShouldBeEmpty(); + _tracker.ExecutedJsonData.IsEmpty.ShouldBeTrue(); await _backgroundJobExecuter.ExecuteAsync( new JobExecutionContext( @@ -100,13 +100,20 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase var typedJobName = BackgroundJobNameAttribute.GetName(); _dynamicBackgroundJobManager.RegisterHandler(typedJobName, (_, _) => Task.CompletedTask); - var jobIdAsString = await _dynamicBackgroundJobManager.EnqueueAsync(typedJobName, new { Value = "42" }); - jobIdAsString.ShouldNotBe(default); - - var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); - jobInfo.ShouldNotBeNull(); - jobInfo.JobName.ShouldBe(typedJobName); - jobInfo.JobName.ShouldNotBe(DynamicBackgroundJobArgs.JobNameConstant); + try + { + var jobIdAsString = await _dynamicBackgroundJobManager.EnqueueAsync(typedJobName, new { Value = "42" }); + jobIdAsString.ShouldNotBe(default); + + var jobInfo = await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString)); + jobInfo.ShouldNotBeNull(); + jobInfo.JobName.ShouldBe(typedJobName); + jobInfo.JobName.ShouldNotBe(DynamicBackgroundJobArgs.JobNameConstant); + } + finally + { + _dynamicBackgroundJobManager.UnregisterHandler(typedJobName); + } } [Fact] diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs index 1885d39c2d..3e496cdddd 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicJobExecutionTracker.cs @@ -1,8 +1,8 @@ -using System.Collections.Generic; +using System.Collections.Concurrent; namespace Volo.Abp.BackgroundJobs; public class DynamicJobExecutionTracker { - public List ExecutedJsonData { get; } = new(); + public ConcurrentBag ExecutedJsonData { get; } = new(); } From 6fc04cf5aaab19f1a015e48f9d1eb8b855ae5015 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 21 Mar 2026 12:08:26 +0800 Subject: [PATCH 31/40] Add logger and relax JsonData validation --- .../Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs | 4 ++++ .../Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs index 121c9819cc..32bea1391b 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs @@ -4,6 +4,8 @@ using System.Linq; using System.Linq.Expressions; using System.Reflection; using System.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using Volo.Abp.DependencyInjection; using Volo.Abp.Json; @@ -18,6 +20,7 @@ public class DefaultDynamicBackgroundJobManager : IDynamicBackgroundJobManager, protected IDynamicBackgroundJobHandlerRegistry HandlerRegistry { get; } protected AbpBackgroundJobOptions BackgroundJobOptions { get; } protected IJsonSerializer JsonSerializer { get; } + public ILogger Logger { get; set; } public DefaultDynamicBackgroundJobManager( IBackgroundJobManager backgroundJobManager, @@ -29,6 +32,7 @@ public class DefaultDynamicBackgroundJobManager : IDynamicBackgroundJobManager, HandlerRegistry = handlerRegistry; BackgroundJobOptions = backgroundJobOptions.Value; JsonSerializer = jsonSerializer; + Logger = NullLogger.Instance; } public virtual async Task EnqueueAsync( diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs index e10f789889..9eaf2b00b2 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs @@ -12,6 +12,6 @@ public class DynamicBackgroundJobArgs public DynamicBackgroundJobArgs(string jobName, string jsonData) { JobName = Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); - JsonData = Check.NotNullOrWhiteSpace(jsonData, nameof(jsonData)); + JsonData = Check.NotNull(jsonData, nameof(jsonData)); } } From 024f16cd99c06b7a65496730d5a0674d00a8f99c Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 21 Mar 2026 15:31:49 +0800 Subject: [PATCH 32/40] Fix dynamic background job/worker code review issues - Fix reflection method lookup in DefaultDynamicBackgroundJobManager to match by parameter types - Add StopAllAsync to IDynamicBackgroundWorkerManager interface and all implementations - Add semaphore locking to StopAllAsync in DefaultDynamicBackgroundWorkerManager with volatile _isDisposed - Fix HangfireDynamicBackgroundWorkerManager.GetCron to match existing HangfireBackgroundWorkerManager format - Fix QuartzDynamicBackgroundWorkerManager.UpdateScheduleAsync to reuse BuildTrigger method - Fix TickerQDynamicBackgroundWorkerManager.IsRegistered to throw AbpException (consistent with other methods) - Add GetAllNames and Clear to IDynamicBackgroundWorkerHandlerRegistry - Call StopAllAsync in AbpBackgroundWorkersModule.OnApplicationShutdownAsync - Move DynamicBackgroundWorkerManager_Tests to correct namespace/directory - Fix singleton state pollution in BackgroundJobManager_Tests - Update docs to warn about handler loss after restart for dynamic jobs and workers --- .../infrastructure/background-jobs/index.md | 4 ++ .../background-workers/index.md | 2 + .../DefaultDynamicBackgroundJobManager.cs | 9 +++-- .../HangfireDynamicBackgroundWorkerManager.cs | 34 +++++++++-------- .../QuartzDynamicBackgroundWorkerManager.cs | 27 ++++++------- .../TickerQDynamicBackgroundWorkerManager.cs | 9 ++++- .../AbpBackgroundWorkersModule.cs | 4 ++ .../DefaultDynamicBackgroundWorkerManager.cs | 38 ++++++++++++------- .../DynamicBackgroundWorkerHandlerRegistry.cs | 12 ++++++ ...IDynamicBackgroundWorkerHandlerRegistry.cs | 6 +++ .../IDynamicBackgroundWorkerManager.cs | 6 +++ .../BackgroundJobManager_Tests.cs | 3 +- .../DynamicBackgroundWorkerManager_Tests.cs | 3 +- 13 files changed, 108 insertions(+), 49 deletions(-) rename framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/{BackgroundJobs => BackgroundWorkers}/DynamicBackgroundWorkerManager_Tests.cs (99%) diff --git a/docs/en/framework/infrastructure/background-jobs/index.md b/docs/en/framework/infrastructure/background-jobs/index.md index 4a67077e0e..e6bfd6255f 100644 --- a/docs/en/framework/infrastructure/background-jobs/index.md +++ b/docs/en/framework/infrastructure/background-jobs/index.md @@ -423,6 +423,10 @@ bool removed = _dynamicJobManager.UnregisterHandler("ProcessOrder"); - **Dynamic handler path**: When the job name matches a registered dynamic handler, the args are wrapped as `DynamicBackgroundJobArgs` (an internal transport type) and enqueued through `IBackgroundJobManager.EnqueueAsync`. When the job executes, the framework looks up the handler by name and invokes it. - All dynamic jobs go through the **standard typed job pipeline**, which means they work with all providers (Default, Hangfire, Quartz, RabbitMQ, TickerQ) without any provider-specific changes. +> **Note:** If the job name matches both a registered typed job configuration and a dynamic handler, **the typed job takes priority** and the dynamic handler is ignored. To avoid confusion, use distinct names for dynamic handlers that do not conflict with existing typed job names. + +> **Important:** Dynamic job handlers are stored **in memory only** and are not persisted across application restarts. When using a persistent provider (Hangfire, Quartz, RabbitMQ, TickerQ), enqueued jobs survive a restart but if no handler is re-registered, the job executor will throw an exception when the job is picked up. To ensure handlers are always available, register them in `OnApplicationInitialization` so they are re-registered on every startup. + ## Integrations Background job system is extensible and you can change the default background job manager with your own implementation or on of the pre-built integrations. diff --git a/docs/en/framework/infrastructure/background-workers/index.md b/docs/en/framework/infrastructure/background-workers/index.md index ab5f42b207..8355739e95 100644 --- a/docs/en/framework/infrastructure/background-workers/index.md +++ b/docs/en/framework/infrastructure/background-workers/index.md @@ -178,6 +178,8 @@ var updated = await dynamicWorkerManager.UpdateScheduleAsync( * `RemoveAsync` stops and removes a dynamic worker. Returns `true` if the worker was found and removed. * `UpdateScheduleAsync` changes the schedule of an existing dynamic worker. Returns `true` if the worker was found and updated. The handler itself is not changed. +> **Important:** Dynamic worker handlers are stored **in memory only** and are not persisted across application restarts. When using a persistent scheduler provider (Hangfire or Quartz), the recurring job entries remain in the database after a restart, but the handlers will no longer be registered. Until the handler is re-registered, each scheduled execution will be **skipped with a warning log**. To ensure handlers are always available, register them in `OnApplicationInitializationAsync` so they are re-registered on every startup. + ## Options `AbpBackgroundWorkerOptions` class is used to [set options](../../fundamentals/options.md) for the background workers. Currently, there is only one option: diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs index 32bea1391b..7028e0f858 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DefaultDynamicBackgroundJobManager.cs @@ -109,9 +109,12 @@ public class DefaultDynamicBackgroundJobManager : IDynamicBackgroundJobManager, { var method = typeof(IBackgroundJobManager) .GetMethods(BindingFlags.Public | BindingFlags.Instance) - .FirstOrDefault(m => m.Name == nameof(IBackgroundJobManager.EnqueueAsync) - && m.IsGenericMethodDefinition - && m.GetParameters().Length == 3); + .FirstOrDefault(m => + m.Name == nameof(IBackgroundJobManager.EnqueueAsync) + && m.IsGenericMethodDefinition + && m.GetParameters() is { Length: 3 } p + && p[1].ParameterType == typeof(BackgroundJobPriority) + && p[2].ParameterType == typeof(TimeSpan?)); if (method == null) { diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs index 77e7d37a97..f34237fcc0 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs @@ -102,6 +102,12 @@ public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMa return HandlerRegistry.IsRegistered(workerName); } + public virtual Task StopAllAsync(CancellationToken cancellationToken = default) + { + HandlerRegistry.Clear(); + return Task.CompletedTask; + } + protected virtual void ScheduleRecurringJob(string workerName, string cronExpression, CancellationToken cancellationToken) { var abpHangfireOptions = ServiceProvider.GetRequiredService>().Value; @@ -140,31 +146,29 @@ public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMa protected virtual string GetCron(int period) { var time = TimeSpan.FromMilliseconds(period); + string cron; if (time.TotalSeconds <= 59) { - var seconds = (int)Math.Round(time.TotalSeconds); - return $"*/{seconds} * * * * *"; + cron = $"*/{time.TotalSeconds} * * * * *"; } - - if (time.TotalMinutes <= 59) + else if (time.TotalMinutes <= 59) { - var minutes = (int)Math.Round(time.TotalMinutes); - return $"*/{minutes} * * * *"; + cron = $"*/{time.TotalMinutes} * * * *"; } - - if (time.TotalHours <= 23) + else if (time.TotalHours <= 23) { - var hours = (int)Math.Round(time.TotalHours); - return $"0 */{hours} * * *"; + cron = $"0 */{time.TotalHours} * * *"; } - - if (time.TotalDays <= 31) + else if (time.TotalDays <= 31) + { + cron = $"0 0 0 1/{time.TotalDays} * *"; + } + else { - var days = (int)Math.Round(time.TotalDays); - return $"0 0 */{days} * *"; + throw new AbpException($"Cannot convert period: {period} to cron expression."); } - throw new AbpException($"Cannot convert period: {period} to cron expression."); + return cron; } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs index 8f409e011d..4c8b643782 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs @@ -94,22 +94,13 @@ public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMana var triggerKey = new TriggerKey($"DynamicWorker:{workerName}"); var jobKey = new JobKey($"DynamicWorker:{workerName}"); + var jobDetail = JobBuilder.Create() + .WithIdentity(jobKey) + .UsingJobData(DynamicWorkerNameKey, workerName) + .Build(); - var triggerBuilder = TriggerBuilder.Create() - .WithIdentity(triggerKey) - .ForJob(jobKey); - - if (!schedule.CronExpression.IsNullOrWhiteSpace()) - { - triggerBuilder.WithCronSchedule(schedule.CronExpression); - } - else - { - triggerBuilder.WithSimpleSchedule(builder => - builder.WithInterval(TimeSpan.FromMilliseconds(schedule.Period!.Value)).RepeatForever()); - } - - var result = await Scheduler.RescheduleJob(triggerKey, triggerBuilder.Build(), cancellationToken); + var trigger = BuildTrigger(schedule, jobDetail, triggerKey); + var result = await Scheduler.RescheduleJob(triggerKey, trigger, cancellationToken); return result != null; } @@ -119,6 +110,12 @@ public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMana return HandlerRegistry.IsRegistered(workerName); } + public virtual Task StopAllAsync(CancellationToken cancellationToken = default) + { + HandlerRegistry.Clear(); + return Task.CompletedTask; + } + protected virtual ITrigger BuildTrigger(DynamicBackgroundWorkerSchedule schedule, IJobDetail jobDetail, TriggerKey triggerKey) { var triggerBuilder = TriggerBuilder.Create() diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs index b5f1cfcbe4..45e53fc53d 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs @@ -38,6 +38,13 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan public virtual bool IsRegistered(string workerName) { - return false; + throw new AbpException( + "TickerQ does not support dynamic background worker registration at runtime. " + + "Please use Hangfire or Quartz provider for dynamic background workers."); + } + + public virtual Task StopAllAsync(CancellationToken cancellationToken = default) + { + return Task.CompletedTask; } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AbpBackgroundWorkersModule.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AbpBackgroundWorkersModule.cs index 3b1b18e8b3..1d944817bf 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AbpBackgroundWorkersModule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/AbpBackgroundWorkersModule.cs @@ -49,6 +49,10 @@ public class AbpBackgroundWorkersModule : AbpModule await context.ServiceProvider .GetRequiredService() .StopAsync(cancellationToken); + + await context.ServiceProvider + .GetRequiredService() + .StopAllAsync(cancellationToken); } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs index a3073d0e53..4116baa6c2 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs @@ -10,14 +10,14 @@ using Volo.Abp.Threading; namespace Volo.Abp.BackgroundWorkers; -public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerManager, ISingletonDependency, IDisposable +public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerManager, ISingletonDependency { protected IServiceProvider ServiceProvider { get; } public ILogger Logger { get; set; } private readonly ConcurrentDictionary _dynamicWorkers; private readonly SemaphoreSlim _semaphore; - private bool _isDisposed; + private volatile bool _isDisposed; public DefaultDynamicBackgroundWorkerManager(IServiceProvider serviceProvider) { @@ -127,29 +127,41 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan return _dynamicWorkers.ContainsKey(workerName); } - public virtual void Dispose() + public virtual async Task StopAllAsync(CancellationToken cancellationToken = default) { if (_isDisposed) { return; } - _isDisposed = true; - - foreach (var kvp in _dynamicWorkers) + await _semaphore.WaitAsync(cancellationToken); + try { - try + if (_isDisposed) { - kvp.Value.StopAsync(CancellationToken.None).GetAwaiter().GetResult(); + return; } - catch (Exception ex) + + _isDisposed = true; + + foreach (var kvp in _dynamicWorkers) { - Logger.LogException(ex); + try + { + await kvp.Value.StopAsync(cancellationToken); + } + catch (Exception ex) + { + Logger.LogException(ex); + } } - } - _dynamicWorkers.Clear(); - _semaphore.Dispose(); + _dynamicWorkers.Clear(); + } + finally + { + _semaphore.Release(); + } } protected virtual InMemoryDynamicBackgroundWorker CreateDynamicWorker( diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandlerRegistry.cs index a30ea3e95a..55e8617915 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandlerRegistry.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerHandlerRegistry.cs @@ -1,4 +1,6 @@ using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; using Volo.Abp.DependencyInjection; namespace Volo.Abp.BackgroundWorkers; @@ -37,4 +39,14 @@ public class DynamicBackgroundWorkerHandlerRegistry : IDynamicBackgroundWorkerHa Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); return Handlers.TryGetValue(workerName, out var handler) ? handler : null; } + + public virtual IReadOnlyCollection GetAllNames() + { + return Handlers.Keys.ToList().AsReadOnly(); + } + + public virtual void Clear() + { + Handlers.Clear(); + } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerHandlerRegistry.cs index 7915f108db..0b7d6757dc 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerHandlerRegistry.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerHandlerRegistry.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; + namespace Volo.Abp.BackgroundWorkers; public interface IDynamicBackgroundWorkerHandlerRegistry @@ -9,4 +11,8 @@ public interface IDynamicBackgroundWorkerHandlerRegistry bool IsRegistered(string workerName); DynamicBackgroundWorkerHandler? Get(string workerName); + + IReadOnlyCollection GetAllNames(); + + void Clear(); } diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs index 5054f67897..34f4d07ccd 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs @@ -38,4 +38,10 @@ public interface IDynamicBackgroundWorkerManager /// Checks whether a dynamic worker with the given name is registered. /// bool IsRegistered(string workerName); + + /// + /// Stops all dynamic workers and releases resources. + /// Called during application shutdown. + /// + Task StopAllAsync(CancellationToken cancellationToken = default); } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs index 8183d49c26..29212664ff 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs @@ -81,7 +81,7 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase [Fact] public async Task Should_Execute_Dynamic_Handler_Job() { - _tracker.ExecutedJsonData.IsEmpty.ShouldBeTrue(); + var countBefore = _tracker.ExecutedJsonData.Count; await _backgroundJobExecuter.ExecuteAsync( new JobExecutionContext( @@ -91,6 +91,7 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase ) ); + _tracker.ExecutedJsonData.Count.ShouldBeGreaterThan(countBefore); _tracker.ExecutedJsonData.ShouldContain(d => d.Contains("ORD-001")); } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManager_Tests.cs similarity index 99% rename from framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs rename to framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManager_Tests.cs index be99167d85..a61c99fdc1 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/DynamicBackgroundWorkerManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManager_Tests.cs @@ -5,10 +5,11 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using Shouldly; +using Volo.Abp.BackgroundJobs; using Volo.Abp.BackgroundWorkers; using Xunit; -namespace Volo.Abp.BackgroundJobs; +namespace Volo.Abp.BackgroundWorkers; public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase { From 7a1e246ce9c23da1af5c78dc3f33aca05309f92c Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 21 Mar 2026 15:49:03 +0800 Subject: [PATCH 33/40] Enhance dynamic background job handling with improved argument management and error logging --- .../DynamicBackgroundJobArgs.cs | 11 +++++-- .../DynamicBackgroundJobHandlerRegistry.cs | 12 +++++++ .../IDynamicBackgroundJobHandlerRegistry.cs | 6 ++++ .../HangfireBackgroundWorkerManager.cs | 12 ++++--- .../HangfireDynamicBackgroundWorkerAdapter.cs | 5 ++- .../HangfireDynamicBackgroundWorkerManager.cs | 24 +++++++------- .../QuartzDynamicBackgroundWorkerAdapter.cs | 5 ++- .../QuartzDynamicBackgroundWorkerManager.cs | 31 +++++++++---------- .../DefaultDynamicBackgroundWorkerManager.cs | 10 ++++++ 9 files changed, 80 insertions(+), 36 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs index 9eaf2b00b2..45066b7586 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobArgs.cs @@ -5,9 +5,16 @@ public class DynamicBackgroundJobArgs { public const string JobNameConstant = "Abp.DynamicJob"; - public string JobName { get; } + public string JobName { get; private set; } - public string JsonData { get; } + public string JsonData { get; private set; } + + // For serializers that require a parameterless constructor (e.g. System.Text.Json) + private DynamicBackgroundJobArgs() + { + JobName = string.Empty; + JsonData = string.Empty; + } public DynamicBackgroundJobArgs(string jobName, string jsonData) { diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerRegistry.cs index ce5710dd14..1c12300ffd 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerRegistry.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobHandlerRegistry.cs @@ -1,4 +1,6 @@ using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Linq; using Volo.Abp.DependencyInjection; namespace Volo.Abp.BackgroundJobs; @@ -37,4 +39,14 @@ public class DynamicBackgroundJobHandlerRegistry : IDynamicBackgroundJobHandlerR Check.NotNullOrWhiteSpace(jobName, nameof(jobName)); return Handlers.TryGetValue(jobName, out var handler) ? handler : null; } + + public virtual IReadOnlyCollection GetAllNames() + { + return Handlers.Keys.ToList(); + } + + public virtual void Clear() + { + Handlers.Clear(); + } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerRegistry.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerRegistry.cs index dff212d65b..57e75d1607 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerRegistry.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IDynamicBackgroundJobHandlerRegistry.cs @@ -1,3 +1,5 @@ +using System.Collections.Generic; + namespace Volo.Abp.BackgroundJobs; public interface IDynamicBackgroundJobHandlerRegistry @@ -9,4 +11,8 @@ public interface IDynamicBackgroundJobHandlerRegistry bool IsRegistered(string jobName); DynamicBackgroundJobHandler? Get(string jobName); + + IReadOnlyCollection GetAllNames(); + + void Clear(); } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs index 64a4a1be64..e23737d2a1 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs @@ -162,19 +162,23 @@ public class HangfireBackgroundWorkerManager : BackgroundWorkerManager, ISinglet if (time.TotalSeconds <= 59) { - cron = $"*/{time.TotalSeconds} * * * * *"; + var seconds = Math.Max(1, (int)Math.Round(time.TotalSeconds)); + cron = $"*/{seconds} * * * * *"; } else if (time.TotalMinutes <= 59) { - cron = $"*/{time.TotalMinutes} * * * *"; + var minutes = Math.Max(1, (int)Math.Round(time.TotalMinutes)); + cron = $"*/{minutes} * * * *"; } else if (time.TotalHours <= 23) { - cron = $"0 */{time.TotalHours} * * *"; + var hours = Math.Max(1, (int)Math.Round(time.TotalHours)); + cron = $"0 */{hours} * * *"; } else if(time.TotalDays <= 31) { - cron = $"0 0 0 1/{time.TotalDays} * *"; + var days = Math.Max(1, (int)Math.Round(time.TotalDays)); + cron = $"0 0 0 1/{days} * *"; } else { diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerAdapter.cs index 9e6d5f2f0c..56a5d7a5c8 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerAdapter.cs @@ -39,10 +39,13 @@ public class HangfireDynamicBackgroundWorkerAdapter : ITransientDependency } catch (Exception ex) { + // Swallow the exception to match the behavior of AsyncPeriodicBackgroundWorkerBase, + // which catches, notifies and logs without rethrowing. This prevents Hangfire from + // treating a single failed execution as a job failure and triggering retries. await ServiceProvider.GetRequiredService() .NotifyAsync(new ExceptionNotificationContext(ex)); - throw; + Logger.LogException(ex); } } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs index f34237fcc0..2c297b81a6 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs @@ -57,16 +57,14 @@ public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMa { Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - if (!HandlerRegistry.IsRegistered(workerName)) - { - return Task.FromResult(false); - } - + // Always remove the persistent recurring job regardless of in-memory registry state. + // This ensures cleanup works correctly after an application restart, when the registry + // is empty but the Hangfire recurring job may still exist in the database. var recurringJobId = $"DynamicWorker:{workerName}"; RecurringJob.RemoveIfExists(recurringJobId); - HandlerRegistry.Unregister(workerName); + var wasRegistered = HandlerRegistry.Unregister(workerName); - return Task.FromResult(true); + return Task.FromResult(wasRegistered); } public virtual Task UpdateScheduleAsync( @@ -150,19 +148,23 @@ public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMa if (time.TotalSeconds <= 59) { - cron = $"*/{time.TotalSeconds} * * * * *"; + var seconds = Math.Max(1, (int)Math.Round(time.TotalSeconds)); + cron = $"*/{seconds} * * * * *"; } else if (time.TotalMinutes <= 59) { - cron = $"*/{time.TotalMinutes} * * * *"; + var minutes = Math.Max(1, (int)Math.Round(time.TotalMinutes)); + cron = $"*/{minutes} * * * *"; } else if (time.TotalHours <= 23) { - cron = $"0 */{time.TotalHours} * * *"; + var hours = Math.Max(1, (int)Math.Round(time.TotalHours)); + cron = $"0 */{hours} * * *"; } else if (time.TotalDays <= 31) { - cron = $"0 0 0 1/{time.TotalDays} * *"; + var days = Math.Max(1, (int)Math.Round(time.TotalDays)); + cron = $"0 0 0 1/{days} * *"; } else { diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs index ba8d98091f..6098c461df 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs @@ -47,10 +47,13 @@ public class QuartzDynamicBackgroundWorkerAdapter : IJob, ITransientDependency } catch (Exception ex) { + // Swallow the exception to match the behavior of AsyncPeriodicBackgroundWorkerBase, + // which catches, notifies and logs without rethrowing. This prevents Quartz from + // treating a single failed execution as a job failure and triggering retries. await ServiceProvider.GetRequiredService() .NotifyAsync(new ExceptionNotificationContext(ex)); - throw; + Logger.LogException(ex); } } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs index 4c8b643782..598c506976 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; using Microsoft.Extensions.Logging; @@ -47,16 +48,14 @@ public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMana var trigger = BuildTrigger(schedule, jobDetail, triggerKey); - if (await Scheduler.CheckExists(jobDetail.Key, cancellationToken)) - { - await Scheduler.AddJob(jobDetail, true, true, cancellationToken); - await Scheduler.ResumeJob(jobDetail.Key, cancellationToken); - await Scheduler.RescheduleJob(trigger.Key, trigger, cancellationToken); - } - else - { - await Scheduler.ScheduleJob(jobDetail, trigger, cancellationToken); - } + // Use replace=true to avoid TOCTOU race between CheckExists and ScheduleJob. + await Scheduler.ScheduleJobs( + new Dictionary> + { + { jobDetail, new[] { trigger } } + }, + replace: true, + cancellationToken); HandlerRegistry.Register(workerName, handler); } @@ -65,16 +64,14 @@ public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMana { Check.NotNullOrWhiteSpace(workerName, nameof(workerName)); - if (!HandlerRegistry.IsRegistered(workerName)) - { - return false; - } - + // Always delete the persistent Quartz job regardless of in-memory registry state. + // This ensures cleanup works correctly after an application restart, when the registry + // is empty but the Quartz job may still exist in the scheduler store. var jobKey = new JobKey($"DynamicWorker:{workerName}"); - await Scheduler.DeleteJob(jobKey, cancellationToken); + var deleted = await Scheduler.DeleteJob(jobKey, cancellationToken); HandlerRegistry.Unregister(workerName); - return true; + return deleted; } public virtual async Task UpdateScheduleAsync( diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs index 4116baa6c2..683d42687f 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs @@ -49,6 +49,11 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan await _semaphore.WaitAsync(cancellationToken); try { + if (_isDisposed) + { + throw new ObjectDisposedException(nameof(DefaultDynamicBackgroundWorkerManager)); + } + if (_dynamicWorkers.TryRemove(workerName, out var existingWorker)) { await existingWorker.StopAsync(cancellationToken); @@ -107,6 +112,11 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan await _semaphore.WaitAsync(cancellationToken); try { + if (_isDisposed) + { + throw new ObjectDisposedException(nameof(DefaultDynamicBackgroundWorkerManager)); + } + if (!_dynamicWorkers.TryGetValue(workerName, out var worker)) { return false; From 3a01bd5d42b96ed55b59b08a05b82dd0a5a1fb07 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 21 Mar 2026 15:52:36 +0800 Subject: [PATCH 34/40] Refactor RemoveAsync method to return registration status instead of deletion result --- .../Quartz/QuartzDynamicBackgroundWorkerManager.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs index 598c506976..7065e77f48 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs @@ -68,10 +68,10 @@ public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMana // This ensures cleanup works correctly after an application restart, when the registry // is empty but the Quartz job may still exist in the scheduler store. var jobKey = new JobKey($"DynamicWorker:{workerName}"); - var deleted = await Scheduler.DeleteJob(jobKey, cancellationToken); - HandlerRegistry.Unregister(workerName); + await Scheduler.DeleteJob(jobKey, cancellationToken); + var wasRegistered = HandlerRegistry.Unregister(workerName); - return deleted; + return wasRegistered; } public virtual async Task UpdateScheduleAsync( From eb2cf10a3df3e12ea5702cc62cab978608ef3a42 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 21 Mar 2026 15:58:38 +0800 Subject: [PATCH 35/40] Enhance dynamic background worker management with improved error handling and logging --- .../DynamicBackgroundJobExecutorJob.cs | 2 +- .../DynamicBackgroundJobHandlerRegistry.cs | 2 +- .../HangfireDynamicBackgroundWorkerManager.cs | 11 ++++++- .../QuartzDynamicBackgroundWorkerAdapter.cs | 9 +++--- .../QuartzDynamicBackgroundWorkerManager.cs | 30 ++++++++++++------- .../IDynamicBackgroundWorkerManager.cs | 7 ++++- 6 files changed, 42 insertions(+), 19 deletions(-) diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobExecutorJob.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobExecutorJob.cs index 7462f5b3e5..5818e6de70 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobExecutorJob.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/DynamicBackgroundJobExecutorJob.cs @@ -22,7 +22,7 @@ public class DynamicBackgroundJobExecutorJob : AsyncBackgroundJob GetAllNames() { - return Handlers.Keys.ToList(); + return Handlers.Keys.ToList().AsReadOnly(); } public virtual void Clear() diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs index 2c297b81a6..6f7e7b325e 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs @@ -47,8 +47,17 @@ public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMa cronExpression = GetCron(period); } - ScheduleRecurringJob(workerName, cronExpression, cancellationToken); + // Register the handler first so it is available the moment the recurring job fires. HandlerRegistry.Register(workerName, handler); + try + { + ScheduleRecurringJob(workerName, cronExpression, cancellationToken); + } + catch + { + HandlerRegistry.Unregister(workerName); + throw; + } return Task.CompletedTask; } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs index 6098c461df..d27395bab2 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerAdapter.cs @@ -26,13 +26,14 @@ public class QuartzDynamicBackgroundWorkerAdapter : IJob, ITransientDependency public virtual async Task Execute(IJobExecutionContext context) { - var workerName = context.MergedJobDataMap.GetString(QuartzDynamicBackgroundWorkerManager.DynamicWorkerNameKey); - if (string.IsNullOrWhiteSpace(workerName)) + var rawWorkerName = context.MergedJobDataMap.GetString(QuartzDynamicBackgroundWorkerManager.DynamicWorkerNameKey); + if (string.IsNullOrWhiteSpace(rawWorkerName)) { return; } - var handler = HandlerRegistry.Get(workerName!); + var workerName = rawWorkerName!; + var handler = HandlerRegistry.Get(workerName); if (handler == null) { Logger.LogWarning("No handler registered for dynamic worker: {WorkerName}", workerName); @@ -42,7 +43,7 @@ public class QuartzDynamicBackgroundWorkerAdapter : IJob, ITransientDependency try { await handler( - new DynamicBackgroundWorkerExecutionContext(workerName!, ServiceProvider), + new DynamicBackgroundWorkerExecutionContext(workerName, ServiceProvider), context.CancellationToken); } catch (Exception ex) diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs index 7065e77f48..f5145de8b6 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs @@ -48,16 +48,24 @@ public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMana var trigger = BuildTrigger(schedule, jobDetail, triggerKey); - // Use replace=true to avoid TOCTOU race between CheckExists and ScheduleJob. - await Scheduler.ScheduleJobs( - new Dictionary> - { - { jobDetail, new[] { trigger } } - }, - replace: true, - cancellationToken); - + // Register the handler first so it is available the moment the job fires. HandlerRegistry.Register(workerName, handler); + try + { + // Use replace=true to avoid TOCTOU race between CheckExists and ScheduleJob. + await Scheduler.ScheduleJobs( + new Dictionary> + { + { jobDetail, new[] { trigger } } + }, + replace: true, + cancellationToken); + } + catch + { + HandlerRegistry.Unregister(workerName); + throw; + } } public virtual async Task RemoveAsync(string workerName, CancellationToken cancellationToken = default) @@ -68,10 +76,10 @@ public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMana // This ensures cleanup works correctly after an application restart, when the registry // is empty but the Quartz job may still exist in the scheduler store. var jobKey = new JobKey($"DynamicWorker:{workerName}"); - await Scheduler.DeleteJob(jobKey, cancellationToken); + var deleted = await Scheduler.DeleteJob(jobKey, cancellationToken); var wasRegistered = HandlerRegistry.Unregister(workerName); - return wasRegistered; + return deleted || wasRegistered; } public virtual async Task UpdateScheduleAsync( diff --git a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs index 34f4d07ccd..7e625e7c9c 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs @@ -21,7 +21,12 @@ public interface IDynamicBackgroundWorkerManager /// /// Removes a previously added dynamic worker by name. - /// Returns true if the worker was found and removed; false otherwise. + /// Always attempts to remove both the in-memory handler and any persistent scheduling record + /// (Hangfire RecurringJob or Quartz job), regardless of current in-memory state. + /// Returns true if the handler was registered in memory at the time of the call, or if + /// the persistent scheduling record was found and deleted (provider-dependent). + /// May return false after an application restart even if a persistent record was cleaned up, + /// when the provider cannot report whether a persistent record existed (e.g. Hangfire). /// Task RemoveAsync(string workerName, CancellationToken cancellationToken = default); From a04e20c407a8c56247ae064372457a399916387a Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 21 Mar 2026 16:10:41 +0800 Subject: [PATCH 36/40] Fix UpdateScheduleAsync restart behavior and revert TickerQ IsRegistered - Fix Hangfire/Quartz UpdateScheduleAsync to operate directly on persistent scheduler state without checking the in-memory registry, consistent with the RemoveAsync fix; this allows updating schedules after restart - Revert TickerQ IsRegistered to return false instead of throwing; a boolean query method should not throw exceptions - Update docs: note that UpdateScheduleAsync works after restart for persistent providers --- .../infrastructure/background-workers/index.md | 2 +- .../Hangfire/HangfireDynamicBackgroundWorkerManager.cs | 8 +++----- .../Quartz/QuartzDynamicBackgroundWorkerManager.cs | 10 +++++----- .../TickerQ/TickerQDynamicBackgroundWorkerManager.cs | 5 ++--- 4 files changed, 11 insertions(+), 14 deletions(-) diff --git a/docs/en/framework/infrastructure/background-workers/index.md b/docs/en/framework/infrastructure/background-workers/index.md index 8355739e95..5252d92ac5 100644 --- a/docs/en/framework/infrastructure/background-workers/index.md +++ b/docs/en/framework/infrastructure/background-workers/index.md @@ -176,7 +176,7 @@ var updated = await dynamicWorkerManager.UpdateScheduleAsync( * **`CronExpression` is only supported by scheduler-backed providers ([Hangfire](./hangfire.md), [Quartz](./quartz.md)).** The default in-memory provider requires `Period` and does not support `CronExpression` alone. * **[TickerQ](./tickerq.md) does not support dynamic background workers** because it uses `FrozenDictionary` for function registration, which requires all functions to be registered before the application starts. * `RemoveAsync` stops and removes a dynamic worker. Returns `true` if the worker was found and removed. -* `UpdateScheduleAsync` changes the schedule of an existing dynamic worker. Returns `true` if the worker was found and updated. The handler itself is not changed. +* `UpdateScheduleAsync` changes the schedule of an existing dynamic worker. Returns `true` if the worker was found and updated. The handler itself is not changed. For persistent providers (Hangfire, Quartz), this also works correctly after an application restart — the persistent scheduling record is updated even if the handler is no longer registered in memory. > **Important:** Dynamic worker handlers are stored **in memory only** and are not persisted across application restarts. When using a persistent scheduler provider (Hangfire or Quartz), the recurring job entries remain in the database after a restart, but the handlers will no longer be registered. Until the handler is re-registered, each scheduled execution will be **skipped with a warning log**. To ensure handlers are always available, register them in `OnApplicationInitializationAsync` so they are re-registered on every startup. diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs index 6f7e7b325e..a9b9026606 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs @@ -86,11 +86,6 @@ public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMa schedule.Validate(); - if (!HandlerRegistry.IsRegistered(workerName)) - { - return Task.FromResult(false); - } - var cronExpression = schedule.CronExpression; if (cronExpression.IsNullOrWhiteSpace()) { @@ -98,6 +93,9 @@ public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMa cronExpression = GetCron(period); } + // Always update the persistent recurring job regardless of in-memory registry state. + // This ensures UpdateScheduleAsync works correctly after an application restart, + // when the registry is empty but the Hangfire recurring job may still exist in the database. ScheduleRecurringJob(workerName, cronExpression, cancellationToken); return Task.FromResult(true); diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs index f5145de8b6..5a729ad974 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs @@ -92,11 +92,6 @@ public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMana schedule.Validate(); - if (!HandlerRegistry.IsRegistered(workerName)) - { - return false; - } - var triggerKey = new TriggerKey($"DynamicWorker:{workerName}"); var jobKey = new JobKey($"DynamicWorker:{workerName}"); var jobDetail = JobBuilder.Create() @@ -105,6 +100,11 @@ public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMana .Build(); var trigger = BuildTrigger(schedule, jobDetail, triggerKey); + + // Always attempt to reschedule the persistent job regardless of in-memory registry state. + // This ensures UpdateScheduleAsync works correctly after an application restart, + // when the registry is empty but the Quartz job may still exist in the scheduler store. + // RescheduleJob returns null if the trigger was not found, indicating the job did not exist. var result = await Scheduler.RescheduleJob(triggerKey, trigger, cancellationToken); return result != null; } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs index 45e53fc53d..6976f49cb5 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs @@ -38,9 +38,8 @@ public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan public virtual bool IsRegistered(string workerName) { - throw new AbpException( - "TickerQ does not support dynamic background worker registration at runtime. " + - "Please use Hangfire or Quartz provider for dynamic background workers."); + // TickerQ does not support runtime registration, so there are never any registered workers. + return false; } public virtual Task StopAllAsync(CancellationToken cancellationToken = default) From d8eefa46855de657bf72252d8a0bb57697e2e602 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 21 Mar 2026 16:24:06 +0800 Subject: [PATCH 37/40] Add tests for dynamic background job handler registry and StopAllAsync, fix duplicate usings in DemoAppSharedModule --- .../BackgroundJobManager_Tests.cs | 38 +++++++ ...icBackgroundWorkerManager_StopAll_Tests.cs | 98 +++++++++++++++++++ .../DemoAppSharedModule.cs | 3 - 3 files changed, 136 insertions(+), 3 deletions(-) create mode 100644 framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManager_StopAll_Tests.cs diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs index 29212664ff..9ef0755d0f 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs @@ -136,4 +136,42 @@ public class BackgroundJobManager_Tests : BackgroundJobsTestBase _dynamicBackgroundJobManager.UnregisterHandler("TestRegister").ShouldBeTrue(); _dynamicBackgroundJobManager.IsHandlerRegistered("TestRegister").ShouldBeFalse(); } + + [Fact] + public void Should_GetAllNames_From_Handler_Registry() + { + var registry = GetRequiredService(); + + registry.Register("RegistryJob1", (_, _) => Task.CompletedTask); + registry.Register("RegistryJob2", (_, _) => Task.CompletedTask); + + try + { + var names = registry.GetAllNames(); + names.ShouldContain("RegistryJob1"); + names.ShouldContain("RegistryJob2"); + } + finally + { + registry.Unregister("RegistryJob1"); + registry.Unregister("RegistryJob2"); + } + } + + [Fact] + public void Should_Clear_Handler_Registry() + { + var registry = GetRequiredService(); + + registry.Register("ClearJob1", (_, _) => Task.CompletedTask); + registry.Register("ClearJob2", (_, _) => Task.CompletedTask); + + registry.GetAllNames().ShouldContain("ClearJob1"); + registry.GetAllNames().ShouldContain("ClearJob2"); + + registry.Clear(); + + registry.IsRegistered("ClearJob1").ShouldBeFalse(); + registry.IsRegistered("ClearJob2").ShouldBeFalse(); + } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManager_StopAll_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManager_StopAll_Tests.cs new file mode 100644 index 0000000000..e7f8ae6bc6 --- /dev/null +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManager_StopAll_Tests.cs @@ -0,0 +1,98 @@ +using System; +using System.Threading.Tasks; +using Shouldly; +using Volo.Abp.BackgroundJobs; +using Volo.Abp.BackgroundWorkers; +using Xunit; + +namespace Volo.Abp.BackgroundWorkers; + +/// +/// Isolated tests for . +/// Kept in a separate class so the singleton manager is fresh per test (xUnit creates +/// a new test class instance — and therefore a new ABP application — for each test method). +/// +public class DynamicBackgroundWorkerManager_StopAll_Tests : BackgroundJobsTestBase +{ + private readonly IDynamicBackgroundWorkerManager _dynamicWorkerManager; + + public DynamicBackgroundWorkerManager_StopAll_Tests() + { + _dynamicWorkerManager = GetRequiredService(); + } + + [Fact] + public async Task Should_Stop_All_Workers_And_Clear_Registry() + { + var workerName1 = "stop-all-worker-1-" + Guid.NewGuid(); + var workerName2 = "stop-all-worker-2-" + Guid.NewGuid(); + + await _dynamicWorkerManager.AddAsync( + workerName1, + new DynamicBackgroundWorkerSchedule { Period = 60000 }, + (_, _) => Task.CompletedTask + ); + await _dynamicWorkerManager.AddAsync( + workerName2, + new DynamicBackgroundWorkerSchedule { Period = 60000 }, + (_, _) => Task.CompletedTask + ); + + _dynamicWorkerManager.IsRegistered(workerName1).ShouldBeTrue(); + _dynamicWorkerManager.IsRegistered(workerName2).ShouldBeTrue(); + + await _dynamicWorkerManager.StopAllAsync(); + + _dynamicWorkerManager.IsRegistered(workerName1).ShouldBeFalse(); + _dynamicWorkerManager.IsRegistered(workerName2).ShouldBeFalse(); + } + + [Fact] + public async Task Should_Throw_ObjectDisposedException_When_AddAsync_Called_After_StopAllAsync() + { + await _dynamicWorkerManager.StopAllAsync(); + + await Assert.ThrowsAsync(() => + _dynamicWorkerManager.AddAsync( + "post-stop-worker-" + Guid.NewGuid(), + new DynamicBackgroundWorkerSchedule { Period = 1000 }, + (_, _) => Task.CompletedTask + ) + ); + } + + [Fact] + public async Task Should_Throw_ObjectDisposedException_When_UpdateScheduleAsync_Called_After_StopAllAsync() + { + var workerName = "update-after-stop-" + Guid.NewGuid(); + + await _dynamicWorkerManager.AddAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = 60000 }, + (_, _) => Task.CompletedTask + ); + + await _dynamicWorkerManager.StopAllAsync(); + + await Assert.ThrowsAsync(() => + _dynamicWorkerManager.UpdateScheduleAsync( + workerName, + new DynamicBackgroundWorkerSchedule { Period = 1000 } + ) + ); + } + + [Fact] + public async Task Should_Be_Idempotent_When_StopAllAsync_Called_Multiple_Times() + { + await _dynamicWorkerManager.AddAsync( + "idempotent-stop-" + Guid.NewGuid(), + new DynamicBackgroundWorkerSchedule { Period = 60000 }, + (_, _) => Task.CompletedTask + ); + + // Should not throw when called multiple times + await _dynamicWorkerManager.StopAllAsync(); + await _dynamicWorkerManager.StopAllAsync(); + } +} diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs index c69b92c7ed..f7fde67b44 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs @@ -2,9 +2,6 @@ using System; using System.Text.Json; using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; -using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs; using Volo.Abp.BackgroundWorkers; using Volo.Abp.Modularity; From ca4d3f826082963d872e69e4a815d40a6aee3320 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 21 Mar 2026 16:44:47 +0800 Subject: [PATCH 38/40] Fix documentation for DynamicBackgroundJobArgs description, TickerQ comment, and provider-dependent return values --- docs/en/framework/infrastructure/background-jobs/index.md | 2 +- .../en/framework/infrastructure/background-workers/index.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/framework/infrastructure/background-jobs/index.md b/docs/en/framework/infrastructure/background-jobs/index.md index e6bfd6255f..2f27055f46 100644 --- a/docs/en/framework/infrastructure/background-jobs/index.md +++ b/docs/en/framework/infrastructure/background-jobs/index.md @@ -420,7 +420,7 @@ bool removed = _dynamicJobManager.UnregisterHandler("ProcessOrder"); ### How It Works - **Typed job path**: When the job name matches a registered typed job configuration, the args are serialized to JSON and deserialized to the expected args type, then enqueued through `IBackgroundJobManager.EnqueueAsync`. -- **Dynamic handler path**: When the job name matches a registered dynamic handler, the args are wrapped as `DynamicBackgroundJobArgs` (an internal transport type) and enqueued through `IBackgroundJobManager.EnqueueAsync`. When the job executes, the framework looks up the handler by name and invokes it. +- **Dynamic handler path**: When the job name matches a registered dynamic handler, the args are wrapped as `DynamicBackgroundJobArgs` (a public transport type used internally by the framework) and enqueued through `IBackgroundJobManager.EnqueueAsync`. When the job executes, the framework looks up the handler by name and invokes it. - All dynamic jobs go through the **standard typed job pipeline**, which means they work with all providers (Default, Hangfire, Quartz, RabbitMQ, TickerQ) without any provider-specific changes. > **Note:** If the job name matches both a registered typed job configuration and a dynamic handler, **the typed job takes priority** and the dynamic handler is ignored. To avoid confusion, use distinct names for dynamic handlers that do not conflict with existing typed job names. diff --git a/docs/en/framework/infrastructure/background-workers/index.md b/docs/en/framework/infrastructure/background-workers/index.md index 5252d92ac5..a8e558cea1 100644 --- a/docs/en/framework/infrastructure/background-workers/index.md +++ b/docs/en/framework/infrastructure/background-workers/index.md @@ -138,7 +138,7 @@ public class MyModule : AbpModule new DynamicBackgroundWorkerSchedule { Period = 30000 //30 seconds - //CronExpression = "*/30 * * * *" //Every 30 minutes. Only for Hangfire, Quartz or TickerQ integration. + //CronExpression = "*/30 * * * *" //Every 30 minutes. Only for Hangfire or Quartz integration. }, async (workerContext, cancellationToken) => { @@ -175,8 +175,8 @@ var updated = await dynamicWorkerManager.UpdateScheduleAsync( * At least one of `Period` or `CronExpression` must be set in `DynamicBackgroundWorkerSchedule`. * **`CronExpression` is only supported by scheduler-backed providers ([Hangfire](./hangfire.md), [Quartz](./quartz.md)).** The default in-memory provider requires `Period` and does not support `CronExpression` alone. * **[TickerQ](./tickerq.md) does not support dynamic background workers** because it uses `FrozenDictionary` for function registration, which requires all functions to be registered before the application starts. -* `RemoveAsync` stops and removes a dynamic worker. Returns `true` if the worker was found and removed. -* `UpdateScheduleAsync` changes the schedule of an existing dynamic worker. Returns `true` if the worker was found and updated. The handler itself is not changed. For persistent providers (Hangfire, Quartz), this also works correctly after an application restart — the persistent scheduling record is updated even if the handler is no longer registered in memory. +* `RemoveAsync` stops and removes a dynamic worker. Returns `true` if the worker was found and removed. The exact semantics are provider-dependent — for persistent providers (Hangfire, Quartz), the persistent scheduling record is always cleaned up, but the return value may only reflect the in-memory registry state. +* `UpdateScheduleAsync` changes the schedule of an existing dynamic worker. The handler itself is not changed. Returns `true` if the schedule was updated. The exact semantics are provider-dependent — for persistent providers (Hangfire, Quartz), this also works correctly after an application restart, updating the persistent scheduling record even if the handler is no longer registered in memory. > **Important:** Dynamic worker handlers are stored **in memory only** and are not persisted across application restarts. When using a persistent scheduler provider (Hangfire or Quartz), the recurring job entries remain in the database after a restart, but the handlers will no longer be registered. Until the handler is re-registered, each scheduled execution will be **skipped with a warning log**. To ensure handlers are always available, register them in `OnApplicationInitializationAsync` so they are re-registered on every startup. From 238ec359be462986d74dee94915b8ec457d16555 Mon Sep 17 00:00:00 2001 From: maliming Date: Sat, 21 Mar 2026 16:55:54 +0800 Subject: [PATCH 39/40] Add article for dynamic background jobs and workers. --- .../POST.md | 224 ++++++++++++++++++ .../cover.jpg | Bin 0 -> 488972 bytes 2 files changed, 224 insertions(+) create mode 100644 docs/en/Community-Articles/2026-03-21-Dynamic-Background-Jobs-and-Workers-in-ABP/POST.md create mode 100644 docs/en/Community-Articles/2026-03-21-Dynamic-Background-Jobs-and-Workers-in-ABP/cover.jpg diff --git a/docs/en/Community-Articles/2026-03-21-Dynamic-Background-Jobs-and-Workers-in-ABP/POST.md b/docs/en/Community-Articles/2026-03-21-Dynamic-Background-Jobs-and-Workers-in-ABP/POST.md new file mode 100644 index 0000000000..06e7e3bf10 --- /dev/null +++ b/docs/en/Community-Articles/2026-03-21-Dynamic-Background-Jobs-and-Workers-in-ABP/POST.md @@ -0,0 +1,224 @@ +# Dynamic Background Jobs and Workers in ABP + +ABP's Background Jobs and Background Workers are two well-established infrastructure pieces. Background jobs handle fire-and-forget async tasks — sending emails, generating reports, processing orders. Background workers handle continuously running periodic tasks — syncing inventory, cleaning up expired data, pushing scheduled notifications. + +This works great, but it has one assumption: **you know all your job and worker types at compile time**. + +In practice, that assumption breaks down more often than you'd expect: + +- You're building a **plugin system** where third-party plugins need to register their own background processing logic at runtime — you can't pre-define an `IBackgroundJob` implementation in the host project for every possible plugin +- Your system needs to execute background tasks based on **external configuration** (database, API responses) — the task types and parameters are entirely unknown at compile time +- Your **multi-tenant SaaS platform** needs different sync intervals for different tenants — some every 30 seconds, some every 5 minutes — and you need to adjust these without restarting the application +- You're building a **low-code/no-code platform** where end users define automation workflows through a visual designer, and those workflows need to run as background jobs or scheduled tasks — the job types and scheduling parameters are entirely determined by end users at runtime, unknowable to developers at compile time + +ABP's **Dynamic Background Jobs** (`IDynamicBackgroundJobManager`) and **Dynamic Background Workers** (`IDynamicBackgroundWorkerManager`) are designed for exactly these scenarios. They let you register, enqueue, schedule, and manage background tasks by name at runtime, with no compile-time type binding required. + +## Dynamic Background Jobs + +`IDynamicBackgroundJobManager` offers two usage patterns, covering different levels of runtime flexibility. + +### Enqueue an Existing Typed Job by Name + +If you already have a typed background job (say, an `EmailSendingJob` registered via `[BackgroundJobName("emails")]`), you can enqueue it by name without referencing its args type: + +```csharp +public class OrderAppService : ApplicationService +{ + private readonly IDynamicBackgroundJobManager _dynamicJobManager; + + public OrderAppService(IDynamicBackgroundJobManager dynamicJobManager) + { + _dynamicJobManager = dynamicJobManager; + } + + public async Task PlaceOrderAsync(PlaceOrderInput input) + { + // Business logic... + + // Enqueue a confirmation email — no reference to EmailSendingJobArgs needed + await _dynamicJobManager.EnqueueAsync("emails", new + { + EmailAddress = input.CustomerEmail, + Subject = "Order Confirmed", + Body = $"Your order {input.OrderId} has been placed." + }); + } +} +``` + +The framework looks up the typed job configuration by name, serializes the anonymous object, deserializes it into the correct args type, and feeds it through the standard typed job pipeline. The caller doesn't need to `using` any specific project namespace. + +### Register a Runtime Dynamic Handler + +When you don't even have a job type — say a plugin decides at startup what processing logic to register — you can register a handler directly: + +```csharp +public override async Task OnApplicationInitializationAsync( + ApplicationInitializationContext context) +{ + var dynamicJobManager = context.ServiceProvider + .GetRequiredService(); + + // A plugin registers its own processing logic at startup + dynamicJobManager.RegisterHandler("SyncExternalCatalog", async (jobContext, ct) => + { + using var doc = JsonDocument.Parse(jobContext.JsonData); + var catalogUrl = doc.RootElement.GetProperty("url").GetString(); + + var httpClient = jobContext.ServiceProvider + .GetRequiredService() + .CreateClient(); + + var catalog = await httpClient.GetStringAsync(catalogUrl, ct); + // Process catalog data... + }); + + // Now you can enqueue jobs for this handler + await dynamicJobManager.EnqueueAsync("SyncExternalCatalog", new + { + Url = "https://partner-api.example.com/catalog" + }); +} +``` + +The handler receives a context object containing `JsonData` (the raw JSON string) and `ServiceProvider` (a scoped container). Resolving dependencies from `ServiceProvider` is the recommended approach — avoid capturing external state in the handler closure. + +There's one priority rule to keep in mind: **if a name matches both a typed job and a dynamic handler, the typed job wins**. Dynamic handlers never accidentally override existing typed jobs. + +> Dynamic jobs ultimately go through the standard typed job pipeline, so they **work with every background job provider** — Default, Hangfire, Quartz, RabbitMQ, TickerQ — without any provider-specific code. + +## Dynamic Background Workers + +`IDynamicBackgroundWorkerManager` lets you register periodic tasks at runtime and manage their full lifecycle: add, remove, update schedule. + +```csharp +public override async Task OnApplicationInitializationAsync( + ApplicationInitializationContext context) +{ + var workerManager = context.ServiceProvider + .GetRequiredService(); + + await workerManager.AddAsync( + "InventorySyncWorker", + new DynamicBackgroundWorkerSchedule + { + Period = 30000 // 30 seconds + }, + async (workerContext, cancellationToken) => + { + var syncService = workerContext.ServiceProvider + .GetRequiredService(); + + await syncService.SyncAsync(cancellationToken); + } + ); +} +``` + +If you're using Hangfire or Quartz as your provider, you can use a cron expression instead of a fixed interval: + +```csharp +await workerManager.AddAsync( + "DailyReportWorker", + new DynamicBackgroundWorkerSchedule + { + CronExpression = "0 2 * * *" // Every day at 2:00 AM + }, + async (workerContext, cancellationToken) => + { + var reportService = workerContext.ServiceProvider + .GetRequiredService(); + + await reportService.GenerateDailyReportAsync(cancellationToken); + } +); +``` + +### Runtime Schedule Management + +Adding a worker is just the beginning. The real value of dynamic workers is that the entire lifecycle is controllable at runtime: + +```csharp +// Check if a worker is currently registered +bool exists = workerManager.IsRegistered("InventorySyncWorker"); + +// A tenant upgrades their plan — speed up sync from 30s to 10s +await workerManager.UpdateScheduleAsync( + "InventorySyncWorker", + new DynamicBackgroundWorkerSchedule { Period = 10000 } +); + +// Tenant disables the sync feature — remove the worker entirely +await workerManager.RemoveAsync("InventorySyncWorker"); +``` + +`UpdateScheduleAsync` only changes the schedule — the handler itself stays the same. For persistent providers like Hangfire and Quartz, `UpdateScheduleAsync` and `RemoveAsync` can operate on the persistent scheduling record even after an application restart, when the handler is no longer in memory. + +### Stopping All Workers + +When you need to stop all dynamic workers at once (e.g., as part of a graceful shutdown), call `StopAllAsync`: + +```csharp +await workerManager.StopAllAsync(cancellationToken); +``` + +All registered workers are stopped and cleaned up, and the handler registry is cleared. Calling `AddAsync` or `UpdateScheduleAsync` after this throws `ObjectDisposedException` — this is intentional, preventing new workers from being added during a shutdown sequence. + +## Provider Support + +Dynamic background jobs and dynamic background workers have different levels of provider support. + +**Dynamic background jobs** are compatible with all providers because they reuse the standard typed job pipeline: + +| Provider | Supported | +|---|---| +| Default (In-Memory) | ✅ | +| Hangfire | ✅ | +| Quartz | ✅ | +| RabbitMQ | ✅ | +| TickerQ | ✅ | + +**Dynamic background workers** have per-provider implementations: + +| Provider | AddAsync | RemoveAsync | UpdateScheduleAsync | Period | CronExpression | +|---|---|---|---|---|---| +| Default (In-Memory) | ✅ | ✅ | ✅ | ✅ | ❌ | +| Hangfire | ✅ | ✅ | ✅ | ✅ | ✅ | +| Quartz | ✅ | ✅ | ✅ | ✅ | ✅ | +| TickerQ | ❌ | ❌ | ❌ | — | — | + +TickerQ uses `FrozenDictionary` for function registration, which requires all functions to be registered before the application starts. Runtime dynamic registration is not possible. + +## Restart Behavior + +Dynamic handlers are stored **in memory** and are not persisted across application restarts. This is a deliberate design choice — handlers are code logic (delegates), and code logic is inherently not serializable. + +For persistent providers (Hangfire, Quartz), this means: enqueued jobs and recurring job entries survive a restart in the database, but the handlers need to be re-registered. If a handler is not re-registered, the job executor throws an exception (background jobs) or skips the execution with a warning log (background workers). + +The recommended approach is to register handlers in `OnApplicationInitializationAsync`, so they are automatically restored on every startup: + +```csharp +public override async Task OnApplicationInitializationAsync( + ApplicationInitializationContext context) +{ + var dynamicJobManager = context.ServiceProvider + .GetRequiredService(); + + // Re-registered on every startup — persistent jobs will find their handler + dynamicJobManager.RegisterHandler("SyncExternalCatalog", async (jobContext, ct) => + { + // handler logic... + }); +} +``` + +## Summary + +`IDynamicBackgroundJobManager` lets you enqueue jobs and register handlers by name at runtime, compatible with all background job providers, no compile-time types required. `IDynamicBackgroundWorkerManager` lets you add, remove, and update the schedule of periodic workers at runtime — Hangfire and Quartz providers also support cron expressions. Register handlers in `OnApplicationInitializationAsync` to ensure automatic recovery on every startup. + +## References + +- [Background Jobs](https://abp.io/docs/latest/framework/infrastructure/background-jobs) +- [Background Workers](https://abp.io/docs/latest/framework/infrastructure/background-workers) +- [Hangfire Background Job Manager](https://abp.io/docs/latest/framework/infrastructure/background-jobs/hangfire) +- [Quartz Background Job Manager](https://abp.io/docs/latest/framework/infrastructure/background-jobs/quartz) diff --git a/docs/en/Community-Articles/2026-03-21-Dynamic-Background-Jobs-and-Workers-in-ABP/cover.jpg b/docs/en/Community-Articles/2026-03-21-Dynamic-Background-Jobs-and-Workers-in-ABP/cover.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8097726b09013da2c5e06e7b8371b43707012ad5 GIT binary patch literal 488972 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�|D>CW0kj#+;d^#sQ0bxP-P>)=F1Re`{e2=|(U0KS1P_AC@j zVSZl0VIK`eaYuXB?k<0SF#R9sc#ECWc;$^7C2u9oZ0Eunv!*h)kIfc;=DI3Hx*j8M zo*cUJM{7%#{^h#RGS%}C|KMBtA0K_%VmE>{ZUX*!mD$G@Xn}ANqetFQj{J(3O;JBZ zx_8@db-t5_3$pI;epy1MAdOsOMKk*99fyXE=FhY>Pn^$r=G6Xd&NsntOj*vmkhEz2 z)4`7gOlwi%OePML(%n+(Z=_Ow-D<_fQibTBSn@RJU>dut=xxfBHE7aCU^sN}fq|Ew zIKLPKLur{&!g1b!8fZ>dzo}2(;fUQHolts1-5Gu8=Sjjg#TkQSl{@l-R#&hbV&$3W zmPZY_vZDD_12i`K?`qh@)0xq@J;R;}r|f7^-ZREeKf2tPJyug245|9&Vt-^fKbdtr z`HPkNLhqg)(*lC$$g}fszY$GUF}QznB7&6u}O?~U8mzr6N)}7 zsTpUow3epI{y3y-T0^1uswseY0wau-HAIw&HXNkpG&f^=aqf{VPMm?V&yW8;wRf!W zAa}GVa7#O~4VX)v!{A*r68MbsJD5?^D=AV<@OJ@W%ig$Hh@5pfrDpyU7m%IQ)9uMR znCj58hJ8_k@c!(^N2qvH!VeWs8wKb~6RJvfxNz|8^UueKWJcYgQbC@gF&O*=kzh%H^T@28rP+9xo%O zRe~!2!0tHm<}9$heW+fX5pLlKcdZ3pXUibdv7`Jm7~FHm(B z=rE*OESeWp88SO)PL~7mfRdx>;vb7)->j7AEJr2w_nl`c!ZH{drRIt}NZ3V5wBn&( z*)rbJTw=9@Mz4*Gwmq1%XWHSLu>g#caVXHKtkTo5g?elV!y*@T{y*dBKK zHD$&904JLjo?qMNO>t@(JbCcLJKFbUQUgt2U+wt7r=-%ZbMo5hx|zwp$F3g57&zn` zn9~iDsGwdvQwe4MfIv~6sxM+M{3z2;-8#qS?KGd(&;Tc!y--EAhx?zL9TdzKc>XGq zP2i^*>=DPaKXlw_atSVS68E}}OWbeNi~f(IbB|}T|Nr&VC=ZREf6IQ!XKNdp=)PA9ejgSn^zHTYFmgX{KZ{Z7Hd_UizcCaxGH z0Ngp!=)tcW%04{UpCTd>wNeZ(RUX1r4AGH%SwI#c(i@{OQ+ldI3ZaLld%fA7}rn@|4t)c?wX z3cLjTM8S*RvmmuoJTt!u0In2rQ_M+}v`fn^U=MgP-#X@X!`gEU%M^&mt|p{De{ zAu1U7^8|tc@NFGi6dqL3r3$(FMS*_*md>7Zzz_xUNvn`&s=#JCRqIv%(FgT_6>rnb z77<>pJ`oDagTdGO`$I&F_3PB&ypZsSlg>CB6Ze*WLD08lPj;hIwRL^&qMm<|>PyQZ zm##$SZ`t2if-E#~<#|TtpvhUiMlJh>QTZf^4xS=xh8()@qNd+MIu)?281WM97v+?J zkhjOu?n@x4PMWg~OpBC>#;QUY*3SInmFz!_IsUlqjX z45YKSj-&AnvZn*Wrl$Xg`F53?j>Vyzpv$jbPB_c>p>K5C0VCtX=gyZGwKU(T?W1#^ zKk5~v>p^pO7Wg`yJ!YhXJ>QS{`EI&jX7A!(sn;MBG16d`dJ|hkikoE`TBQ8RtFh6K z{<_3v?MwcWcbQj>n9TS&2za$L0?kiQkWo`29DA^SXMD^_b*TJ;4*F6F(zs=&9Wzk& z=11c;RS&##d_&J%Z#y?w+WX~1OeJ}gM)?{T6kW;*wDRtGWc_f%inkon zo!L+zU)#kLINm3EI(vxvKc1qmc<4DI7d3~O2J(p^n>us z;+XaYodlUQ3SHMAJ)T0B)i$2gyd8IqgdNQ^A++aQ-mmwS8VNEWU{8U|Y1i->WT!9@ z>DpD!_*^5E>518#ZE$UPJsVhoqeM3jVB*{>vsQly&P3eW`TibS$2>&y-7BH;a8GK> z++pp1Cf1)`^uL}Y0ZL>XVtO_~@*Pjg_*AdPsP9K;Xn^>5K7poKXOK-u$z5oxZYd{gMMiM*W>UQC&S3k;mJyBjNO zgQ5jXkNN%F;dSn_McRH!Sk0nEKj^-#`lHO<=L! zU-9GK!4RihGa$kL0o?y4XeQ^*zA92zV%CR8wq6i0Y1u3jaaEjI=wkv=GSL6@f{|;#m1(#D13n!K!zwnAtYS!Nj9^^Bt*kp>ER%I2uT4H( zIhHixE9u)rciK&tpfi)))ny2`Tb@4Fw}w?J#*PO zv&ycqhWDqV4)2H7mD|ezZ55N$t`Vla$R8a zKu-4QpY}&-DSD*CEv?y^6~`k2O>YHf?I_)EsSuA;Nwme6N zn+r!1-_N!6{0EYz*H#D)ROP;(ITrEI!0^W~yBFG+IX=DDB}*$>Cwm;Gnb$0Iy?i^` z;KiOd+URdvAW6NYOvu$PV|5=AA#7ypI&;Tx4PysP#Q;aZ=k{lHsajoLiuvwqA!F71 z-QC!i6^*5oB;aojo?<(#|Y7kiTBs`WUBiuaEuoQXMYLekn5yHFR>efVU9o z=&9L=nH?gAug`~%e84WjuVc!4_8`5IxO9W?-z9!8l!9E+b{9Hl*~C0|cAxypQCEOk z{NgwDO4J45Z-C1k0YZ(AwYgmb{y_7z>{wy2l(eFvY3jOAk%H_x$hZ*2QwjUYZ~k)J z@k(~jqORWJ=t{3Fjl{1qAa;j_5j}?4JtatYCvn??3$h|C5I5ZG5E)lu67G*YJfhvV zQo|jo227k(d&awOpieFj!Q#{!A7AzAa`8I+%P2u2wzT3*<45h|<@>1UhNAum!G-qi$ivT6r*9VYf4LnJ~VYdKv|S= z?N|-}IkK4T8We&x35*q00MOglb%JYGvUqBbmR+gUv8s$X7B}L!r#-5Nz{&(kai!JC z6Q}qprYMr1a`M%enU`Ifpju+-Lm5A0afx-|b5Nm|(k=I3DeE)1YB9F3)m80EtknI* zU%KGQ;HJ%HK=s8x15$x06Ckhd7gOpAsVe9DO2YH7jYu)JN^st(2UqRj{RSI}^;~6n zZltH$UmCmJc;(ZsZUvfhD4eI*y&DRHDk{JFIU$SA9^$Jt0W_#EhK~eTu~P$o6DPIz zE5OUKRaBV|>rn*uQZWO&krx)<7Kir$qeUQk9@a?*EBhVk$+^08E@ilVEaZQ)Bc6tB zl_SxqCXRwh{#FY$xSzVS={EVg+%Mhv_iC@T!Uhi%0EVjURx}%U8A5izy^(~3WL}pp zy74z@LiKa}Q`z6?x_0m5wVN)o6sHZ+A!Y#@OE8beo?Umkzo%CA`JMLYWLTblCU+*Z z6#y)$lItr?o>4uB_uaVW&an}-E)GsqSLYIw80xiFSIUfv>Y%5~D#F2SVqXkkQ>Gsz zbRX`}B!G26NztPp7#3Mz&t~qTRTwd251#{5gff_~ASu600{4m)aB0<5dzDo~&1KDl zOvY&{wH>f-gr+aChxSp6NRn?lg~;_X(X2y8h{OL3G91qO)w{tHVQ+Fv3+cuk;!ygK|j

n?RxhH<(D5L=37{PU`b|@WIR10 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 Date: Sat, 21 Mar 2026 08:56:41 +0000 Subject: [PATCH 40/40] Optimised images with calibre/image-actions --- .../cover.jpg | Bin 488972 -> 97695 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/en/Community-Articles/2026-03-21-Dynamic-Background-Jobs-and-Workers-in-ABP/cover.jpg b/docs/en/Community-Articles/2026-03-21-Dynamic-Background-Jobs-and-Workers-in-ABP/cover.jpg index 8097726b09013da2c5e06e7b8371b43707012ad5..f1c85ceb589d621b86438dc98af8a273b2404b37 100644 GIT binary patch literal 97695 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

UszjJ!*t!^ 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 l`MHgbA>JMuZBAc_?e}8* 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 literal 488972 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�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

n?RxhH<(D5L=37{PU`b|@WIR10 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