Browse Source

Merge pull request #14347 from abpframework/liangshiwei/backgroundjob

Switch to the tenant before the Execute Background Job
pull/14366/head
maliming 4 years ago
committed by GitHub
parent
commit
b43920addd
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 31
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs
  2. 33
      framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs
  3. 12
      framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyAsyncJob.cs
  4. 12
      framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyAsyncJobArgs.cs
  5. 14
      framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyJob.cs
  6. 13
      framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyJobArgs.cs

31
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs

@ -6,6 +6,7 @@ using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.ExceptionHandling; using Volo.Abp.ExceptionHandling;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BackgroundJobs; namespace Volo.Abp.BackgroundJobs;
@ -14,9 +15,12 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc
public ILogger<BackgroundJobExecuter> Logger { protected get; set; } public ILogger<BackgroundJobExecuter> Logger { protected get; set; }
protected AbpBackgroundJobOptions Options { get; } protected AbpBackgroundJobOptions Options { get; }
protected ICurrentTenant CurrentTenant { get; }
public BackgroundJobExecuter(IOptions<AbpBackgroundJobOptions> options) public BackgroundJobExecuter(IOptions<AbpBackgroundJobOptions> options, ICurrentTenant currentTenant)
{ {
CurrentTenant = currentTenant;
Options = options.Value; Options = options.Value;
Logger = NullLogger<BackgroundJobExecuter>.Instance; Logger = NullLogger<BackgroundJobExecuter>.Instance;
@ -40,14 +44,18 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc
try try
{ {
if (jobExecuteMethod.Name == nameof(IAsyncBackgroundJob<object>.ExecuteAsync)) using(CurrentTenant.Change(GetJobArgsTenantId(context.JobArgs)))
{ {
await ((Task)jobExecuteMethod.Invoke(job, new[] { context.JobArgs })); if (jobExecuteMethod.Name == nameof(IAsyncBackgroundJob<object>.ExecuteAsync))
} {
else await ((Task)jobExecuteMethod.Invoke(job, new[] { context.JobArgs }));
{ }
jobExecuteMethod.Invoke(job, new[] { context.JobArgs }); else
{
jobExecuteMethod.Invoke(job, new[] { context.JobArgs });
}
} }
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -64,4 +72,13 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc
}; };
} }
} }
protected virtual Guid? GetJobArgsTenantId(object jobArgs)
{
return jobArgs switch
{
IMultiTenant multiTenantJobArgs => multiTenantJobArgs.TenantId,
_ => CurrentTenant.Id
};
}
} }

33
framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs

@ -1,3 +1,4 @@
using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Shouldly; using Shouldly;
using Xunit; using Xunit;
@ -58,4 +59,36 @@ public class BackgroundJobExecuter_Tests : BackgroundJobsTestBase
jobObject.ExecutedValues.ShouldContain("42"); jobObject.ExecutedValues.ShouldContain("42");
} }
[Fact]
public async Task Should_Change_TenantId_If_EventData_Is_MultiTenant()
{
//Arrange
var tenantId = Guid.NewGuid();
var jobObject = GetRequiredService<MyJob>();
var asyncJobObject = GetRequiredService<MyAsyncJob>();
//Act
await _backgroundJobExecuter.ExecuteAsync(
new JobExecutionContext(
ServiceProvider,
typeof(MyJob),
new MyJobArgs("42", tenantId)
)
);
await _backgroundJobExecuter.ExecuteAsync(
new JobExecutionContext(
ServiceProvider,
typeof(MyAsyncJob),
new MyAsyncJobArgs("42", tenantId)
)
);
//Assert
jobObject.TenantId.ShouldBe(tenantId);
asyncJobObject.TenantId.ShouldBe(tenantId);
}
} }

12
framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyAsyncJob.cs

@ -2,17 +2,27 @@
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BackgroundJobs; namespace Volo.Abp.BackgroundJobs;
public class MyAsyncJob : AsyncBackgroundJob<MyAsyncJobArgs>, ISingletonDependency public class MyAsyncJob : AsyncBackgroundJob<MyAsyncJobArgs>, ISingletonDependency
{ {
public List<string> ExecutedValues { get; } = new List<string>(); public List<string> ExecutedValues { get; } = new List<string>();
public Guid? TenantId { get; set; }
private readonly ICurrentTenant _currentTenant;
public MyAsyncJob(ICurrentTenant currentTenant)
{
_currentTenant = currentTenant;
}
public override Task ExecuteAsync(MyAsyncJobArgs args) public override Task ExecuteAsync(MyAsyncJobArgs args)
{ {
ExecutedValues.Add(args.Value); ExecutedValues.Add(args.Value);
TenantId = _currentTenant.Id;
return Task.CompletedTask; return Task.CompletedTask;
} }
} }

12
framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyAsyncJobArgs.cs

@ -1,16 +1,22 @@
namespace Volo.Abp.BackgroundJobs; using System;
using Volo.Abp.MultiTenancy;
public class MyAsyncJobArgs namespace Volo.Abp.BackgroundJobs;
public class MyAsyncJobArgs: IMultiTenant
{ {
public string Value { get; set; } public string Value { get; set; }
public Guid? TenantId { get; }
public MyAsyncJobArgs() public MyAsyncJobArgs()
{ {
} }
public MyAsyncJobArgs(string value) public MyAsyncJobArgs(string value, Guid? tenantId = null)
{ {
Value = value; Value = value;
TenantId = tenantId;
} }
} }

14
framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyJob.cs

@ -1,14 +1,26 @@
using System.Collections.Generic; using System;
using System.Collections.Generic;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace Volo.Abp.BackgroundJobs; namespace Volo.Abp.BackgroundJobs;
public class MyJob : BackgroundJob<MyJobArgs>, ISingletonDependency public class MyJob : BackgroundJob<MyJobArgs>, ISingletonDependency
{ {
public List<string> ExecutedValues { get; } = new List<string>(); public List<string> ExecutedValues { get; } = new List<string>();
public Guid? TenantId { get; set; }
private readonly ICurrentTenant _currentTenant;
public MyJob(ICurrentTenant currentTenant)
{
_currentTenant = currentTenant;
}
public override void Execute(MyJobArgs args) public override void Execute(MyJobArgs args)
{ {
ExecutedValues.Add(args.Value); ExecutedValues.Add(args.Value);
TenantId = _currentTenant.Id;
} }
} }

13
framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyJobArgs.cs

@ -1,6 +1,9 @@
namespace Volo.Abp.BackgroundJobs; using System;
using Volo.Abp.MultiTenancy;
public class MyJobArgs namespace Volo.Abp.BackgroundJobs;
public class MyJobArgs : IMultiTenant
{ {
public string Value { get; set; } public string Value { get; set; }
@ -8,9 +11,13 @@ public class MyJobArgs
{ {
} }
public MyJobArgs(string value) public MyJobArgs(string value, Guid? tenantId = null)
{ {
Value = value; Value = value;
TenantId = tenantId;
} }
public Guid? TenantId { get; }
} }

Loading…
Cancel
Save