From 7149673715cd5f32270667dd30dfdd4954cda006 Mon Sep 17 00:00:00 2001 From: maliming Date: Mon, 6 Oct 2025 09:46:41 +0800 Subject: [PATCH] Optimize TickerQ background job and worker invocation --- .../TickerQ/AbpBackgroundJobsTickerQModule.cs | 5 +- .../TickerQ/AbpTickerQBackgroundJobManager.cs | 15 +----- .../AbpBackgroundWorkersTickerQModule.cs | 8 +-- ...pTickerQPeriodicBackgroundWorkerInvoker.cs | 49 ++++++++++++++++--- .../Volo/Abp/AbpApplicationBase.cs | 1 - .../appsettings.json | 9 +++- 6 files changed, 54 insertions(+), 33 deletions(-) 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 cd94bae7a7..b5ed598932 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 @@ -10,7 +10,10 @@ using Volo.Abp.TickerQ; namespace Volo.Abp.BackgroundJobs.TickerQ; -[DependsOn(typeof(AbpBackgroundJobsAbstractionsModule), typeof(AbpTickerQModule))] +[DependsOn( + typeof(AbpBackgroundJobsAbstractionsModule), + typeof(AbpTickerQModule) +)] public class AbpBackgroundJobsTickerQModule : AbpModule { private static readonly MethodInfo GetTickerFunctionDelegateMethod = 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 3643c56709..b1a2dbe36d 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,7 +1,5 @@ using System; using System.Threading.Tasks; -using Microsoft.Extensions.Logging; -using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using TickerQ.Utilities; using TickerQ.Utilities.Interfaces.Managers; @@ -13,8 +11,6 @@ namespace Volo.Abp.BackgroundJobs.TickerQ; [Dependency(ReplaceServices = true)] public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientDependency { - public ILogger Logger { get; set; } - protected ITimeTickerManager TimeTickerManager { get; } protected AbpBackgroundJobOptions Options { get; } protected AbpBackgroundJobsTickerQOptions TickerQOptions { get; } @@ -24,8 +20,6 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD IOptions options, IOptions tickerQOptions) { - Logger = NullLogger.Instance; - TimeTickerManager = timeTickerManager; Options = options.Value; TickerQOptions = tickerQOptions.Value; @@ -52,13 +46,6 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD } var result = await TimeTickerManager.AddAsync(timeTicker); - - if (!result.IsSucceded) - { - Logger.LogException(result.Exception); - return timeTicker.Id.ToString(); - } - - return result.Result.Id.ToString(); + return !result.IsSucceded ? timeTicker.Id.ToString() : result.Result.Id.ToString(); } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQModule.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQModule.cs index c223b49867..3fb15a50b8 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQModule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQModule.cs @@ -1,6 +1,5 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using TickerQ.Utilities.Interfaces.Managers; using TickerQ.Utilities.Models.Ticker; @@ -32,12 +31,7 @@ public class AbpBackgroundWorkersTickerQModule : AbpModule cronTicker.RetryIntervals = config.RetryIntervals ?? cronTicker.RetryIntervals; } - var result = await cronTickerManager.AddAsync(cronTicker); - if (!result.IsSucceded) - { - var logger = context.ServiceProvider.GetRequiredService>(); - logger.LogException(result.Exception); - } + await cronTickerManager.AddAsync(cronTicker); } } } diff --git a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQPeriodicBackgroundWorkerInvoker.cs b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQPeriodicBackgroundWorkerInvoker.cs index 5615609606..17cf7cdc87 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQPeriodicBackgroundWorkerInvoker.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQPeriodicBackgroundWorkerInvoker.cs @@ -1,4 +1,5 @@ using System; +using System.Linq.Expressions; using System.Reflection; using System.Threading; using System.Threading.Tasks; @@ -6,22 +7,54 @@ using TickerQ.Utilities.Models; namespace Volo.Abp.BackgroundWorkers.TickerQ; -//TODO: Use lambda expression to improve performance. public class AbpTickerQPeriodicBackgroundWorkerInvoker { - private readonly MethodInfo _doWorkAsyncMethod; - private readonly MethodInfo _doWorkMethod; + private readonly Func? _doWorkAsyncDelegate; + private readonly Action? _doWorkDelegate; protected IBackgroundWorker Worker { get; } protected IServiceProvider ServiceProvider { get; } public AbpTickerQPeriodicBackgroundWorkerInvoker(IBackgroundWorker worker, IServiceProvider serviceProvider) { - _doWorkAsyncMethod = worker.GetType().GetMethod("DoWorkAsync", BindingFlags.Instance | BindingFlags.NonPublic)!; - _doWorkMethod = worker.GetType().GetMethod("DoWork", BindingFlags.Instance | BindingFlags.NonPublic)!; - Worker = worker; ServiceProvider = serviceProvider; + + switch (worker) + { + case AsyncPeriodicBackgroundWorkerBase: + { + var workerType = worker.GetType(); + var method = workerType.GetMethod("DoWorkAsync", BindingFlags.Instance | BindingFlags.NonPublic); + if (method == null) + { + throw new AbpException($"Could not find 'DoWorkAsync' method on type '{workerType.FullName}'."); + } + + var instanceParam = Expression.Parameter(typeof(AsyncPeriodicBackgroundWorkerBase), "worker"); + var contextParam = Expression.Parameter(typeof(PeriodicBackgroundWorkerContext), "context"); + var call = Expression.Call(Expression.Convert(instanceParam, workerType), method, contextParam); + var lambda = Expression.Lambda>(call, instanceParam, contextParam); + _doWorkAsyncDelegate = lambda.Compile(); + break; + } + case PeriodicBackgroundWorkerBase: + { + var workerType = worker.GetType(); + var method = workerType.GetMethod("DoWork", BindingFlags.Instance | BindingFlags.NonPublic); + if (method == null) + { + throw new AbpException($"Could not find 'DoWork' method on type '{workerType.FullName}'."); + } + + var instanceParam = Expression.Parameter(typeof(PeriodicBackgroundWorkerBase), "worker"); + var contextParam = Expression.Parameter(typeof(PeriodicBackgroundWorkerContext), "context"); + var call = Expression.Call(Expression.Convert(instanceParam, workerType), method, contextParam); + var lambda = Expression.Lambda>(call, instanceParam, contextParam); + _doWorkDelegate = lambda.Compile(); + break; + } + } } public virtual async Task DoWorkAsync(TickerFunctionContext context, CancellationToken cancellationToken = default) @@ -30,10 +63,10 @@ public class AbpTickerQPeriodicBackgroundWorkerInvoker switch (Worker) { case AsyncPeriodicBackgroundWorkerBase asyncPeriodicBackgroundWorker: - await (Task)(_doWorkAsyncMethod.Invoke(asyncPeriodicBackgroundWorker, new object[] { workerContext })!); + await _doWorkAsyncDelegate!(asyncPeriodicBackgroundWorker, workerContext); break; case PeriodicBackgroundWorkerBase periodicBackgroundWorker: - _doWorkMethod.Invoke(periodicBackgroundWorker, new object[] { workerContext }); + _doWorkDelegate!(periodicBackgroundWorker, workerContext); break; } } diff --git a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs index 578b697b8b..aa85fabe1c 100644 --- a/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs +++ b/framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs @@ -45,7 +45,6 @@ public abstract class AbpApplicationBase : IAbpApplication StartupModuleType = startupModuleType; Services = services; - services.AddObjectAccessor(services); services.TryAddObjectAccessor(); var options = new AbpApplicationCreationOptions(services); diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/appsettings.json b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/appsettings.json index 0db3279e44..1b2d3bafd8 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/appsettings.json +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/appsettings.json @@ -1,3 +1,8 @@ { - -} + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + } +} \ No newline at end of file