Browse Source

Implemented hangfire background jobs.

pull/395/head
Halil ibrahim Kalkan 8 years ago
parent
commit
9927b17d83
  1. 33
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AbpBackgroundJobsAbstractionsModule.cs
  2. 38
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobException.cs
  3. 29
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs
  4. 38
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecutionException.cs
  5. 4
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobManagerExtensions.cs
  6. 2
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobOptions.cs
  7. 2
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs
  8. 12
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/JobExecutionContext.cs
  9. 12
      framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.csproj
  10. 6
      framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/AbpBackgroundJobsHangfireModule.cs
  11. 15
      framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/BackgroundJobManager.cs
  12. 23
      framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireBackgroundJobManager.cs
  13. 29
      framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/HangfireJobExecutionAdapter.cs
  14. 33
      framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/AbpBackgroundJobsModule.cs
  15. 7
      framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManager.cs
  16. 34
      framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobWorker.cs
  17. 7
      framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs
  18. 9
      framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobManager_Tests.cs
  19. 4
      modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/DemoAppHangfireModule.cs
  20. 2
      modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj
  21. 5
      modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/appsettings.json
  22. 2
      modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs

33
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<AbpBackgroundJobsAbstractionsModule>();
}
private static void RegisterJobs(IServiceCollection services)
{
var jobTypes = new List<Type>();
services.OnRegistred(context =>
{
if (ReflectionHelper.IsAssignableToGenericType(context.ImplementationType, typeof(IBackgroundJob<>)))
{
jobTypes.Add(context.ImplementationType);
}
});
services.Configure<BackgroundJobOptions>(options =>
{
foreach (var jobType in jobTypes)
{
var jobArgsType = BackgroundJobArgsHelper.GetJobArgsType(jobType);
var jobName = BackgroundJobNameAttribute.GetName(jobArgsType);
options.JobTypes[jobName] = jobType;
}
});
}
}
}

38
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobException.cs

@ -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()
{
}
/// <summary>
/// Creates a new <see cref="BackgroundJobException"/> object.
/// </summary>
public BackgroundJobException(SerializationInfo serializationInfo, StreamingContext context)
: base(serializationInfo, context)
{
}
/// <summary>
/// Creates a new <see cref="BackgroundJobException"/> object.
/// </summary>
/// <param name="message">Exception message</param>
/// <param name="innerException">Inner exception</param>
public BackgroundJobException(string message, Exception innerException)
: base(message, innerException)
{
}
}
}

29
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<BackgroundJobExecuter> Logger { protected get; set; }
protected IServiceProvider ServiceProvider { get; }
protected IBackgroundJobSerializer Serializer { get; }
protected BackgroundJobOptions Options { get; }
public BackgroundJobExecuter(
IServiceProvider serviceProvider,
IBackgroundJobSerializer serializer,
IOptions<BackgroundJobOptions> options)
{
ServiceProvider = serviceProvider;
Serializer = serializer;
Options = options.Value;
Logger = NullLogger<BackgroundJobExecuter>.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<object>.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
};
}

38
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()
{
}
/// <summary>
/// Creates a new <see cref="BackgroundJobExecutionException"/> object.
/// </summary>
public BackgroundJobExecutionException(SerializationInfo serializationInfo, StreamingContext context)
: base(serializationInfo, context)
{
}
/// <summary>
/// Creates a new <see cref="BackgroundJobExecutionException"/> object.
/// </summary>
/// <param name="message">Exception message</param>
/// <param name="innerException">Inner exception</param>
public BackgroundJobExecutionException(string message, Exception innerException)
: base(message, innerException)
{
}
}
}

4
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobManagerExtensions.cs

@ -16,9 +16,9 @@ namespace Volo.Abp.BackgroundJobs
/// <param name="args">Job arguments.</param>
/// <param name="priority">Job priority.</param>
/// <param name="delay">Job delay (wait duration before first try).</param>
public static void Enqueue<TArgs>(this IBackgroundJobManager backgroundJobManager, TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null)
public static string Enqueue<TArgs>(this IBackgroundJobManager backgroundJobManager, TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null)
{
AsyncHelper.RunSync(() => backgroundJobManager.EnqueueAsync<TArgs>(args, priority, delay));
return AsyncHelper.RunSync(() => backgroundJobManager.EnqueueAsync<TArgs>(args, priority, delay));
}
}
}

2
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobOptions.cs

@ -17,7 +17,7 @@ namespace Volo.Abp.BackgroundJobs
JobTypes = new Dictionary<string, Type>();
}
internal Type GetJobType(string jobName)
public Type GetJobType(string jobName)
{
var jobType = JobTypes.GetOrDefault(jobName);

2
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJobManager.cs

@ -16,7 +16,7 @@ namespace Volo.Abp.BackgroundJobs
/// <param name="priority">Job priority.</param>
/// <param name="delay">Job delay (wait duration before first try).</param>
/// <returns>Unique identifier of a background job.</returns>
Task<Guid> EnqueueAsync<TArgs>(
Task<string> EnqueueAsync<TArgs>(
TArgs args,
BackgroundJobPriority priority = BackgroundJobPriority.Normal,
TimeSpan? delay = null

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

12
framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo.Abp.BackgroundJobs.HangFire.csproj

@ -1,11 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<AssemblyName>Volo.Abp.BackgroundJobs.HangFire</AssemblyName>
<PackageId>Volo.Abp.BackgroundJobs.HangFire</PackageId>
<AssetTargetFallback>$(AssetTargetFallback);portable-net45+win8+wp8+wpa81;</AssetTargetFallback>
<GenerateAssemblyConfigurationAttribute>false</GenerateAssemblyConfigurationAttribute>
<GenerateAssemblyCompanyAttribute>false</GenerateAssemblyCompanyAttribute>
<GenerateAssemblyProductAttribute>false</GenerateAssemblyProductAttribute>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Abp.BackgroundJobs.Abstractions\Volo.Abp.BackgroundJobs.Abstractions.csproj" />
<ProjectReference Include="..\Volo.Abp.HangFire\Volo.Abp.HangFire.csproj" />
</ItemGroup>
</Project>

6
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
{

15
framework/src/Volo.Abp.BackgroundJobs.HangFire/Volo/Abp/BackgroundJobs/Hangfire/BackgroundJobManager.cs

@ -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<Guid> EnqueueAsync<TArgs>(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal,
TimeSpan? delay = null)
{
throw new NotImplementedException();
}
}
}

23
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<string> EnqueueAsync<TArgs>(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal,
TimeSpan? delay = null)
{
if (!delay.HasValue)
{
return Task.FromResult(BackgroundJob.Enqueue<HangfireJobExecutionAdapter<TArgs>>(adapter => adapter.Execute(args)));
}
else
{
return Task.FromResult(BackgroundJob.Schedule<HangfireJobExecutionAdapter<TArgs>>(adapter => adapter.Execute(args), delay.Value));
}
}
}
}

