Browse Source

Add configurable retry options for TickerQ background jobs

pull/23802/head
maliming 4 months ago
parent
commit
5e230084a6
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 34
      framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQOptions.cs
  2. 8
      framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs
  3. 24
      framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/TickerQBackgroundJobManager.cs
  4. 2
      framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQBackgroundWorkerManager.cs
  5. 15
      modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs

34
framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQOptions.cs

@ -0,0 +1,34 @@
using System;
using System.Collections.Generic;
namespace Volo.Abp.BackgroundJobs.TickerQ;
public class AbpBackgroundJobsTickerQOptions
{
private readonly Dictionary<Type, AbpBackgroundJobsTimeTickerConfiguration> _jobConfigurations;
public AbpBackgroundJobsTickerQOptions()
{
_jobConfigurations = new Dictionary<Type, AbpBackgroundJobsTimeTickerConfiguration>();
}
public void AddJobConfiguration<TJob>(AbpBackgroundJobsTimeTickerConfiguration configuration)
{
AddJobConfiguration(typeof(TJob), configuration);
}
public void AddJobConfiguration(Type jobType, AbpBackgroundJobsTimeTickerConfiguration configuration)
{
_jobConfigurations[jobType] = configuration;
}
public AbpBackgroundJobsTimeTickerConfiguration? GetJobConfigurationOrNull<TJob>()
{
return GetJobConfigurationOrNull(typeof(TJob));
}
public AbpBackgroundJobsTimeTickerConfiguration? GetJobConfigurationOrNull(Type jobType)
{
return _jobConfigurations.GetValueOrDefault(jobType);
}
}

8
framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTimeTickerConfiguration.cs

@ -0,0 +1,8 @@
namespace Volo.Abp.BackgroundJobs.TickerQ;
public class AbpBackgroundJobsTimeTickerConfiguration
{
public int? Retries { get; set; }
public int[]? RetryIntervals { get; set; }
}

24
framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/TickerQBackgroundJobManager.cs

@ -13,27 +13,37 @@ public class TickerQBackgroundJobManager : IBackgroundJobManager, ITransientDepe
{
protected ITimeTickerManager<TimeTicker> TimeTickerManager { get; }
protected AbpBackgroundJobOptions Options { get; }
protected AbpBackgroundJobsTickerQOptions TickerQOptions { get; }
public TickerQBackgroundJobManager(ITimeTickerManager<TimeTicker> timeTickerManager, IOptions<AbpBackgroundJobOptions> options)
public TickerQBackgroundJobManager(
ITimeTickerManager<TimeTicker> timeTickerManager,
IOptions<AbpBackgroundJobOptions> options,
IOptions<AbpBackgroundJobsTickerQOptions> tickerQOptions)
{
TimeTickerManager = timeTickerManager;
Options = options.Value;
TickerQOptions = tickerQOptions.Value;
}
public virtual async Task<string> EnqueueAsync<TArgs>(TArgs args, BackgroundJobPriority priority = BackgroundJobPriority.Normal, TimeSpan? delay = null)
{
var result = await TimeTickerManager.AddAsync(new TimeTicker
var job = Options.GetJob(typeof(TArgs));
var timeTicker = new TimeTicker
{
Id = Guid.NewGuid(),
Function = Options.GetJob(typeof(TArgs)).JobName,
Function = job.JobName,
ExecutionTime = delay == null ? DateTime.UtcNow : DateTime.UtcNow.Add(delay.Value),
Request = TickerHelper.CreateTickerRequest<TArgs>(args),
};
//TODO: Make these configurable
Retries = 3,
RetryIntervals = [30, 60, 120], // Retry after 30s, 60s, then 2min
});
var config = TickerQOptions.GetJobConfigurationOrNull(job.JobType);
if (config != null)
{
timeTicker.Retries = config.Retries ?? timeTicker.Retries;
timeTicker.RetryIntervals = config.RetryIntervals ?? timeTicker.RetryIntervals;
}
var result = await TimeTickerManager.AddAsync(timeTicker);
return !result.IsSucceded ? throw result.Exception : result.Result.Id.ToString();
}
}

2
framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQBackgroundWorkerManager.cs

@ -47,7 +47,7 @@ public class TickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingleto
}
var name = BackgroundWorkerNameAttribute.GetNameOrNull(worker.GetType()) ?? worker.GetType().FullName;
AbpTickerQFunctionProvider.Functions.TryAdd(name!, (cronExpression!, TickerTaskPriority.Normal, async (tickerQCancellationToken, serviceProvider, tickerFunctionContext) =>
AbpTickerQFunctionProvider.Functions.TryAdd(name!, (cronExpression!, TickerTaskPriority.LongRunning, async (tickerQCancellationToken, serviceProvider, tickerFunctionContext) =>
{
var workerInvoker = new TickerQPeriodicBackgroundWorkerInvoker(worker, serviceProvider);
await workerInvoker.DoWorkAsync(tickerFunctionContext, tickerQCancellationToken);

15
modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs

@ -29,6 +29,21 @@ public class DemoAppTickerQModule : AbpModule
{
options.UpdateMissedJobCheckDelay(TimeSpan.FromSeconds(30));
});
Configure<AbpBackgroundJobsTickerQOptions>(options =>
{
options.AddJobConfiguration<WriteToConsoleGreenJob>(new AbpBackgroundJobsTimeTickerConfiguration()
{
Retries = 3,
RetryIntervals = new[] {30, 60, 120}, // Retry after 30s, 60s, then 2min
});
options.AddJobConfiguration<WriteToConsoleYellowJob>(new AbpBackgroundJobsTimeTickerConfiguration()
{
Retries = 5,
RetryIntervals = new[] {30, 60, 120}, // Retry after 30s, 60s, then 2min
});
});
}
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)

Loading…
Cancel
Save