Browse Source

Background job cancellation token scope changed as ambient context

pull/15282/head
ahmetfarukulu 4 years ago
parent
commit
69bbb7523f
  1. 4
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/AsyncBackgroundJob.cs
  2. 4
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJob.cs
  3. 19
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/BackgroundJobExecuter.cs
  4. 3
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAsyncBackgroundJob.cs
  5. 3
      framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJob.cs
  6. 2
      framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/BackgroundEmailSendingJob.cs
  7. 8
      framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/BackgroundJobExecuter_Tests.cs
  8. 11
      framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyAsyncJob.cs
  9. 11
      framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundJobs/MyJob.cs

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

@ -7,7 +7,7 @@ namespace Volo.Abp.BackgroundJobs;
public abstract class AsyncBackgroundJob<TArgs> : IAsyncBackgroundJob<TArgs>
{
//TODO: Add UOW, Localization and other useful properties..?
//TODO: Add UOW, Localization, CancellationTokenProvider and other useful properties..?
public ILogger<AsyncBackgroundJob<TArgs>> Logger { get; set; }
@ -16,5 +16,5 @@ public abstract class AsyncBackgroundJob<TArgs> : IAsyncBackgroundJob<TArgs>
Logger = NullLogger<AsyncBackgroundJob<TArgs>>.Instance;
}
public abstract Task ExecuteAsync(TArgs args, CancellationToken cancellationToken = default);
public abstract Task ExecuteAsync(TArgs args);
}

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

@ -6,7 +6,7 @@ namespace Volo.Abp.BackgroundJobs;
public abstract class BackgroundJob<TArgs> : IBackgroundJob<TArgs>
{
//TODO: Add UOW, Localization and other useful properties..?
//TODO: Add UOW, Localization, CancellationTokenProvider and other useful properties..?
public ILogger<BackgroundJob<TArgs>> Logger { get; set; }
@ -15,5 +15,5 @@ public abstract class BackgroundJob<TArgs> : IBackgroundJob<TArgs>
Logger = NullLogger<BackgroundJob<TArgs>>.Instance;
}
public abstract void Execute(TArgs args, CancellationToken cancellationToken = default);
public abstract void Execute(TArgs args);
}

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

@ -7,6 +7,7 @@ using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.DependencyInjection;
using Volo.Abp.ExceptionHandling;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
namespace Volo.Abp.BackgroundJobs;
@ -46,13 +47,19 @@ public class BackgroundJobExecuter : IBackgroundJobExecuter, ITransientDependenc
{
using(CurrentTenant.Change(GetJobArgsTenantId(context.JobArgs)))
{
if (jobExecuteMethod.Name == nameof(IAsyncBackgroundJob<object>.ExecuteAsync))
{
await ((Task)jobExecuteMethod.Invoke(job, new[] { context.JobArgs, context.CancellationToken }));
}
else
var cancellationTokenProvider =
context.ServiceProvider.GetRequiredService<ICancellationTokenProvider>();
using (cancellationTokenProvider.Use(context.CancellationToken))
{
jobExecuteMethod.Invoke(job, new[] { context.JobArgs, context.CancellationToken });
if (jobExecuteMethod.Name == nameof(IAsyncBackgroundJob<object>.ExecuteAsync))
{
await ((Task)jobExecuteMethod.Invoke(job, new[] { context.JobArgs }));
}
else
{
jobExecuteMethod.Invoke(job, new[] { context.JobArgs });
}
}
}

3
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IAsyncBackgroundJob.cs

@ -12,6 +12,5 @@ public interface IAsyncBackgroundJob<in TArgs>
/// Executes the job with the <paramref name="args"/>.
/// </summary>
/// <param name="args">Job arguments.</param>
/// <param name="cancellationToken">A <see cref="T:System.Threading.CancellationToken" /> to observe while waiting for the task to complete.</param>
Task ExecuteAsync(TArgs args, CancellationToken cancellationToken = default);
Task ExecuteAsync(TArgs args);
}

3
framework/src/Volo.Abp.BackgroundJobs.Abstractions/Volo/Abp/BackgroundJobs/IBackgroundJob.cs