29
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<TArgs>
{
protected BackgroundJobOptions Options { get; }
protected IBackgroundJobExecuter JobExecuter { get; }
public HangfireJobExecutionAdapter(IOptions<BackgroundJobOptions> options, IBackgroundJobExecuter jobExecuter)
{
JobExecuter = jobExecuter;
Options = options.Value;
}
public void Execute(TArgs args)
{
var jobName = BackgroundJobNameAttribute.GetName<TArgs>();
var jobType = Options.GetJobType(jobName);
var context = new JobExecutionContext(jobType, args);
JobExecuter.Execute(context);
if (context.Result == JobExecutionResult.Failed)
{
throw new AbpException("Job failed");
}
}
}
}

33
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<AbpBackgroundJobsModule>();
@ -41,28 +33,5 @@ namespace Volo.Abp.BackgroundJobs
);
}
}
private static void RegisterJobs(IServiceCollection services)
{
var jobTypes = new List<Type>();
services.OnRegistred(context =>
{
if (ReflectionHelper.IsAssignableToGenericType(context.ImplementationType, typeof(IBackgroundJob<>)))
{
jobTypes.Add(context.ImplementationType);
}
});
services.Configure<BackgroundJobOptions>(options =>
{
foreach (var jobType in jobTypes)
{
var jobArgsType = BackgroundJobArgsHelper.GetJobArgsType(jobType);
var jobName = BackgroundJobNameAttribute.GetName(jobArgsType);
options.JobTypes[jobName] = jobType;
}
});
}
}
}

7
framework/src/Volo.Abp.BackgroundJobs/Volo/Abp/BackgroundJobs/BackgroundJobManager.cs

@ -31,10 +31,11 @@ namespace Volo.Abp.BackgroundJobs
Store = store;
}
public virtual Task<Guid> EnqueueAsync<TArgs>(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null)
public virtual async Task<string> EnqueueAsync<TArgs>(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null)
{
var jobName = BackgroundJobNameAttribute.GetName<TArgs>();
return EnqueueAsync(jobName, args, priority, delay);
var jobId = await EnqueueAsync(jobName, args, priority, delay);
return jobId.ToString();
}
protected virtual async Task<Guid> EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null)
@ -59,4 +60,4 @@ namespace Volo.Abp.BackgroundJobs
return jobInfo.Id;
}
}
}
}

34
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; }
/// <summary>
/// Initializes a new instance of the <see cref="BackgroundJobManager"/> class.
@ -22,39 +24,45 @@ namespace Volo.Abp.BackgroundJobs
IBackgroundJobStore store,
AbpTimer timer,
IBackgroundJobExecuter jobExecuter,
IOptions<BackgroundJobWorkerOptions> options,
IBackgroundJobSerializer serializer,
IOptions<BackgroundJobOptions> jobOptions,
IOptions<BackgroundJobWorkerOptions> 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;
}

7
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<IBackgroundJobExecuter>();
_jsonSerializer = GetRequiredService<IJsonSerializer>();
}
[Fact]
@ -28,8 +25,8 @@ namespace Volo.Abp.BackgroundJobs
_backgroundJobExecuter.Execute(
new JobExecutionContext(
BackgroundJobNameAttribute.GetName<MyJobArgs>(),
_jsonSerializer.Serialize(new MyJobArgs("42"))
typeof(MyJob),
new MyJobArgs("42")
)
);

9
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();
}
}
}

4
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
{

2
modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.HangFire/Volo.Abp.BackgroundJobs.DemoApp.HangFire.csproj

@ -8,7 +8,7 @@
<ItemGroup>
<PackageReference Include="Hangfire.SqlServer" Version="1.6.19" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.HangFire\Volo.Abp.HangFire.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.BackgroundJobs.HangFire\Volo.Abp.BackgroundJobs.HangFire.csproj" />
<ProjectReference Include="..\Volo.Abp.BackgroundJobs.DemoApp.Shared\Volo.Abp.BackgroundJobs.DemoApp.Shared.csproj" />
</ItemGroup>

5
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"
}
}

2
modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs

@ -14,7 +14,7 @@ namespace Volo.Abp.BackgroundJobs.DemoApp.Shared
context.Services.AddAssemblyOf<DemoAppSharedModule>();
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
public override void OnPostApplicationInitialization(ApplicationInitializationContext context)
{
context.ServiceProvider
.GetRequiredService<SampleJobCreator>()

Loading…
Cancel
Save