Browse Source

Optimize TickerQ background job and worker invocation

pull/23802/head
maliming 4 months ago
parent
commit
7149673715
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 5
      framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs
  2. 15
      framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpTickerQBackgroundJobManager.cs
  3. 8
      framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpBackgroundWorkersTickerQModule.cs
  4. 49
      framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/AbpTickerQPeriodicBackgroundWorkerInvoker.cs
  5. 1
      framework/src/Volo.Abp.Core/Volo/Abp/AbpApplicationBase.cs
  6. 9
      modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/appsettings.json

5
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 =

15
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<AbpTickerQBackgroundJobManager> Logger { get; set; }
protected ITimeTickerManager<TimeTicker> TimeTickerManager { get; }
protected AbpBackgroundJobOptions Options { get; }
protected AbpBackgroundJobsTickerQOptions TickerQOptions { get; }
@ -24,8 +20,6 @@ public class AbpTickerQBackgroundJobManager : IBackgroundJobManager, ITransientD
IOptions<AbpBackgroundJobOptions> options,
IOptions<AbpBackgroundJobsTickerQOptions> tickerQOptions)
{
Logger = NullLogger<AbpTickerQBackgroundJobManager>.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();
}
}

8
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<ILogger<AbpBackgroundWorkersTickerQModule>>();
logger.LogException(result.Exception);
}
await cronTickerManager.AddAsync(cronTicker);
}
}
}

49
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<AsyncPeriodicBackgroundWorkerBase, PeriodicBackgroundWorkerContext, Task>? _doWorkAsyncDelegate;
private readonly Action<PeriodicBackgroundWorkerBase, PeriodicBackgroundWorkerContext>? _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<Func<AsyncPeriodicBackgroundWorkerBase, PeriodicBackgroundWorkerContext, Task>>(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<Action<PeriodicBackgroundWorkerBase, PeriodicBackgroundWorkerContext>>(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;
}
}

1
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<IServiceProvider>();
var options = new AbpApplicationCreationOptions(services);

9
modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/appsettings.json

@ -1,3 +1,8 @@
{
}
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
Loading…
Cancel
Save