Auto register background jobs. Make the job name optional.

pull/395/head
Halil ibrahim Kalkan 7 years ago
parent e2e39caea4
commit c6cee2fc66

@ -1,9 +1,12 @@
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
using Volo.Abp.BackgroundWorkers;
using Volo.Abp.Guids;
using Volo.Abp.Json;
using Volo.Abp.Modularity;
using Volo.Abp.Reflection;
using Volo.Abp.Timing;
namespace Volo.Abp.BackgroundJobs
@ -16,6 +19,11 @@ 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>();
@ -34,5 +42,28 @@ 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 = BackgroundJobHelper.GetJobArgsType(jobType);
var jobName = BackgroundJobNameAttribute.GetName(jobArgsType);
options.JobTypes[jobName] = jobType;
}
});
}
}
}

@ -0,0 +1,33 @@
using System;
namespace Volo.Abp.BackgroundJobs
{
internal static class BackgroundJobHelper
{
public static Type GetJobArgsType(Type jobType)
{
foreach (var @interface in jobType.GetInterfaces())
{
if (!@interface.IsGenericType)
{
continue;
}
if (@interface.GetGenericTypeDefinition() != typeof(IBackgroundJob<>))
{
continue;
}
var genericArgs = @interface.GetGenericArguments();
if (genericArgs.Length != 1)
{
continue;
}
return genericArgs[0];
}
throw new AbpException($"Could not find type of the job args. Ensure that given type implements the {typeof(IBackgroundJob<>).AssemblyQualifiedName} interface. Given job type: {jobType.AssemblyQualifiedName}");
}
}
}

@ -31,13 +31,13 @@ namespace Volo.Abp.BackgroundJobs
Store = store;
}
public Task<Guid> EnqueueAsync<TArgs>(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null)
public virtual Task<Guid> EnqueueAsync<TArgs>(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null)
{
var jobName = BackgroundJobNameAttribute.GetNameOrNull<TArgs>();
var jobName = BackgroundJobNameAttribute.GetName<TArgs>();
return EnqueueAsync(jobName, args, priority, delay);
}
public async Task<Guid> EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null)
protected virtual async Task<Guid> EnqueueAsync(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null)
{
var jobInfo = new BackgroundJobInfo
{

@ -21,24 +21,5 @@ namespace Volo.Abp.BackgroundJobs
{
AsyncHelper.RunSync(() => backgroundJobManager.EnqueueAsync<TArgs>(args, priority, delay));
}
/// <summary>
/// Enqueues a job to be executed.
/// </summary>
/// <param name="backgroundJobManager">Background job manager reference</param>
/// <param name="jobName">Job name.</param>
/// <param name="args">Job arguments.</param>
/// <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>
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));
}
}
}

@ -13,18 +13,21 @@ namespace Volo.Abp.BackgroundJobs
Name = Check.NotNullOrWhiteSpace(name, nameof(name));
}
public static string GetNameOrNull<TJobArgs>()
public static string GetName<TJobArgs>()
{
return GetNameOrNull(typeof(TJobArgs));
return GetName(typeof(TJobArgs));
}
public static string GetNameOrNull(Type jobArgsType)
public static string GetName([NotNull] Type jobArgsType)
{
Check.NotNull(jobArgsType, nameof(jobArgsType));
return jobArgsType
.GetCustomAttributes(true)
.OfType<IBackgroundJobNameProvider>()
.FirstOrDefault()
?.Name;
.GetCustomAttributes(true)
.OfType<IBackgroundJobNameProvider>()
.FirstOrDefault()
?.Name
?? jobArgsType.FullName;
}
}
}

@ -21,15 +21,5 @@ namespace Volo.Abp.BackgroundJobs
BackgroundJobPriority priority = BackgroundJobPriority.Normal,
TimeSpan? delay = null
);
/// <summary>
/// Enqueues a job to be executed.
/// </summary>
/// <param name="jobName">Job name.</param>
/// <param name="args">Job arguments.</param>
/// <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(string jobName, object args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null);
}
}

@ -14,6 +14,7 @@
<ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.BackgroundJobs\Volo.Abp.BackgroundJobs.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.7.2" />
</ItemGroup>

@ -1,21 +1,18 @@
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Autofac;
using Volo.Abp.Modularity;
namespace Volo.Abp.BackgroundJobs
{
[DependsOn(
typeof(AbpBackgroundJobsModule)
typeof(AbpBackgroundJobsModule),
typeof(AbpAutofacModule),
typeof(AbpTestBaseModule)
)]
public class AbpBackgroundJobsTestModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
//TODO: Can we automatically register these!
context.Services.Configure<BackgroundJobOptions>(options =>
{
options.JobTypes[MyJobArgs.Name] = typeof(MyJob);
});
context.Services.AddAssemblyOf<AbpBackgroundJobsTestModule>();
}
}

@ -2,6 +2,9 @@
{
public abstract class BackgroundJobsTestBase : AbpIntegratedTest<AbpBackgroundJobsTestModule>
{
protected override void SetAbpApplicationCreationOptions(AbpApplicationCreationOptions options)
{
options.UseAutofac();
}
}
}

@ -1,10 +1,7 @@
namespace Volo.Abp.BackgroundJobs
{
[BackgroundJobName(Name)]
public class MyJobArgs
{
public const string Name = "TestJobs.MyJob";
public string Value { get; set; }
public MyJobArgs()

@ -0,0 +1,7 @@
namespace Volo.Abp.Reflection
{
public class ReflectionHelper_Tests
{
//TODO: ...
}
}
Loading…
Cancel
Save