Browse Source

Enhanced Hangfire integration

pull/11591/head
liangshiwei 5 years ago
parent
commit
05c3de3ba5
  1. 19
      framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs
  2. 15
      framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireBackgroundWorkerManager.cs
  3. 13
      framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireBackgroundJobServer.cs
  4. 20
      framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs

19
framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/AbpBackgroundWorkersHangfireModule.cs

@ -1,9 +1,11 @@
using System; using System;
using System.Threading.Tasks;
using Hangfire; using Hangfire;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
using Volo.Abp.Hangfire; using Volo.Abp.Hangfire;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
using Volo.Abp.Threading;
namespace Volo.Abp.BackgroundWorkers.Hangfire; namespace Volo.Abp.BackgroundWorkers.Hangfire;
@ -12,7 +14,12 @@ namespace Volo.Abp.BackgroundWorkers.Hangfire;
typeof(AbpHangfireModule))] typeof(AbpHangfireModule))]
public class AbpBackgroundWorkersHangfireModule : AbpModule 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<IOptions<AbpBackgroundWorkerOptions>>().Value; var options = context.ServiceProvider.GetRequiredService<IOptions<AbpBackgroundWorkerOptions>>().Value;
if (!options.IsEnabled) if (!options.IsEnabled)
@ -20,13 +27,17 @@ public class AbpBackgroundWorkersHangfireModule : AbpModule
var hangfireOptions = context.ServiceProvider.GetRequiredService<IOptions<AbpHangfireOptions>>().Value; var hangfireOptions = context.ServiceProvider.GetRequiredService<IOptions<AbpHangfireOptions>>().Value;
hangfireOptions.BackgroundJobServerFactory = CreateOnlyEnqueueJobServer; hangfireOptions.BackgroundJobServerFactory = CreateOnlyEnqueueJobServer;
} }
await context.ServiceProvider
.GetRequiredService<IBackgroundWorkerManager>()
.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) private BackgroundJobServer CreateOnlyEnqueueJobServer(IServiceProvider serviceProvider)
{ {
serviceProvider.GetRequiredService<JobStorage>(); serviceProvider.GetRequiredService<JobStorage>();

15
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;
using System.Threading.Tasks; using System.Threading.Tasks;
using Hangfire; using Hangfire;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.DynamicProxy; using Volo.Abp.DynamicProxy;
using Volo.Abp.Hangfire;
using Volo.Abp.Threading; using Volo.Abp.Threading;
namespace Volo.Abp.BackgroundWorkers.Hangfire; namespace Volo.Abp.BackgroundWorkers.Hangfire;
@ -12,8 +14,17 @@ namespace Volo.Abp.BackgroundWorkers.Hangfire;
[Dependency(ReplaceServices = true)] [Dependency(ReplaceServices = true)]
public class HangfireBackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDependency public class HangfireBackgroundWorkerManager : IBackgroundWorkerManager, ISingletonDependency
{ {
private AbpHangfireBackgroundJobServer _backgroundJobServer;
private readonly IServiceProvider _serviceProvider;
public HangfireBackgroundWorkerManager(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public Task StartAsync(CancellationToken cancellationToken = default) public Task StartAsync(CancellationToken cancellationToken = default)
{ {
_backgroundJobServer = _serviceProvider.GetRequiredService<AbpHangfireBackgroundJobServer>();
return Task.CompletedTask; return Task.CompletedTask;
} }
@ -29,11 +40,11 @@ public class HangfireBackgroundWorkerManager : IBackgroundWorkerManager, ISingle
var unProxyWorker = ProxyHelper.UnProxy(hangfireBackgroundWorker); var unProxyWorker = ProxyHelper.UnProxy(hangfireBackgroundWorker);
if (hangfireBackgroundWorker.RecurringJobId.IsNullOrWhiteSpace()) if (hangfireBackgroundWorker.RecurringJobId.IsNullOrWhiteSpace())
{ {
RecurringJob.AddOrUpdate(() => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(),hangfireBackgroundWorker.CronExpression); RecurringJob.AddOrUpdate(() => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(), hangfireBackgroundWorker.CronExpression);
} }
else else
{ {
RecurringJob.AddOrUpdate(hangfireBackgroundWorker.RecurringJobId,() => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(), RecurringJob.AddOrUpdate(hangfireBackgroundWorker.RecurringJobId, () => ((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(),
hangfireBackgroundWorker.CronExpression); hangfireBackgroundWorker.CronExpression);
} }
} }

13
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;
}
}

20
framework/src/Volo.Abp.HangFire/Volo/Abp/Hangfire/AbpHangfireModule.cs

@ -9,7 +9,7 @@ namespace Volo.Abp.Hangfire;
[DependsOn(typeof(AbpAuthorizationAbstractionsModule))] [DependsOn(typeof(AbpAuthorizationAbstractionsModule))]
public class AbpHangfireModule : AbpModule public class AbpHangfireModule : AbpModule
{ {
private BackgroundJobServer _backgroundJobServer; private AbpHangfireBackgroundJobServer _backgroundJobServer;
public override void ConfigureServices(ServiceConfigurationContext context) public override void ConfigureServices(ServiceConfigurationContext context)
{ {
@ -18,20 +18,26 @@ public class AbpHangfireModule : AbpModule
{ {
preActions.Configure(configuration); preActions.Configure(configuration);
}); });
}
context.Services.AddSingleton(serviceProvider =>
{
var options = serviceProvider.GetRequiredService<IOptions<AbpHangfireOptions>>().Value;
return new AbpHangfireBackgroundJobServer(options.BackgroundJobServerFactory.Invoke(serviceProvider));
});
}
public override void OnApplicationInitialization(ApplicationInitializationContext context) public override void OnApplicationInitialization(ApplicationInitializationContext context)
{ {
var options = context.ServiceProvider.GetRequiredService<IOptions<AbpHangfireOptions>>().Value; _backgroundJobServer = context.ServiceProvider.GetRequiredService<AbpHangfireBackgroundJobServer>();
_backgroundJobServer = options.BackgroundJobServerFactory.Invoke(context.ServiceProvider);
} }
public override void OnApplicationShutdown(ApplicationShutdownContext context) public override void OnApplicationShutdown(ApplicationShutdownContext context)
{ {
if (_backgroundJobServer != null) if (_backgroundJobServer == null)
{ {
_backgroundJobServer.SendStop(); return;
_backgroundJobServer.Dispose();
} }
_backgroundJobServer.HangfireJobServer?.SendStop();
_backgroundJobServer.HangfireJobServer?.Dispose();
} }
} }

Loading…
Cancel
Save