From d6008c59fb29d39927e8cbc818ffd1f1452b9ad7 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 16 Mar 2026 09:44:20 +0800 Subject: [PATCH 1/6] Upgrade TickerQ packages to 10.2.0 --- Directory.Packages.props | 8 ++++---- .../framework/infrastructure/background-jobs/tickerq.md | 2 +- .../infrastructure/background-workers/tickerq.md | 4 ++-- docs/en/package-version-changes.md | 4 ++++ .../TickerQ/AbpBackgroundJobsTickerQModule.cs | 4 ++-- .../TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs | 2 ++ .../AbpBackgroundWorkersCronTickerConfiguration.cs | 2 ++ .../TickerQ/AbpTickerQBackgroundWorkerManager.cs | 2 +- .../Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs | 4 ++-- .../DemoAppTickerQModule.cs | 2 +- 10 files changed, 21 insertions(+), 13 deletions(-) diff --git a/Directory.Packages.props b/Directory.Packages.props index 805da8ba7d..40fb9c08ef 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -183,10 +183,10 @@ - - - - + + + + diff --git a/docs/en/framework/infrastructure/background-jobs/tickerq.md b/docs/en/framework/infrastructure/background-jobs/tickerq.md index de7b3631f2..37790fe62f 100644 --- a/docs/en/framework/infrastructure/background-jobs/tickerq.md +++ b/docs/en/framework/infrastructure/background-jobs/tickerq.md @@ -101,7 +101,7 @@ public override Task OnPreApplicationInitializationAsync(ApplicationInitializati var request = await TickerRequestProvider.GetRequestAsync(tickerFunctionContext, cancellationToken); var genericContext = new TickerFunctionContext(tickerFunctionContext, request); await service.CleanupLogsAsync(genericContext, cancellationToken); - }))); + }), 0)); abpTickerQFunctionProvider.RequestTypes.TryAdd(nameof(CleanupJobs), (typeof(string).FullName, typeof(string))); return Task.CompletedTask; } diff --git a/docs/en/framework/infrastructure/background-workers/tickerq.md b/docs/en/framework/infrastructure/background-workers/tickerq.md index d4ddde3cd9..2651be4e1c 100644 --- a/docs/en/framework/infrastructure/background-workers/tickerq.md +++ b/docs/en/framework/infrastructure/background-workers/tickerq.md @@ -89,7 +89,7 @@ public override Task OnPreApplicationInitializationAsync(ApplicationInitializati var request = await TickerRequestProvider.GetRequestAsync(tickerFunctionContext, cancellationToken); var genericContext = new TickerFunctionContext(tickerFunctionContext, request); await service.CleanupLogsAsync(genericContext, cancellationToken); - }))); + }), 0)); abpTickerQFunctionProvider.RequestTypes.TryAdd(nameof(CleanupJobs), (typeof(string).FullName, typeof(string))); return Task.CompletedTask; } @@ -118,5 +118,5 @@ abpTickerQFunctionProvider.Functions.TryAdd(nameof(CleanupJobs), (string.Empty, var request = await TickerRequestProvider.GetRequestAsync(tickerFunctionContext, cancellationToken); var genericContext = new TickerFunctionContext(tickerFunctionContext, request); await service.CleanupLogsAsync(genericContext, cancellationToken); -}))); +}), 0)); ``` diff --git a/docs/en/package-version-changes.md b/docs/en/package-version-changes.md index 8e1d492f29..934bb56a32 100644 --- a/docs/en/package-version-changes.md +++ b/docs/en/package-version-changes.md @@ -8,6 +8,10 @@ | Microsoft.IdentityModel.Protocols.OpenIdConnect | 8.14.0 | 8.16.0 | #25068 | | Microsoft.IdentityModel.Tokens | 8.14.0 | 8.16.0 | #25068 | | System.IdentityModel.Tokens.Jwt | 8.14.0 | 8.16.0 | #25068 | +| TickerQ | 10.1.1 | 10.2.0 | #PR | +| TickerQ.Dashboard | 10.1.1 | 10.2.0 | #PR | +| TickerQ.EntityFrameworkCore | 10.1.1 | 10.2.0 | #PR | +| TickerQ.Utilities | 10.1.1 | 10.2.0 | #PR | ## 10.3.0-preview 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..ac0eaaacc1 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 @@ -23,14 +23,14 @@ public class AbpBackgroundJobsTickerQModule : AbpModule { var abpBackgroundJobOptions = context.ServiceProvider.GetRequiredService>(); var abpBackgroundJobsTickerQOptions = context.ServiceProvider.GetRequiredService>(); - var tickerFunctionDelegates = new Dictionary(); + var tickerFunctionDelegates = new Dictionary(); var requestTypes = new Dictionary(); foreach (var jobConfiguration in abpBackgroundJobOptions.Value.GetJobs()) { var genericMethod = GetTickerFunctionDelegateMethod.MakeGenericMethod(jobConfiguration.ArgsType); var tickerFunctionDelegate = (TickerFunctionDelegate)genericMethod.Invoke(null, [jobConfiguration.ArgsType])!; var config = abpBackgroundJobsTickerQOptions.Value.GetConfigurationOrNull(jobConfiguration.JobType); - tickerFunctionDelegates.TryAdd(jobConfiguration.JobName, (string.Empty, config?.Priority ?? TickerTaskPriority.Normal, tickerFunctionDelegate)); + tickerFunctionDelegates.TryAdd(jobConfiguration.JobName, (string.Empty, config?.Priority ?? TickerTaskPriority.Normal, tickerFunctionDelegate, config?.MaxConcurrency ?? 0)); requestTypes.TryAdd(jobConfiguration.JobName, (jobConfiguration.ArgsType.FullName, jobConfiguration.ArgsType)!); } diff --git a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs index ecceaeb28a..1f2c6d32ac 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs @@ -10,5 +10,7 @@ public class AbpBackgroundJobsTimeTickerConfiguration public TickerTaskPriority? Priority { get; set; } + public int? MaxConcurrency { get; set; } + public RunCondition? RunCondition { get; set; } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersCronTickerConfiguration.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersCronTickerConfiguration.cs index 0e8ed89a14..662c05a58a 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersCronTickerConfiguration.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersCronTickerConfiguration.cs @@ -9,4 +9,6 @@ public class AbpBackgroundWorkersCronTickerConfiguration public int[]? RetryIntervals { get; set; } public TickerTaskPriority? Priority { get; set; } + + public int? MaxConcurrency { get; set; } } 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..0593a6e587 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 @@ -57,7 +57,7 @@ public class AbpTickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingl { var workerInvoker = new AbpTickerQPeriodicBackgroundWorkerInvoker(worker, serviceProvider); await workerInvoker.DoWorkAsync(tickerFunctionContext, tickerQCancellationToken); - })); + }, config?.MaxConcurrency ?? 0)); AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.Add(name!, new AbpTickerQCronBackgroundWorker { diff --git a/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs b/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs index b92888e533..48b68f2e8f 100644 --- a/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs +++ b/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs @@ -8,13 +8,13 @@ namespace Volo.Abp.TickerQ; public class AbpTickerQFunctionProvider : ISingletonDependency { - public Dictionary Functions { get;} + public Dictionary Functions { get;} public Dictionary RequestTypes { get; } public AbpTickerQFunctionProvider() { - Functions = new Dictionary(); + Functions = new Dictionary(); RequestTypes = new Dictionary(); } } diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs index de3ef3c05d..01113a50dc 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs @@ -83,7 +83,7 @@ public class DemoAppTickerQModule : AbpModule var request = await TickerRequestProvider.GetRequestAsync(tickerFunctionContext, cancellationToken); var genericContext = new TickerFunctionContext(tickerFunctionContext, request); await service.CleanupLogsAsync(genericContext, cancellationToken); - }))); + }), 0)); abpTickerQFunctionProvider.RequestTypes.TryAdd(nameof(CleanupJobs), (typeof(string).FullName, typeof(string))); return Task.CompletedTask; } From bb7159f0ed8ea2bf469e3e80c9eb6780cf2baa32 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 16 Mar 2026 09:44:47 +0800 Subject: [PATCH 2/6] Update package-version-changes.md with PR number #25091 --- docs/en/package-version-changes.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/package-version-changes.md b/docs/en/package-version-changes.md index 934bb56a32..67fce824d8 100644 --- a/docs/en/package-version-changes.md +++ b/docs/en/package-version-changes.md @@ -8,10 +8,10 @@ | Microsoft.IdentityModel.Protocols.OpenIdConnect | 8.14.0 | 8.16.0 | #25068 | | Microsoft.IdentityModel.Tokens | 8.14.0 | 8.16.0 | #25068 | | System.IdentityModel.Tokens.Jwt | 8.14.0 | 8.16.0 | #25068 | -| TickerQ | 10.1.1 | 10.2.0 | #PR | -| TickerQ.Dashboard | 10.1.1 | 10.2.0 | #PR | -| TickerQ.EntityFrameworkCore | 10.1.1 | 10.2.0 | #PR | -| TickerQ.Utilities | 10.1.1 | 10.2.0 | #PR | +| TickerQ | 10.1.1 | 10.2.0 | #25091 | +| TickerQ.Dashboard | 10.1.1 | 10.2.0 | #25091 | +| TickerQ.EntityFrameworkCore | 10.1.1 | 10.2.0 | #25091 | +| TickerQ.Utilities | 10.1.1 | 10.2.0 | #25091 | ## 10.3.0-preview From 956e0ef882671b1b26ed6eb21295c75a5af07ac1 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 16 Mar 2026 09:53:07 +0800 Subject: [PATCH 3/6] Revert package-version-changes.md --- docs/en/package-version-changes.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/en/package-version-changes.md b/docs/en/package-version-changes.md index 67fce824d8..8e1d492f29 100644 --- a/docs/en/package-version-changes.md +++ b/docs/en/package-version-changes.md @@ -8,10 +8,6 @@ | Microsoft.IdentityModel.Protocols.OpenIdConnect | 8.14.0 | 8.16.0 | #25068 | | Microsoft.IdentityModel.Tokens | 8.14.0 | 8.16.0 | #25068 | | System.IdentityModel.Tokens.Jwt | 8.14.0 | 8.16.0 | #25068 | -| TickerQ | 10.1.1 | 10.2.0 | #25091 | -| TickerQ.Dashboard | 10.1.1 | 10.2.0 | #25091 | -| TickerQ.EntityFrameworkCore | 10.1.1 | 10.2.0 | #25091 | -| TickerQ.Utilities | 10.1.1 | 10.2.0 | #25091 | ## 10.3.0-preview From e246cf4cab8945b69e38bc99c1a55a79e7a451e6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Mon, 16 Mar 2026 01:53:42 +0000 Subject: [PATCH 4/6] docs: update package version changes [skip ci] --- docs/en/package-version-changes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/package-version-changes.md b/docs/en/package-version-changes.md index 8e1d492f29..67fce824d8 100644 --- a/docs/en/package-version-changes.md +++ b/docs/en/package-version-changes.md @@ -8,6 +8,10 @@ | Microsoft.IdentityModel.Protocols.OpenIdConnect | 8.14.0 | 8.16.0 | #25068 | | Microsoft.IdentityModel.Tokens | 8.14.0 | 8.16.0 | #25068 | | System.IdentityModel.Tokens.Jwt | 8.14.0 | 8.16.0 | #25068 | +| TickerQ | 10.1.1 | 10.2.0 | #25091 | +| TickerQ.Dashboard | 10.1.1 | 10.2.0 | #25091 | +| TickerQ.EntityFrameworkCore | 10.1.1 | 10.2.0 | #25091 | +| TickerQ.Utilities | 10.1.1 | 10.2.0 | #25091 | ## 10.3.0-preview From f0228f007aeb090e8d00ae2c16371b8601e3aeea Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 16 Mar 2026 10:04:35 +0800 Subject: [PATCH 5/6] Add AddFunction helper to AbpTickerQFunctionProvider and use named tuple fields --- .../infrastructure/background-jobs/tickerq.md | 4 ++-- .../background-workers/tickerq.md | 8 ++++---- .../TickerQ/AbpBackgroundJobsTickerQModule.cs | 18 +++--------------- .../AbpTickerQBackgroundWorkerManager.cs | 4 ++-- .../Abp/TickerQ/AbpTickerQFunctionProvider.cs | 13 +++++++++++-- .../DemoAppTickerQModule.cs | 4 ++-- 6 files changed, 24 insertions(+), 27 deletions(-) diff --git a/docs/en/framework/infrastructure/background-jobs/tickerq.md b/docs/en/framework/infrastructure/background-jobs/tickerq.md index 37790fe62f..81dd021607 100644 --- a/docs/en/framework/infrastructure/background-jobs/tickerq.md +++ b/docs/en/framework/infrastructure/background-jobs/tickerq.md @@ -95,13 +95,13 @@ public class CleanupJobs public override Task OnPreApplicationInitializationAsync(ApplicationInitializationContext context) { var abpTickerQFunctionProvider = context.ServiceProvider.GetRequiredService(); - abpTickerQFunctionProvider.Functions.TryAdd(nameof(CleanupJobs), (string.Empty, TickerTaskPriority.Normal, new TickerFunctionDelegate(async (cancellationToken, serviceProvider, tickerFunctionContext) => + abpTickerQFunctionProvider.AddFunction(nameof(CleanupJobs), async (cancellationToken, serviceProvider, tickerFunctionContext) => { var service = new CleanupJobs(); // Or get it from the serviceProvider var request = await TickerRequestProvider.GetRequestAsync(tickerFunctionContext, cancellationToken); var genericContext = new TickerFunctionContext(tickerFunctionContext, request); await service.CleanupLogsAsync(genericContext, cancellationToken); - }), 0)); + }, TickerTaskPriority.Normal); abpTickerQFunctionProvider.RequestTypes.TryAdd(nameof(CleanupJobs), (typeof(string).FullName, typeof(string))); return Task.CompletedTask; } diff --git a/docs/en/framework/infrastructure/background-workers/tickerq.md b/docs/en/framework/infrastructure/background-workers/tickerq.md index 2651be4e1c..4547b85b85 100644 --- a/docs/en/framework/infrastructure/background-workers/tickerq.md +++ b/docs/en/framework/infrastructure/background-workers/tickerq.md @@ -83,13 +83,13 @@ public class CleanupJobs public override Task OnPreApplicationInitializationAsync(ApplicationInitializationContext context) { var abpTickerQFunctionProvider = context.ServiceProvider.GetRequiredService(); - abpTickerQFunctionProvider.Functions.TryAdd(nameof(CleanupJobs), (string.Empty, TickerTaskPriority.Normal, new TickerFunctionDelegate(async (cancellationToken, serviceProvider, tickerFunctionContext) => + abpTickerQFunctionProvider.AddFunction(nameof(CleanupJobs), async (cancellationToken, serviceProvider, tickerFunctionContext) => { var service = new CleanupJobs(); // Or get it from the serviceProvider var request = await TickerRequestProvider.GetRequestAsync(tickerFunctionContext, cancellationToken); var genericContext = new TickerFunctionContext(tickerFunctionContext, request); await service.CleanupLogsAsync(genericContext, cancellationToken); - }), 0)); + }, TickerTaskPriority.Normal); abpTickerQFunctionProvider.RequestTypes.TryAdd(nameof(CleanupJobs), (typeof(string).FullName, typeof(string))); return Task.CompletedTask; } @@ -112,11 +112,11 @@ await cronTickerManager.AddAsync(new CronTickerEntity You can specify a cron expression instead of using `ICronTickerManager` to add a worker: ```csharp -abpTickerQFunctionProvider.Functions.TryAdd(nameof(CleanupJobs), (string.Empty, TickerTaskPriority.Normal, new TickerFunctionDelegate(async (cancellationToken, serviceProvider, tickerFunctionContext) => +abpTickerQFunctionProvider.AddFunction(nameof(CleanupJobs), async (cancellationToken, serviceProvider, tickerFunctionContext) => { var service = new CleanupJobs(); var request = await TickerRequestProvider.GetRequestAsync(tickerFunctionContext, cancellationToken); var genericContext = new TickerFunctionContext(tickerFunctionContext, request); await service.CleanupLogsAsync(genericContext, cancellationToken); -}), 0)); +}, TickerTaskPriority.Normal); ``` 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 ac0eaaacc1..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 @@ -23,26 +23,14 @@ public class AbpBackgroundJobsTickerQModule : AbpModule { var abpBackgroundJobOptions = context.ServiceProvider.GetRequiredService>(); var abpBackgroundJobsTickerQOptions = context.ServiceProvider.GetRequiredService>(); - var tickerFunctionDelegates = new Dictionary(); - var requestTypes = new Dictionary(); + var abpTickerQFunctionProvider = context.ServiceProvider.GetRequiredService(); foreach (var jobConfiguration in abpBackgroundJobOptions.Value.GetJobs()) { var genericMethod = GetTickerFunctionDelegateMethod.MakeGenericMethod(jobConfiguration.ArgsType); var tickerFunctionDelegate = (TickerFunctionDelegate)genericMethod.Invoke(null, [jobConfiguration.ArgsType])!; var config = abpBackgroundJobsTickerQOptions.Value.GetConfigurationOrNull(jobConfiguration.JobType); - tickerFunctionDelegates.TryAdd(jobConfiguration.JobName, (string.Empty, config?.Priority ?? TickerTaskPriority.Normal, tickerFunctionDelegate, config?.MaxConcurrency ?? 0)); - requestTypes.TryAdd(jobConfiguration.JobName, (jobConfiguration.ArgsType.FullName, jobConfiguration.ArgsType)!); - } - - var abpTickerQFunctionProvider = context.ServiceProvider.GetRequiredService(); - foreach (var functionDelegate in tickerFunctionDelegates) - { - abpTickerQFunctionProvider.Functions.TryAdd(functionDelegate.Key, functionDelegate.Value); - } - - foreach (var requestType in requestTypes) - { - abpTickerQFunctionProvider.RequestTypes.TryAdd(requestType.Key, requestType.Value); + abpTickerQFunctionProvider.AddFunction(jobConfiguration.JobName, tickerFunctionDelegate, config?.Priority ?? TickerTaskPriority.Normal, config?.MaxConcurrency ?? 0); + abpTickerQFunctionProvider.RequestTypes.TryAdd(jobConfiguration.JobName, (jobConfiguration.ArgsType.FullName, jobConfiguration.ArgsType)!); } } 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 0593a6e587..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 @@ -53,11 +53,11 @@ public class AbpTickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingl var name = BackgroundWorkerNameAttribute.GetNameOrNull(worker.GetType()) ?? worker.GetType().FullName; var config = Options.GetConfigurationOrNull(ProxyHelper.GetUnProxiedType(worker)); - AbpTickerQFunctionProvider.Functions.TryAdd(name!, (string.Empty, config?.Priority ?? TickerTaskPriority.LongRunning, async (tickerQCancellationToken, serviceProvider, tickerFunctionContext) => + AbpTickerQFunctionProvider.AddFunction(name!, async (tickerQCancellationToken, serviceProvider, tickerFunctionContext) => { var workerInvoker = new AbpTickerQPeriodicBackgroundWorkerInvoker(worker, serviceProvider); await workerInvoker.DoWorkAsync(tickerFunctionContext, tickerQCancellationToken); - }, config?.MaxConcurrency ?? 0)); + }, config?.Priority ?? TickerTaskPriority.LongRunning, config?.MaxConcurrency ?? 0); AbpTickerQBackgroundWorkersProvider.BackgroundWorkers.Add(name!, new AbpTickerQCronBackgroundWorker { diff --git a/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs b/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs index 48b68f2e8f..ebac97c8c7 100644 --- a/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs +++ b/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs @@ -8,13 +8,22 @@ namespace Volo.Abp.TickerQ; public class AbpTickerQFunctionProvider : ISingletonDependency { - public Dictionary Functions { get;} + public Dictionary Functions { get; } - public Dictionary RequestTypes { get; } + public Dictionary RequestTypes { get; } public AbpTickerQFunctionProvider() { Functions = new Dictionary(); RequestTypes = new Dictionary(); } + + public void AddFunction( + string name, + TickerFunctionDelegate function, + TickerTaskPriority priority = TickerTaskPriority.Normal, + int maxConcurrency = 0) + { + Functions.TryAdd(name, (string.Empty, priority, function, maxConcurrency)); + } } diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs index 01113a50dc..29027a2a75 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs @@ -77,13 +77,13 @@ public class DemoAppTickerQModule : AbpModule public override Task OnPreApplicationInitializationAsync(ApplicationInitializationContext context) { var abpTickerQFunctionProvider = context.ServiceProvider.GetRequiredService(); - abpTickerQFunctionProvider.Functions.TryAdd(nameof(CleanupJobs), (string.Empty, TickerTaskPriority.Normal, new TickerFunctionDelegate(async (cancellationToken, serviceProvider, tickerFunctionContext) => + abpTickerQFunctionProvider.AddFunction(nameof(CleanupJobs), async (cancellationToken, serviceProvider, tickerFunctionContext) => { var service = new CleanupJobs(); var request = await TickerRequestProvider.GetRequestAsync(tickerFunctionContext, cancellationToken); var genericContext = new TickerFunctionContext(tickerFunctionContext, request); await service.CleanupLogsAsync(genericContext, cancellationToken); - }), 0)); + }, TickerTaskPriority.Normal); abpTickerQFunctionProvider.RequestTypes.TryAdd(nameof(CleanupJobs), (typeof(string).FullName, typeof(string))); return Task.CompletedTask; } From 5eaffd2bf28400fd1e0ee2e2911a91b74a63c81e Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 16 Mar 2026 10:20:29 +0800 Subject: [PATCH 6/6] Simplify AbpTickerQFunctionProvider and add input validation to AddFunction --- .../Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs b/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs index ebac97c8c7..b6b05e7787 100644 --- a/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs +++ b/framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs @@ -24,6 +24,17 @@ public class AbpTickerQFunctionProvider : ISingletonDependency TickerTaskPriority priority = TickerTaskPriority.Normal, int maxConcurrency = 0) { - Functions.TryAdd(name, (string.Empty, priority, function, maxConcurrency)); + Check.NotNullOrWhiteSpace(name, nameof(name)); + Check.NotNull(function, nameof(function)); + + if (maxConcurrency < 0) + { + throw new ArgumentException("maxConcurrency must be greater than or equal to 0.", nameof(maxConcurrency)); + } + + if (!Functions.TryAdd(name, (string.Empty, priority, function, maxConcurrency))) + { + throw new AbpException($"A function with the name '{name}' is already registered."); + } } }