From 6b5ee29f745bb53a9100b83102e5a84f3e6c9251 Mon Sep 17 00:00:00 2001 From: Halil ibrahim Kalkan Date: Mon, 23 Jul 2018 16:21:55 +0300 Subject: [PATCH] Refactored background jobs. --- .../BackgroundJobs/BackgroundJobExecuter.cs | 119 ++++++++++++++++++ .../Abp/BackgroundJobs/BackgroundJobInfo.cs | 4 +- .../BackgroundJobs/BackgroundJobManager.cs | 117 +++-------------- .../BackgroundJobManagerExtensions.cs | 26 +++- .../BackgroundJobNameAttribute.cs | 30 +++++ .../BackgroundJobs/BackgroundJobOptions.cs | 19 ++- .../BackgroundJobs/IBackgroundJobExecuter.cs | 7 ++ .../BackgroundJobs/IBackgroundJobManager.cs | 19 +-- .../IBackgroundJobNameProvider.cs | 7 ++ .../JsonBackgroundJobSerializer.cs | 3 +- .../Volo.Abp.BackgroundJobs.Tests.csproj | 1 + ...bp.BackgroundJobs.Tests.csproj.DotSettings | 2 + .../AbpBackgroundJobsTestModule.cs | 16 +++ .../BackgroundJobManager_Tests.cs | 42 +++++++ .../BackgroundJobs/BackgroundJobsTestBase.cs | 7 ++ .../Volo/Abp/BackgroundJobs/Class1.cs | 7 -- 16 files changed, 302 insertions(+), 124 deletions(-) create mode 100644 framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobNameAttribute.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobExecuter.cs create mode 100644 framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobNameProvider.cs create mode 100644 framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj.DotSettings create mode 100644 framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs create mode 100644 framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs create mode 100644 framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobsTestBase.cs delete mode 100644 framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/Class1.cs diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs new file mode 100644 index 0000000000..ccbe5cd28b --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs @@ -0,0 +1,119 @@ +using System; +using System.Diagnostics; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Options; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Threading; +using Volo.Abp.Timing; + +namespace Volo.Abp.BackgroundJobs +{ + public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependency + { + public ILogger Logger { protected get; set; } + + protected IServiceProvider ServiceProvider { get; } + protected IClock Clock { get; } + protected IBackgroundJobSerializer Serializer { get; } + protected IBackgroundJobStore Store { get; } + protected BackgroundJobOptions Options { get; } + + public BackgroundJobExecuter( + IServiceProvider serviceProvider, + IClock clock, + IBackgroundJobSerializer serializer, + IBackgroundJobStore store, + IOptions options) + { + ServiceProvider = serviceProvider; + Clock = clock; + Serializer = serializer; + Options = options.Value; + Store = store; + + Logger = NullLogger.Instance; + } + + public void Execute(BackgroundJobInfo jobInfo) + { + try + { + jobInfo.TryCount++; + jobInfo.LastTryTime = Clock.Now; + + var jobType = Options.GetJobType(jobInfo.JobName); + + using (var scope = ServiceProvider.CreateScope()) + { + var job = scope.ServiceProvider.GetService(jobType); + if (job == null) + { + throw new AbpException("JobName is not registered: " + jobType); + } + + //TODO: Type check for the job object + + var jobExecuteMethod = job.GetType().GetMethod("Execute"); + Debug.Assert(jobExecuteMethod != null, nameof(jobExecuteMethod) + " != null"); + var argsType = jobExecuteMethod.GetParameters()[0].ParameterType; + var argsObj = Serializer.Deserialize(jobInfo.JobArgs, argsType); + + try + { + jobExecuteMethod.Invoke(job, new[] { argsObj }); + AsyncHelper.RunSync(() => Store.DeleteAsync(jobInfo)); + } + catch (Exception ex) + { + Logger.LogException(ex); + + var nextTryTime = jobInfo.CalculateNextTryTime(Clock); + if (nextTryTime.HasValue) + { + jobInfo.NextTryTime = nextTryTime.Value; + } + else + { + jobInfo.IsAbandoned = true; + } + + TryUpdate(jobInfo); + + var backgroundJobException = new BackgroundJobException( + "A background job execution is failed. See inner exception for details. See BackgroundJob property to get information on the background job.", + ex + ) + { + BackgroundJob = jobInfo, + JobObject = job + }; + + //TODO: Somehow trigger an event for the exception (may create an Volo.Abp.ExceptionHandling package)! + } + } + } + catch (Exception ex) + { + Logger.LogException(ex); + + jobInfo.IsAbandoned = true; + + TryUpdate(jobInfo); + } + } + + private void TryUpdate(BackgroundJobInfo jobInfo) + { + try + { + Store.UpdateAsync(jobInfo); + } + catch (Exception updateEx) + { + Logger.LogException(updateEx); + } + } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs index de9e4d83a6..3825196014 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobInfo.cs @@ -10,7 +10,7 @@ namespace Volo.Abp.BackgroundJobs public class BackgroundJobInfo { /// - /// Maximum length of . + /// Maximum length of . /// Value: 512. /// public const int MaxJobTypeLength = 512; @@ -48,7 +48,7 @@ namespace Volo.Abp.BackgroundJobs /// [Required] [StringLength(MaxJobTypeLength)] - public virtual string JobType { get; set; } + public virtual string JobName { get; set; } /// /// Job arguments as JSON string. 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 09554c9268..5751159a4a 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManager.cs @@ -1,8 +1,5 @@ using System; -using System.Diagnostics; using System.Threading.Tasks; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using Volo.Abp.BackgroundWorkers; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; @@ -11,6 +8,8 @@ using Volo.Abp.Timing; namespace Volo.Abp.BackgroundJobs { + //TODO: Split enqueueing & background worker! + /// /// Default implementation of . /// @@ -22,10 +21,10 @@ namespace Volo.Abp.BackgroundJobs /// public static int JobPollPeriod { get; set; } //TODO: Move to options - protected IServiceProvider ServiceProvider { get; } protected IClock Clock { get; } protected IBackgroundJobSerializer Serializer { get; } protected IGuidGenerator GuidGenerator { get; } + protected IBackgroundJobExecuter JobExecuter { get; } protected IBackgroundJobStore Store { get; } static BackgroundJobManager() @@ -37,30 +36,35 @@ namespace Volo.Abp.BackgroundJobs /// Initializes a new instance of the class. /// public BackgroundJobManager( - IServiceProvider serviceProvider, IClock clock, IBackgroundJobSerializer serializer, IBackgroundJobStore store, IGuidGenerator guidGenerator, - AbpTimer timer) + AbpTimer timer, + IBackgroundJobExecuter jobExecuter) : base(timer) { - ServiceProvider = serviceProvider; Clock = clock; Serializer = serializer; GuidGenerator = guidGenerator; + JobExecuter = jobExecuter; Store = store; Timer.Period = JobPollPeriod; } - public async Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) - where TJob : IBackgroundJob + public Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) + { + var jobName = BackgroundJobNameAttribute.GetNameOrNull(); + return EnqueueAsync(jobName, args, priority, delay); + } + + public async Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { var jobInfo = new BackgroundJobInfo { Id = GuidGenerator.Create(), - JobType = typeof(TJob).AssemblyQualifiedName, + JobName = jobName, JobArgs = Serializer.Serialize(args), Priority = priority, CreationTime = Clock.Now, @@ -77,104 +81,13 @@ namespace Volo.Abp.BackgroundJobs return jobInfo.Id; } - public async Task DeleteAsync(Guid jobId) - { - var jobInfo = await Store.FindAsync(jobId); - if (jobInfo == null) - { - return false; - } - - await Store.DeleteAsync(jobInfo); - return true; - } - protected override void DoWork() { var waitingJobs = AsyncHelper.RunSync(() => Store.GetWaitingJobsAsync(1000)); foreach (var job in waitingJobs) { - TryProcessJob(job); - } - } - - private void TryProcessJob(BackgroundJobInfo jobInfo) - { - try - { - jobInfo.TryCount++; - jobInfo.LastTryTime = Clock.Now; - - var jobType = Type.GetType(jobInfo.JobType); - using (var scope = ServiceProvider.CreateScope()) - { - var job = scope.ServiceProvider.GetService(jobType); - if (job == null) - { - throw new AbpException("JobType is not registered: " + jobType); - } - - //TODO: Type check for the job object - - var jobExecuteMethod = job.GetType().GetMethod("Execute"); - Debug.Assert(jobExecuteMethod != null, nameof(jobExecuteMethod) + " != null"); - var argsType = jobExecuteMethod.GetParameters()[0].ParameterType; - var argsObj = Serializer.Deserialize(jobInfo.JobArgs, argsType); - - try - { - jobExecuteMethod.Invoke(job, new[] { argsObj }); - AsyncHelper.RunSync(() => Store.DeleteAsync(jobInfo)); - } - catch (Exception ex) - { - Logger.LogException(ex); - - var nextTryTime = jobInfo.CalculateNextTryTime(Clock); - if (nextTryTime.HasValue) - { - jobInfo.NextTryTime = nextTryTime.Value; - } - else - { - jobInfo.IsAbandoned = true; - } - - TryUpdate(jobInfo); - - var backgroundJobException = new BackgroundJobException( - "A background job execution is failed. See inner exception for details. See BackgroundJob property to get information on the background job.", - ex - ) - { - BackgroundJob = jobInfo, - JobObject = job - }; - - //TODO: Somehow trigger an event for the exception (may create an Volo.Abp.ExceptionHandling package)! - } - } - } - catch (Exception ex) - { - Logger.LogException(ex); - - jobInfo.IsAbandoned = true; - - TryUpdate(jobInfo); - } - } - - private void TryUpdate(BackgroundJobInfo jobInfo) - { - try - { - Store.UpdateAsync(jobInfo); - } - catch (Exception updateEx) - { - Logger.LogException(updateEx); + JobExecuter.Execute(job); } } } diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManagerExtensions.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManagerExtensions.cs index b6cbca221b..852e9acb71 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManagerExtensions.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManagerExtensions.cs @@ -1,4 +1,5 @@ using System; +using System.Threading.Tasks; using Volo.Abp.Threading; namespace Volo.Abp.BackgroundJobs @@ -11,16 +12,33 @@ namespace Volo.Abp.BackgroundJobs /// /// Enqueues a job to be executed. /// - /// Type of the job. /// Type of the arguments of job. /// Background job manager reference /// 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) - where TJob : IBackgroundJob + public static void Enqueue(this IBackgroundJobManager backgroundJobManager, TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) { - AsyncHelper.RunSync(() => backgroundJobManager.EnqueueAsync(args, priority, delay)); + AsyncHelper.RunSync(() => backgroundJobManager.EnqueueAsync(args, priority, delay)); + } + + /// + /// Enqueues a job to be executed. + /// + /// Background job manager reference + /// Job name. + /// Job arguments. + /// Job priority. + /// Job delay (wait duration before first try). + /// Unique identifier of a background job. + public static Guid EnqueueAsync( + this IBackgroundJobManager backgroundJobManager, + string jobName, + object args, + BackgroundJobPriority priority = BackgroundJobPriority.Normal, + TimeSpan? delay = null) + { + return AsyncHelper.RunSync(() => backgroundJobManager.EnqueueAsync(jobName, args, priority, delay)); } } } diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobNameAttribute.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobNameAttribute.cs new file mode 100644 index 0000000000..ea5505edab --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobNameAttribute.cs @@ -0,0 +1,30 @@ +using System; +using System.Linq; +using JetBrains.Annotations; + +namespace Volo.Abp.BackgroundJobs +{ + public class BackgroundJobNameAttribute : Attribute, IBackgroundJobNameProvider + { + public string Name { get; } + + public BackgroundJobNameAttribute([NotNull] string name) + { + Name = Check.NotNullOrWhiteSpace(name, nameof(name)); + } + + public static string GetNameOrNull() + { + return GetNameOrNull(typeof(TJobArgs)); + } + + public static string GetNameOrNull(Type jobArgsType) + { + return jobArgsType + .GetCustomAttributes(true) + .OfType() + .FirstOrDefault() + ?.Name; + } + } +} diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobOptions.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobOptions.cs index abd89e6e40..42d6999993 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobOptions.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobOptions.cs @@ -1,12 +1,29 @@ -namespace Volo.Abp.BackgroundJobs +using System; +using System.Collections.Generic; + +namespace Volo.Abp.BackgroundJobs { public class BackgroundJobOptions { + public Dictionary JobTypes { get; } + public bool IsJobExecutionEnabled { get; set; } public BackgroundJobOptions() { IsJobExecutionEnabled = true; + JobTypes = new Dictionary(); + } + + public Type GetJobType(string jobName) + { + var jobType = JobTypes.GetOrDefault(jobName); + if (jobType == null) + { + throw new AbpException("Undefined background job type for the job name: " + jobName); + } + + return jobType; } } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobExecuter.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobExecuter.cs new file mode 100644 index 0000000000..a0010952d3 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobExecuter.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BackgroundJobs +{ + public interface IBackgroundJobExecuter + { + void Execute(BackgroundJobInfo jobInfo); + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs index 526e6c84d6..238e46d520 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs @@ -13,20 +13,25 @@ namespace Volo.Abp.BackgroundJobs /// /// Enqueues a job to be executed. /// - /// Type of the job. /// Type of the arguments of job. /// Job arguments. /// Job priority. /// Job delay (wait duration before first try). /// Unique identifier of a background job. - Task EnqueueAsync(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null) - where TJob : IBackgroundJob; + Task EnqueueAsync( + TArgs args, + BackgroundJobPriority priority = BackgroundJobPriority.Normal, + TimeSpan? delay = null + ); /// - /// Deletes a job with the specified jobId. + /// Enqueues a job to be executed. /// - /// The Job Unique Identifier. - /// True on a successfull state transition, false otherwise. - Task DeleteAsync(Guid jobId); + /// Job name. + /// Job arguments. + /// Job priority. + /// Job delay (wait duration before first try). + /// Unique identifier of a background job. + Task EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null); } } \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobNameProvider.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobNameProvider.cs new file mode 100644 index 0000000000..918ff89c05 --- /dev/null +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/IBackgroundJobNameProvider.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BackgroundJobs +{ + public interface IBackgroundJobNameProvider + { + string Name { get; } + } +} \ No newline at end of file diff --git a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/JsonBackgroundJobSerializer.cs b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/JsonBackgroundJobSerializer.cs index 361058e5c8..de3aff8aca 100644 --- a/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/JsonBackgroundJobSerializer.cs +++ b/framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/JsonBackgroundJobSerializer.cs @@ -1,9 +1,10 @@ using System; +using Volo.Abp.DependencyInjection; using Volo.Abp.Json; namespace Volo.Abp.BackgroundJobs { - public class JsonBackgroundJobSerializer : IBackgroundJobSerializer + public class JsonBackgroundJobSerializer : IBackgroundJobSerializer, ITransientDependency { private readonly IJsonSerializer _jsonSerializer; diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj index 0a740d6fff..6c238a997c 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj @@ -2,6 +2,7 @@ netcoreapp2.1 + latest Volo.Abp.BackgroundJobs.Tests Volo.Abp.BackgroundJobs.Tests true diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj.DotSettings b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj.DotSettings new file mode 100644 index 0000000000..58ad6c8854 --- /dev/null +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo.Abp.BackgroundJobs.Tests.csproj.DotSettings @@ -0,0 +1,2 @@ + + CSharp71 \ No newline at end of file diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs new file mode 100644 index 0000000000..084265a51f --- /dev/null +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/AbpBackgroundJobsTestModule.cs @@ -0,0 +1,16 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Modularity; + +namespace Volo.Abp.BackgroundJobs +{ + [DependsOn( + typeof(AbpBackgroundJobsModule) + )] + public class AbpBackgroundJobsTestModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddAssemblyOf(); + } + } +} \ No newline at end of file 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 new file mode 100644 index 0000000000..ab9dc5950a --- /dev/null +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs @@ -0,0 +1,42 @@ +using System.Threading.Tasks; +using Shouldly; +using Xunit; + +namespace Volo.Abp.BackgroundJobs +{ + public class BackgroundJobManager_Tests : BackgroundJobsTestBase + { + private readonly IBackgroundJobManager _backgroundJobManager; + private readonly IBackgroundJobStore _backgroundJobStore; + + public BackgroundJobManager_Tests() + { + _backgroundJobManager = GetRequiredService(); + _backgroundJobStore = GetRequiredService(); + } + + [Fact] + public async Task Should_Store_Jobs() + { + var jobId = await _backgroundJobManager.EnqueueAsync(new MyJobArgs("42")); + jobId.ShouldNotBe(default); + (await _backgroundJobStore.FindAsync(jobId)).ShouldNotBeNull(); + } + + [BackgroundJobName("TestJobs.MyJob")] + private class MyJobArgs + { + public string Value { get; set; } + + public MyJobArgs() + { + + } + + public MyJobArgs(string value) + { + Value = value; + } + } + } +} diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobsTestBase.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobsTestBase.cs new file mode 100644 index 0000000000..23ca2d2d2a --- /dev/null +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobsTestBase.cs @@ -0,0 +1,7 @@ +namespace Volo.Abp.BackgroundJobs +{ + public abstract class BackgroundJobsTestBase : AbpIntegratedTest + { + + } +} \ No newline at end of file diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/Class1.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/Class1.cs deleted file mode 100644 index 5a207e53d8..0000000000 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/Class1.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Volo.Abp.BackgroundJobs -{ - public class Class1 - { - - } -}