From 9927b17d836c9f6819c79fd2edebd5861bd14079 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Wed, 25 Jul 2018 14:30:44 +0300 Subject: [PATCH] Implemented hangfire background jobs. --- .../AbpBackgroundJobsAbstractionsModule.cs | 33 +++++++++++++++- .../BackgroundJobs/BackgroundJobException.cs | 38 ------------------- .../BackgroundJobs/BackgroundJobExecuter.cs | 29 ++++++-------- .../BackgroundJobExecutionException.cs | 38 +++++++++++++++++++ .../BackgroundJobManagerExtensions.cs | 4 +- .../BackgroundJobs/BackgroundJobOptions.cs | 2 +- .../BackgroundJobs/IBackgroundJobManager.cs | 2 +- .../Abp/BackgroundJobs/JobExecutionContext.cs | 12 +++--- .../Volo.Abp.BackgroundJobs.HangFire.csproj | 12 +++++- .../AbpBackgroundJobsHangfireModule.cs | 6 ++- .../Hangfire/BackgroundJobManager.cs | 15 -------- .../Hangfire/HangfireBackgroundJobManager.cs | 23 +++++++++++ .../Hangfire/HangfireJobExecutionAdapter.cs | 29 ++++++++++++++ .../BackgroundJobs/AbpBackgroundJobsModule.cs | 33 +--------------- .../BackgroundJobs/BackgroundJobManager.cs | 7 ++-- .../Abp/BackgroundJobs/BackgroundJobWorker.cs | 34 ++++++++++------- .../BackgroundJobExecuter_Tests.cs | 7 +--- .../BackgroundJobManager_Tests.cs | 9 +++-- .../DemoAppHangfireModule.cs | 4 +- ...Abp.BackgroundJobs.DemoApp.HangFire.csproj | 2 +- .../appsettings.json | 5 +++ .../DemoAppSharedModule.cs | 2 +- 22 files changed, 201 insertions(+), 145 deletions(-) delete mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobException.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecutionException.cs delete mode 100644 framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/BackgroundJobManager.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs create mode 100644 modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/appsettings.json diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobsAbstractionsModule.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobsAbstractionsModule.cs index 6612dd3208..376806efbb 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobsAbstractionsModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobsAbstractionsModule.cs @@ -1,6 +1,9 @@ -using Microsoft.Extensions.DependencyInjection; +using System; +using System.Collections.Generic; +using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Json; using Volo.Abp.Modularity; +using Volo.Abp.Reflection; namespace Volo.Abp.BackgroundJobs { @@ -9,9 +12,37 @@ namespace Volo.Abp.BackgroundJobs )] public class AbpBackgroundJobsAbstractionsModule : AbpModule { + public override void PreConfigureServices(ServiceConfigurationContext context) + { + RegisterJobs(context.Services); + } + public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddAssemblyOf(); } + + private static void RegisterJobs(IServiceCollection services) + { + var jobTypes = new List(); + + services.OnRegistred(context => + { + if (ReflectionHelper.IsAssignableToGenericType(context.ImplementationType, typeof(IBackgroundJob<>))) + { + jobTypes.Add(context.ImplementationType); + } + }); + + services.Configure(options => + { + foreach (var jobType in jobTypes) + { + var jobArgsType = BackgroundJobArgsHelper.GetJobArgsType(jobType); + var jobName = BackgroundJobNameAttribute.GetName(jobArgsType); + options.JobTypes[jobName] = jobType; + } + }); + } } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobException.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobException.cs deleted file mode 100644 index bc85df58a6..0000000000 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobException.cs +++ /dev/null @@ -1,38 +0,0 @@ -using System; -using System.Runtime.Serialization; - -namespace Volo.Abp.BackgroundJobs -{ - [Serializable] - public class BackgroundJobException : AbpException - { - public string JobName { get; set; } - - public string JobArgs { get; set; } - - public BackgroundJobException() - { - - } - - /// - /// Creates a new object. - /// - public BackgroundJobException(SerializationInfo serializationInfo, StreamingContext context) - : base(serializationInfo, context) - { - - } - - /// - /// Creates a new object. - /// - /// Exception message - /// Inner exception - public BackgroundJobException(string message, Exception innerException) - : base(message, innerException) - { - - } - } -} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs index 32e86ccb47..83160e71cd 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs @@ -1,5 +1,4 @@ using System; -using System.Diagnostics; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; @@ -13,16 +12,13 @@ namespace Volo.Abp.BackgroundJobs public ILogger Logger { protected get; set; } protected IServiceProvider ServiceProvider { get; } - protected IBackgroundJobSerializer Serializer { get; } protected BackgroundJobOptions Options { get; } public BackgroundJobExecuter( IServiceProvider serviceProvider, - IBackgroundJobSerializer serializer, IOptions options) { ServiceProvider = serviceProvider; - Serializer = serializer; Options = options.Value; Logger = NullLogger.Instance; @@ -30,26 +26,23 @@ namespace Volo.Abp.BackgroundJobs public virtual void Execute(JobExecutionContext context) { - //TODO: Refactor (split to multiple methods). - - var jobType = Options.GetJobType(context.JobName); - using (var scope = ServiceProvider.CreateScope()) { - var job = scope.ServiceProvider.GetService(jobType); + var job = scope.ServiceProvider.GetService(context.JobType); if (job == null) { - throw new AbpException("The job type is not registered to DI: " + jobType); + throw new AbpException("The job type is not registered to DI: " + context.JobType); } - var jobExecuteMethod = job.GetType().GetMethod("Execute"); - Debug.Assert(jobExecuteMethod != null, nameof(jobExecuteMethod) + " != null"); - var argsType = jobExecuteMethod.GetParameters()[0].ParameterType; - var argsObj = Serializer.Deserialize(context.JobArgs, argsType); - + var jobExecuteMethod = context.JobType.GetMethod(nameof(IBackgroundJob.Execute)); + if (jobExecuteMethod == null) + { + throw new AbpException($"Given job type does not implement {typeof(IBackgroundJob<>).Name}. The job type was: " + context.JobType); + } + try { - jobExecuteMethod.Invoke(job, new[] { argsObj }); + jobExecuteMethod.Invoke(job, new[] { context.JobArgs }); } catch (Exception ex) { @@ -58,9 +51,9 @@ namespace Volo.Abp.BackgroundJobs Logger.LogException(ex); //TODO: Somehow trigger an event for the exception (may create an Volo.Abp.ExceptionHandling package)! - var backgroundJobException = new BackgroundJobException("A background job execution is failed. See inner exception for details.", ex) + throw new BackgroundJobExecutionException("A background job execution is failed. See inner exception for details.", ex) { - JobName = context.JobName, + JobType = context.JobType.AssemblyQualifiedName, JobArgs = context.JobArgs }; } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecutionException.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecutionException.cs new file mode 100644 index 0000000000..d6193d4669 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecutionException.cs @@ -0,0 +1,38 @@ +using System; +using System.Runtime.Serialization; + +namespace Volo.Abp.BackgroundJobs +{ + [Serializable] + public class BackgroundJobExecutionException : AbpException + { + public string JobType { get; set; } + + public object JobArgs { get; set; } + + public BackgroundJobExecutionException() + { + + } + + /// + /// Creates a new object. + /// + public BackgroundJobExecutionException(SerializationInfo serializationInfo, StreamingContext context) + : base(serializationInfo, context) + { + + } + + /// + /// Creates a new object. + /// + /// Exception message + /// Inner exception + public BackgroundJobExecutionException(string message, Exception innerException) + : base(message, innerException) + { + + } + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobManagerExtensions.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobManagerExtensions.cs index a35d3e0e05..18a772f01f 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobManagerExtensions.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobManagerExtensions.cs @@ -16,9 +16,9 @@ namespace Volo.Abp.BackgroundJobs /// Job arguments. /// Job priority. /// Job delay (wait duration before first try). - public static void Enqueue(this IBackgroundJobManager backgroundJobManager, TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) + public static string Enqueue(this IBackgroundJobManager backgroundJobManager, TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { - AsyncHelper.RunSync(() => backgroundJobManager.EnqueueAsync(args, priority, delay)); + return AsyncHelper.RunSync(() => backgroundJobManager.EnqueueAsync(args, priority, delay)); } } } diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobOptions.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobOptions.cs index 4d2dd2885f..b36fe46d13 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobOptions.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobOptions.cs @@ -17,7 +17,7 @@ namespace Volo.Abp.BackgroundJobs JobTypes = new Dictionary(); } - internal Type GetJobType(string jobName) + public Type GetJobType(string jobName) { var jobType = JobTypes.GetOrDefault(jobName); diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs index 7dfef8c1a1..0b39bd914d 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs @@ -16,7 +16,7 @@ namespace Volo.Abp.BackgroundJobs /// Job priority. /// Job delay (wait duration before first try). /// Unique identifier of a background job. - Task EnqueueAsync( + Task EnqueueAsync( TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null diff --git a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs index 6323c09cda..90e8503641 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs @@ -1,16 +1,18 @@ -namespace Volo.Abp.BackgroundJobs +using System; + +namespace Volo.Abp.BackgroundJobs { public class JobExecutionContext { - public string JobName { get; } + public Type JobType { get; } - public string JobArgs { get; } + public object JobArgs { get; } public JobExecutionResult Result { get; set; } - public JobExecutionContext(string jobName, string jobArgs) + public JobExecutionContext(Type jobType, object jobArgs) { - JobName = jobName; + JobType = jobType; JobArgs = jobArgs; Result = JobExecutionResult.Success; } diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.csproj b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.csproj index 861fef8c4b..e47408ca4b 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.csproj +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.csproj @@ -1,11 +1,21 @@ - + + + netstandard2.0 + Volo.Abp.BackgroundJobs.HangFire + Volo.Abp.BackgroundJobs.HangFire + $(AssetTargetFallback);portable-net45+win8+wp8+wpa81; + false + false + false + + diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs index 61d4818647..b20e5877a4 100644 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs @@ -1,10 +1,12 @@ using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Hangfire; using Volo.Abp.Modularity; -namespace Volo.Abp.BackgroundJobs.HangFire.Volo.Abp.BackgroundJobs.Hangfire +namespace Volo.Abp.BackgroundJobs.Hangfire { [DependsOn( - typeof(AbpBackgroundJobsAbstractionsModule) + typeof(AbpBackgroundJobsAbstractionsModule), + typeof(AbpHangfireModule) )] public class AbpBackgroundJobsHangfireModule : AbpModule { diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/BackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/BackgroundJobManager.cs deleted file mode 100644 index e1741f68e7..0000000000 --- a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/BackgroundJobManager.cs +++ /dev/null @@ -1,15 +0,0 @@ -using System; -using System.Threading.Tasks; -using Volo.Abp.DependencyInjection; - -namespace Volo.Abp.BackgroundJobs.HangFire.Volo.Abp.BackgroundJobs.Hangfire -{ - public class BackgroundJobManager : IBackgroundJobManager, ITransientDependency - { - public Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, - TimeSpan? delay = null) - { - throw new NotImplementedException(); - } - } -} diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs new file mode 100644 index 0000000000..63cc3c29f2 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs @@ -0,0 +1,23 @@ +using System; +using System.Threading.Tasks; +using Hangfire; +using Volo.Abp.DependencyInjection; + +namespace Volo.Abp.BackgroundJobs.Hangfire +{ + public class HangfireBackgroundJobManager : IBackgroundJobManager, ITransientDependency + { + public Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, + TimeSpan? delay = null) + { + if (!delay.HasValue) + { + return Task.FromResult(BackgroundJob.Enqueue>(adapter => adapter.Execute(args))); + } + else + { + return Task.FromResult(BackgroundJob.Schedule>(adapter => adapter.Execute(args), delay.Value)); + } + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs new file mode 100644 index 0000000000..fe94ae1fec --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs @@ -0,0 +1,29 @@ +using Microsoft.Extensions.Options; + +namespace Volo.Abp.BackgroundJobs.Hangfire +{ + public class HangfireJobExecutionAdapter + { + protected BackgroundJobOptions Options { get; } + protected IBackgroundJobExecuter JobExecuter { get; } + + public HangfireJobExecutionAdapter(IOptions options, IBackgroundJobExecuter jobExecuter) + { + JobExecuter = jobExecuter; + Options = options.Value; + } + + public void Execute(TArgs args) + { + var jobName = BackgroundJobNameAttribute.GetName(); + var jobType = Options.GetJobType(jobName); + + var context = new JobExecutionContext(jobType, args); + JobExecuter.Execute(context); + if (context.Result == JobExecutionResult.Failed) + { + throw new AbpException("Job failed"); + } + } + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobsModule.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobsModule.cs index ce60372a76..01d8ddba05 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobsModule.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobsModule.cs @@ -1,11 +1,8 @@ -using System; -using System.Collections.Generic; -using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Options; using Volo.Abp.BackgroundWorkers; using Volo.Abp.Guids; using Volo.Abp.Modularity; -using Volo.Abp.Reflection; using Volo.Abp.Timing; namespace Volo.Abp.BackgroundJobs @@ -18,11 +15,6 @@ namespace Volo.Abp.BackgroundJobs )] public class AbpBackgroundJobsModule : AbpModule { - public override void PreConfigureServices(ServiceConfigurationContext context) - { - RegisterJobs(context.Services); - } - public override void ConfigureServices(ServiceConfigurationContext context) { context.Services.AddAssemblyOf(); @@ -41,28 +33,5 @@ namespace Volo.Abp.BackgroundJobs ); } } - - private static void RegisterJobs(IServiceCollection services) - { - var jobTypes = new List(); - - services.OnRegistred(context => - { - if (ReflectionHelper.IsAssignableToGenericType(context.ImplementationType, typeof(IBackgroundJob<>))) - { - jobTypes.Add(context.ImplementationType); - } - }); - - services.Configure(options => - { - foreach (var jobType in jobTypes) - { - var jobArgsType = BackgroundJobArgsHelper.GetJobArgsType(jobType); - var jobName = BackgroundJobNameAttribute.GetName(jobArgsType); - options.JobTypes[jobName] = jobType; - } - }); - } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManager.cs index 5fc81eeb07..e58edeafc7 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManager.cs @@ -31,10 +31,11 @@ namespace Volo.Abp.BackgroundJobs Store = store; } - public virtual Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) + public virtual async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { var jobName = BackgroundJobNameAttribute.GetName(); - return EnqueueAsync(jobName, args, priority, delay); + var jobId = await EnqueueAsync(jobName, args, priority, delay); + return jobId.ToString(); } protected virtual async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) @@ -59,4 +60,4 @@ namespace Volo.Abp.BackgroundJobs return jobInfo.Id; } } -} +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs index ec881b690e..bbef21be73 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs @@ -12,8 +12,10 @@ namespace Volo.Abp.BackgroundJobs { protected IBackgroundJobExecuter JobExecuter { get; } protected IBackgroundJobStore Store { get; } - protected BackgroundJobWorkerOptions Options { get; } + protected BackgroundJobOptions JobOptions { get; } + protected BackgroundJobWorkerOptions WorkerOptions { get; } protected IClock Clock { get; } + protected IBackgroundJobSerializer Serializer { get; } /// /// Initializes a new instance of the class. @@ -22,39 +24,45 @@ namespace Volo.Abp.BackgroundJobs IBackgroundJobStore store, AbpTimer timer, IBackgroundJobExecuter jobExecuter, - IOptions options, + IBackgroundJobSerializer serializer, + IOptions jobOptions, + IOptions workerOptions, IClock clock) : base(timer) { JobExecuter = jobExecuter; + Serializer = serializer; Clock = clock; Store = store; - Options = options.Value; - Timer.Period = Options.JobPollPeriod; + WorkerOptions = workerOptions.Value; + JobOptions = jobOptions.Value; + Timer.Period = WorkerOptions.JobPollPeriod; } protected override void DoWork() { - var waitingJobs = AsyncHelper.RunSync(() => Store.GetWaitingJobsAsync(Options.MaxJobFetchCount)); + var waitingJobs = AsyncHelper.RunSync(() => Store.GetWaitingJobsAsync(WorkerOptions.MaxJobFetchCount)); foreach (var jobInfo in waitingJobs) { jobInfo.TryCount++; jobInfo.LastTryTime = Clock.Now; - var context = new JobExecutionContext(jobInfo.JobName, jobInfo.JobArgs); - try { - JobExecuter.Execute(context); + var jobType = JobOptions.GetJobType(jobInfo.JobName); + var jobArgsType = BackgroundJobArgsHelper.GetJobArgsType(jobType); + var jobArgs = Serializer.Deserialize(jobInfo.JobArgs, jobArgsType); + + var context = new JobExecutionContext(jobType, jobArgs); - if (context.Result == JobExecutionResult.Success) + try { + JobExecuter.Execute(context); AsyncHelper.RunSync(() => Store.DeleteAsync(jobInfo.Id)); } - else if (context.Result == JobExecutionResult.Failed) + catch (BackgroundJobExecutionException) { - var nextTryTime = CalculateNextTryTime(jobInfo); if (nextTryTime.HasValue) { @@ -91,12 +99,12 @@ namespace Volo.Abp.BackgroundJobs protected virtual DateTime? CalculateNextTryTime(BackgroundJobInfo jobInfo) //TODO: Move to another place to override easier { - var nextWaitDuration = Options.DefaultFirstWaitDuration * (Math.Pow(Options.DefaultWaitFactor, jobInfo.TryCount - 1)); + var nextWaitDuration = WorkerOptions.DefaultFirstWaitDuration * (Math.Pow(WorkerOptions.DefaultWaitFactor, jobInfo.TryCount - 1)); var nextTryDate = jobInfo.LastTryTime.HasValue ? jobInfo.LastTryTime.Value.AddSeconds(nextWaitDuration) : Clock.Now.AddSeconds(nextWaitDuration); - if (nextTryDate.Subtract(jobInfo.CreationTime).TotalSeconds > Options.DefaultTimeout) + if (nextTryDate.Subtract(jobInfo.CreationTime).TotalSeconds > WorkerOptions.DefaultTimeout) { return null; } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs index 065368fdab..2affc47d97 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs @@ -1,6 +1,5 @@ using System.Threading.Tasks; using Shouldly; -using Volo.Abp.Json; using Xunit; namespace Volo.Abp.BackgroundJobs @@ -8,12 +7,10 @@ namespace Volo.Abp.BackgroundJobs public class BackgroundJobExecuter_Tests : BackgroundJobsTestBase { private readonly IBackgroundJobExecuter _backgroundJobExecuter; - private readonly IJsonSerializer _jsonSerializer; public BackgroundJobExecuter_Tests() { _backgroundJobExecuter = GetRequiredService(); - _jsonSerializer = GetRequiredService(); } [Fact] @@ -28,8 +25,8 @@ namespace Volo.Abp.BackgroundJobs _backgroundJobExecuter.Execute( new JobExecutionContext( - BackgroundJobNameAttribute.GetName(), - _jsonSerializer.Serialize(new MyJobArgs("42")) + typeof(MyJob), + new MyJobArgs("42") ) ); diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs index 526af109b6..2c00573bc7 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using Shouldly; using Xunit; @@ -18,9 +19,9 @@ namespace Volo.Abp.BackgroundJobs [Fact] public async Task Should_Store_Jobs() { - var jobId = await _backgroundJobManager.EnqueueAsync(new MyJobArgs("42")); - jobId.ShouldNotBe(default); - (await _backgroundJobStore.FindAsync(jobId)).ShouldNotBeNull(); + var jobIdAsString = await _backgroundJobManager.EnqueueAsync(new MyJobArgs("42")); + jobIdAsString.ShouldNotBe(default); + (await _backgroundJobStore.FindAsync(Guid.Parse(jobIdAsString))).ShouldNotBeNull(); } } } diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/DemoAppHangfireModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/DemoAppHangfireModule.cs index 09abcc4eeb..aab8921a03 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/DemoAppHangfireModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/DemoAppHangfireModule.cs @@ -2,17 +2,17 @@ using Microsoft.Extensions.DependencyInjection; using Volo.Abp.Autofac; using Volo.Abp.BackgroundJobs.DemoApp.Shared; -using Volo.Abp.Hangfire; using Volo.Abp.Modularity; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.Logging; +using Volo.Abp.BackgroundJobs.Hangfire; namespace Volo.Abp.BackgroundJobs.DemoApp.HangFire { [DependsOn( typeof(DemoAppSharedModule), typeof(AbpAutofacModule), - typeof(AbpHangfireModule) + typeof(AbpBackgroundJobsHangfireModule) )] public class DemoAppHangfireModule : AbpModule { diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj index e65af611a5..b4ea7332fb 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj @@ -8,7 +8,7 @@ - + diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/appsettings.json b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/appsettings.json new file mode 100644 index 0000000000..e1e6966497 --- /dev/null +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/appsettings.json @@ -0,0 +1,5 @@ +{ + "ConnectionStrings": { + "Default": "Server=localhost;Database=BackgroundJobsDemoApp;Trusted_Connection=True;MultipleActiveResultSets=true" + } +} \ No newline at end of file diff --git a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs index 7e3428ba2a..f570f53f4c 100644 --- a/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs +++ b/modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs @@ -14,7 +14,7 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared context.Services.AddAssemblyOf(); } - public override void OnApplicationInitialization(ApplicationInitializationContext context) + public override void OnPostApplicationInitialization(ApplicationInitializationContext context) { context.ServiceProvider .GetRequiredService()