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 e6de83fec6..7a6f54fbd7 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 @@ -6,6 +6,7 @@ using System.Threading.Tasks; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.DependencyInjection; using Volo.Abp.ExceptionHandling; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.BackgroundJobs; @@ -14,9 +15,12 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc public ILogger Logger { protected get; set; } protected AbpBackgroundJobOptions Options { get; } + + protected ICurrentTenant CurrentTenant { get; } - public BackgroundJobExecuter(IOptions options) + public BackgroundJobExecuter(IOptions options, ICurrentTenant currentTenant) { + CurrentTenant = currentTenant; Options = options.Value; Logger = NullLogger.Instance; @@ -40,14 +44,18 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc try { - if (jobExecuteMethod.Name == nameof(IAsyncBackgroundJob.ExecuteAsync)) + using(CurrentTenant.Change(GetJobArgsTenantId(context.JobArgs))) { - await ((Task)jobExecuteMethod.Invoke(job, new[] { context.JobArgs })); - } - else - { - jobExecuteMethod.Invoke(job, new[] { context.JobArgs }); + if (jobExecuteMethod.Name == nameof(IAsyncBackgroundJob.ExecuteAsync)) + { + await ((Task)jobExecuteMethod.Invoke(job, new[] { context.JobArgs })); + } + else + { + jobExecuteMethod.Invoke(job, new[] { context.JobArgs }); + } } + } 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 + }; + } } 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 5ee99a7ce3..42fe0da502 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,3 +1,4 @@ +using System; using System.Threading.Tasks; using Shouldly; using Xunit; @@ -58,4 +59,36 @@ public class BackgroundJobExecuter_Tests : BackgroundJobsTestBase jobObject.ExecutedValues.ShouldContain("42"); } + + [Fact] + public async Task Should_Change_TenantId_If_EventData_Is_MultiTenant() + { + //Arrange + var tenantId = Guid.NewGuid(); + var jobObject = GetRequiredService(); + var asyncJobObject = GetRequiredService(); + + //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); + } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyAsyncJob.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyAsyncJob.cs index 039d34b3e8..79c5ea887a 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyAsyncJob.cs +++ b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyAsyncJob.cs @@ -2,17 +2,27 @@ using System.Collections.Generic; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; +using Volo.Abp.MultiTenancy; namespace Volo.Abp.BackgroundJobs; public class MyAsyncJob : AsyncBackgroundJob, ISingletonDependency { public List ExecutedValues { get; } = new List(); + + public Guid? TenantId { get; set; } + + private readonly ICurrentTenant _currentTenant; + + public MyAsyncJob(ICurrentTenant currentTenant) + { + _currentTenant = currentTenant; + } public override Task ExecuteAsync(MyAsyncJobArgs args) { ExecutedValues.Add(args.Value); - + TenantId = _currentTenant.Id; return Task.CompletedTask; } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyAsyncJobArgs.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyAsyncJobArgs.cs index 29d19a3bd0..5d47764dde 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyAsyncJobArgs.cs +++ b/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 Guid? TenantId { get; } public MyAsyncJobArgs() { } - public MyAsyncJobArgs(string value) + public MyAsyncJobArgs(string value, Guid? tenantId = null) { Value = value; + TenantId = tenantId; } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyJob.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyJob.cs index 6d8958f1c7..3b01ec05d1 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyJob.cs +++ b/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.MultiTenancy; namespace Volo.Abp.BackgroundJobs; public class MyJob : BackgroundJob, ISingletonDependency { public List ExecutedValues { get; } = new List(); + + public Guid? TenantId { get; set; } + + private readonly ICurrentTenant _currentTenant; + + public MyJob(ICurrentTenant currentTenant) + { + _currentTenant = currentTenant; + } public override void Execute(MyJobArgs args) { ExecutedValues.Add(args.Value); + TenantId = _currentTenant.Id; } } diff --git a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyJobArgs.cs b/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyJobArgs.cs index 87615c6cd2..260d8a9ed4 100644 --- a/framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyJobArgs.cs +++ b/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; } @@ -8,9 +11,13 @@ public class MyJobArgs { } + - public MyJobArgs(string value) + public MyJobArgs(string value, Guid? tenantId = null) { Value = value; + TenantId = tenantId; } + + public Guid? TenantId { get; } }