From 05c3de3ba56799d9e6fbbbc49d869d9c8e26b1d3 Mon Sep 17 00:00:00 2001 From: liangshiwei Date: Wed, 16 Feb 2022 14:11:25 +0800 Subject: [PATCH] Enhanced Hangfire integration --- .../AbpBackgroundWorkersHangfireModule.cs | 19 ++++++++++++++---- .../HangfireBackgroundWorkerManager.cs | 15 ++++++++++++-- .../AbpHangfireBackgroundJobServer.cs | 13 ++++++++++++ .../Volo/Abp/Hangfire/AbpHangfireModule.cs | 20 ++++++++++++------- 4 files changed, 54 insertions(+), 13 deletions(-) create mode 100644 framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireBackgroundJobServer.cs diff --git a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs index a17f2bd6a7..50f43736ff 100644 --- a/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs +++ b/framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs @@ -1,9 +1,11 @@ using System; +using System.Threading.Tasks; using Hangfire; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.Hangfire; using Volo.Abp.Modularity; +using Volo.Abp.Threading; namespace Volo.Abp.BackgroundWorkers.Hangfire; @@ -12,7 +14,12 @@ namespace Volo.Abp.BackgroundWorkers.Hangfire; typeof(AbpHangfireModule))] public class AbpBackgroundWorkersHangfireModule : AbpModule { - public override void OnPreApplicationInitialization(ApplicationInitializationContext context) + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddSingleton(typeof(HangfirePeriodicBackgroundWorkerAdapter<>)); + } + + public async override Task OnPreApplicationInitializationAsync(ApplicationInitializationContext context) { var options = context.ServiceProvider.GetRequiredService>().Value; if (!options.IsEnabled) @@ -20,13 +27,17 @@ public class AbpBackgroundWorkersHangfireModule : AbpModule var hangfireOptions = context.ServiceProvider.GetRequiredService>().Value; hangfireOptions.BackgroundJobServerFactory = CreateOnlyEnqueueJobServer; } + + await context.ServiceProvider + .GetRequiredService() + .StartAsync(); } - public override void ConfigureServices(ServiceConfigurationContext context) + public override void OnPreApplicationInitialization(ApplicationInitializationContext context) { - context.Services.AddSingleton(typeof(HangfirePeriodicBackgroundWorkerAdapter<>)); + AsyncHelper.RunSync(() => OnPreApplicationInitializationAsync(context)); } - + private BackgroundJobServer CreateOnlyEnqueueJobServer(IServiceProvider serviceProvider) { serviceProvider.GetRequiredService(); 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 8449dc3df0..89d6105967 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 @@ -3,8 +3,10 @@ using System.Reflection; using System.Threading; using System.Threading.Tasks; using Hangfire; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; using Volo.Abp.DynamicProxy; +using Volo.Abp.Hangfire; using Volo.Abp.Threading; namespace Volo.Abp.BackgroundWorkers.Hangfire; @@ -12,8 +14,17 @@ namespace Volo.Abp.BackgroundWorkers.Hangfire; [Dependency(ReplaceServices = true)] public class HangfireBackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDependency { + private AbpHangfireBackgroundJobServer _backgroundJobServer; + private readonly IServiceProvider _serviceProvider; + + public HangfireBackgroundWorkerManager(IServiceProvider serviceProvider) + { + _serviceProvider = serviceProvider; + } + public Task StartAsync(CancellationToken cancellationToken = default) { + _backgroundJobServer = _serviceProvider.GetRequiredService(); return Task.CompletedTask; } @@ -29,11 +40,11 @@ public class HangfireBackgroundWorkerManager : IBackgroundWorkerManager, ISingle var unProxyWorker = ProxyHelper.UnProxy(hangfireBackgroundWorker); if (hangfireBackgroundWorker.RecurringJobId.IsNullOrWhiteSpace()) { - RecurringJob.AddOrUpdate(() => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(),hangfireBackgroundWorker.CronExpression); + RecurringJob.AddOrUpdate(() => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(), hangfireBackgroundWorker.CronExpression); } else { - RecurringJob.AddOrUpdate(hangfireBackgroundWorker.RecurringJobId,() => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(), + RecurringJob.AddOrUpdate(hangfireBackgroundWorker.RecurringJobId, () => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(), hangfireBackgroundWorker.CronExpression); } } diff --git a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireBackgroundJobServer.cs b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireBackgroundJobServer.cs new file mode 100644 index 0000000000..e24042c87b --- /dev/null +++ b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireBackgroundJobServer.cs @@ -0,0 +1,13 @@ +using Hangfire; + +namespace Volo.Abp.Hangfire; + +public class AbpHangfireBackgroundJobServer +{ + public BackgroundJobServer HangfireJobServer { get; } + + public AbpHangfireBackgroundJobServer(BackgroundJobServer hangfireJobServer) + { + HangfireJobServer = hangfireJobServer; + } +} diff --git a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs index b6de8013b1..13f36751aa 100644 --- a/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs +++ b/framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs @@ -9,7 +9,7 @@ namespace Volo.Abp.Hangfire; [DependsOn(typeof(AbpAuthorizationAbstractionsModule))] public class AbpHangfireModule : AbpModule { - private BackgroundJobServer _backgroundJobServer; + private AbpHangfireBackgroundJobServer _backgroundJobServer; public override void ConfigureServices(ServiceConfigurationContext context) { @@ -18,20 +18,26 @@ public class AbpHangfireModule : AbpModule { preActions.Configure(configuration); }); - } + context.Services.AddSingleton(serviceProvider => + { + var options = serviceProvider.GetRequiredService>().Value; + return new AbpHangfireBackgroundJobServer(options.BackgroundJobServerFactory.Invoke(serviceProvider)); + }); + } public override void OnApplicationInitialization(ApplicationInitializationContext context) { - var options = context.ServiceProvider.GetRequiredService>().Value; - _backgroundJobServer = options.BackgroundJobServerFactory.Invoke(context.ServiceProvider); + _backgroundJobServer = context.ServiceProvider.GetRequiredService(); } public override void OnApplicationShutdown(ApplicationShutdownContext context) { - if (_backgroundJobServer != null) + if (_backgroundJobServer == null) { - _backgroundJobServer.SendStop(); - _backgroundJobServer.Dispose(); + return; } + + _backgroundJobServer.HangfireJobServer?.SendStop(); + _backgroundJobServer.HangfireJobServer?.Dispose(); } }