Browse Source

Expose dynamic worker scheduler capabilities

pull/25397/head
SALİH ÖZKARA 3 weeks ago
parent
commit
29c38616f2
  1. 2
      framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs
  2. 2
      framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs
  3. 7
      framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs
  4. 18
      framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs
  5. 8
      framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManagerCapabilities.cs
  6. 5
      framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs
  7. 27
      framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManager_Tests.cs

2
framework/src/Volo.Abp.BackgroundWorkers.Hangfire/Volo/Abp/BackgroundWorkers/Hangfire/HangfireDynamicBackgroundWorkerManager.cs

@ -18,6 +18,8 @@ public class HangfireDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMa
protected IServiceProvider ServiceProvider { get; } protected IServiceProvider ServiceProvider { get; }
protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; } protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; }
public ILogger<HangfireDynamicBackgroundWorkerManager> Logger { get; set; } public ILogger<HangfireDynamicBackgroundWorkerManager> Logger { get; set; }
public virtual DynamicBackgroundWorkerManagerCapabilities Capabilities { get; } =
new DynamicBackgroundWorkerManagerCapabilities();
public HangfireDynamicBackgroundWorkerManager( public HangfireDynamicBackgroundWorkerManager(
IServiceProvider serviceProvider, IServiceProvider serviceProvider,

2
framework/src/Volo.Abp.BackgroundWorkers.Quartz/Volo/Abp/BackgroundWorkers/Quartz/QuartzDynamicBackgroundWorkerManager.cs

@ -17,6 +17,8 @@ public class QuartzDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMana
protected IScheduler Scheduler { get; } protected IScheduler Scheduler { get; }
protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; } protected IDynamicBackgroundWorkerHandlerRegistry HandlerRegistry { get; }
public ILogger<QuartzDynamicBackgroundWorkerManager> Logger { get; set; } public ILogger<QuartzDynamicBackgroundWorkerManager> Logger { get; set; }
public virtual DynamicBackgroundWorkerManagerCapabilities Capabilities { get; } =
new DynamicBackgroundWorkerManagerCapabilities();
public QuartzDynamicBackgroundWorkerManager( public QuartzDynamicBackgroundWorkerManager(
IScheduler scheduler, IScheduler scheduler,

7
framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQDynamicBackgroundWorkerManager.cs

@ -7,6 +7,13 @@ namespace Volo.Abp.BackgroundWorkers.TickerQ;
[Dependency(ReplaceServices = true)] [Dependency(ReplaceServices = true)]
public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerManager, ISingletonDependency public class TickerQDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerManager, ISingletonDependency
{ {
public virtual DynamicBackgroundWorkerManagerCapabilities Capabilities { get; } =
new DynamicBackgroundWorkerManagerCapabilities
{
SupportsDynamicRegistration = false,
SupportsCronExpression = false
};
public virtual Task AddAsync( public virtual Task AddAsync(
string workerName, string workerName,
DynamicBackgroundWorkerSchedule schedule, DynamicBackgroundWorkerSchedule schedule,

18
framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DefaultDynamicBackgroundWorkerManager.cs

@ -14,6 +14,12 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan
{ {
protected IServiceProvider ServiceProvider { get; } protected IServiceProvider ServiceProvider { get; }
public ILogger<DefaultDynamicBackgroundWorkerManager> Logger { get; set; } public ILogger<DefaultDynamicBackgroundWorkerManager> Logger { get; set; }
public virtual DynamicBackgroundWorkerManagerCapabilities Capabilities { get; } =
new DynamicBackgroundWorkerManagerCapabilities
{
SupportsDynamicRegistration = true,
SupportsCronExpression = false
};
private readonly ConcurrentDictionary<string, InMemoryDynamicBackgroundWorker> _dynamicWorkers; private readonly ConcurrentDictionary<string, InMemoryDynamicBackgroundWorker> _dynamicWorkers;
private readonly SemaphoreSlim _semaphore; private readonly SemaphoreSlim _semaphore;
@ -39,11 +45,11 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan
schedule.Validate(); schedule.Validate();
if (schedule.Period == null) if (!schedule.CronExpression.IsNullOrWhiteSpace())
{ {
throw new AbpException( throw new AbpException(
$"The default in-memory background worker manager does not support CronExpression without Period for dynamic worker '{workerName}'. " + $"The default in-memory background worker manager does not support CronExpression for dynamic worker '{workerName}'. " +
"Please set Period, or use a scheduler-backed provider (Hangfire, Quartz, TickerQ)."); "Please set Period, or use a scheduler-backed provider (Hangfire or Quartz).");
} }
await _semaphore.WaitAsync(cancellationToken); await _semaphore.WaitAsync(cancellationToken);
@ -102,11 +108,11 @@ public class DefaultDynamicBackgroundWorkerManager : IDynamicBackgroundWorkerMan
schedule.Validate(); schedule.Validate();
if (schedule.Period == null) if (!schedule.CronExpression.IsNullOrWhiteSpace())
{ {
throw new AbpException( throw new AbpException(
$"The default in-memory background worker manager does not support CronExpression without Period for dynamic worker '{workerName}'. " + $"The default in-memory background worker manager does not support CronExpression for dynamic worker '{workerName}'. " +
"Please set Period, or use a scheduler-backed provider (Hangfire, Quartz, TickerQ)."); "Please set Period, or use a scheduler-backed provider (Hangfire or Quartz).");
} }
await _semaphore.WaitAsync(cancellationToken); await _semaphore.WaitAsync(cancellationToken);

8
framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManagerCapabilities.cs

@ -0,0 +1,8 @@
namespace Volo.Abp.BackgroundWorkers;
public class DynamicBackgroundWorkerManagerCapabilities
{
public bool SupportsDynamicRegistration { get; set; } = true;
public bool SupportsCronExpression { get; set; } = true;
}

5
framework/src/Volo.Abp.BackgroundWorkers/Volo/Abp/BackgroundWorkers/IDynamicBackgroundWorkerManager.cs

@ -9,6 +9,11 @@ namespace Volo.Abp.BackgroundWorkers;
/// </summary> /// </summary>
public interface IDynamicBackgroundWorkerManager public interface IDynamicBackgroundWorkerManager
{ {
/// <summary>
/// Describes the scheduling and runtime-registration capabilities of the active dynamic worker provider.
/// </summary>
DynamicBackgroundWorkerManagerCapabilities Capabilities { get; }
/// <summary> /// <summary>
/// Adds a dynamic worker by name, schedule and handler. /// Adds a dynamic worker by name, schedule and handler.
/// If a worker with the same name already exists, it will be replaced. /// If a worker with the same name already exists, it will be replaced.

27
framework/test/Volo.Abp.BackgroundJobs.Tests/Volo/Abp/BackgroundWorkers/DynamicBackgroundWorkerManager_Tests.cs

@ -5,6 +5,7 @@ using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Shouldly; using Shouldly;
using Volo.Abp;
using Volo.Abp.BackgroundJobs; using Volo.Abp.BackgroundJobs;
using Volo.Abp.BackgroundWorkers; using Volo.Abp.BackgroundWorkers;
using Xunit; using Xunit;
@ -20,6 +21,13 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase
_dynamicWorkerManager = GetRequiredService<IDynamicBackgroundWorkerManager>(); _dynamicWorkerManager = GetRequiredService<IDynamicBackgroundWorkerManager>();
} }
[Fact]
public void Should_Report_Provider_Capabilities()
{
_dynamicWorkerManager.Capabilities.SupportsDynamicRegistration.ShouldBeTrue();
_dynamicWorkerManager.Capabilities.SupportsCronExpression.ShouldBeFalse();
}
[Fact] [Fact]
public async Task Should_Register_Dynamic_Worker() public async Task Should_Register_Dynamic_Worker()
{ {
@ -235,6 +243,25 @@ public class DynamicBackgroundWorkerManager_Tests : BackgroundJobsTestBase
}); });
} }
[Fact]
public async Task Should_Throw_When_CronExpression_Is_Set()
{
var workerName = "dynamic-worker-" + Guid.NewGuid();
await Assert.ThrowsAsync<AbpException>(async () =>
{
await _dynamicWorkerManager.AddAsync(
workerName,
new DynamicBackgroundWorkerSchedule
{
Period = 1000,
CronExpression = "0 */5 * * * *"
},
(_, _) => Task.CompletedTask
);
});
}
[Fact] [Fact]
public async Task Should_Continue_Running_After_Handler_Throws_Exception() public async Task Should_Continue_Running_After_Handler_Throws_Exception()
{ {

Loading…
Cancel
Save