@ -11,6 +11,5 @@ public interface IBackgroundJob<in TArgs>
/// Executes the job with the <paramref name="args"/>.
/// </summary>
/// <param name="args">Job arguments.</param>
/// <param name="cancellationToken">A <see cref="T:System.Threading.CancellationToken" /> to observe while waiting for the task to complete.</param>
void Execute(TArgs args, CancellationToken cancellationToken = default);
void Execute(TArgs args);
}

2
framework/src/Volo.Abp.Emailing/Volo/Abp/Emailing/BackgroundEmailSendingJob.cs

@ -15,7 +15,7 @@ public class BackgroundEmailSendingJob : AsyncBackgroundJob<BackgroundEmailSendi
EmailSender = emailSender;
}
public override async Task ExecuteAsync(BackgroundEmailSendingJobArgs args, CancellationToken cancellationToken = default)
public override async Task ExecuteAsync(BackgroundEmailSendingJobArgs args)
{
if (args.From.IsNullOrWhiteSpace())
{

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

@ -117,6 +117,9 @@ public class BackgroundJobExecuter_Tests : BackgroundJobsTestBase
jobObject.Canceled.ShouldBeTrue();
//Arrange
var asyncCts = new CancellationTokenSource();
asyncCts.Cancel();
var asyncJobObject = GetRequiredService<MyAsyncJob>();
asyncJobObject.ExecutedValues.ShouldBeEmpty();
@ -125,11 +128,12 @@ public class BackgroundJobExecuter_Tests : BackgroundJobsTestBase
new JobExecutionContext(
ServiceProvider,
typeof(MyAsyncJob),
new MyAsyncJobArgs("42")
new MyAsyncJobArgs("42"),
asyncCts.Token
)
);
//Assert
jobObject.Canceled.ShouldBeTrue();
asyncJobObject.Canceled.ShouldBeTrue();
}
}

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

@ -4,6 +4,7 @@ using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
namespace Volo.Abp.BackgroundJobs;
@ -14,17 +15,21 @@ public class MyAsyncJob : AsyncBackgroundJob<MyAsyncJobArgs>, ISingletonDependen
public Guid? TenantId { get; set; }
private readonly ICurrentTenant _currentTenant;
private readonly ICancellationTokenProvider _cancellationTokenProvider;
public bool Canceled { get; set; }
public MyAsyncJob(ICurrentTenant currentTenant)
public MyAsyncJob(
ICurrentTenant currentTenant,
ICancellationTokenProvider cancellationTokenProvider)
{
_currentTenant = currentTenant;
_cancellationTokenProvider = cancellationTokenProvider;
}
public override Task ExecuteAsync(MyAsyncJobArgs args, CancellationToken cancellationToken = default)
public override Task ExecuteAsync(MyAsyncJobArgs args)
{
if (cancellationToken.IsCancellationRequested)
if (_cancellationTokenProvider.Token.IsCancellationRequested)
{
Canceled = true;
}

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

@ -3,6 +3,7 @@ using System.Collections.Generic;
using System.Threading;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Threading;
namespace Volo.Abp.BackgroundJobs;
@ -13,17 +14,21 @@ public class MyJob : BackgroundJob<MyJobArgs>, ISingletonDependency
public Guid? TenantId { get; set; }
private readonly ICurrentTenant _currentTenant;
private readonly ICancellationTokenProvider _cancellationTokenProvider;
public bool Canceled { get; set; }
public MyJob(ICurrentTenant currentTenant)
public MyJob(
ICurrentTenant currentTenant,
ICancellationTokenProvider cancellationTokenProvider)
{
_currentTenant = currentTenant;
_cancellationTokenProvider = cancellationTokenProvider;
}
public override void Execute(MyJobArgs args, CancellationToken cancellationToken = default)
public override void Execute(MyJobArgs args)
{
if (cancellationToken.IsCancellationRequested)
if (_cancellationTokenProvider.Token.IsCancellationRequested)
{
Canceled = true;
}

Loading…
Cancel
Save