Browse Source

feat: Add TickerQ background job support and related modules

pull/23802/head
maliming 11 months ago
parent
commit
4a9f3029a1
No known key found for this signature in database GPG Key ID: A646B9CB645ECEA4
  1. 18
      framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs
  2. 2
      framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/TickerQBackgroundJobManager.cs
  3. 20
      framework/src/Volo.Abp.BackgroundWorkers.TickerQ/Volo/Abp/BackgroundWorkers/TickerQ/TickerQBackgroundWorkerManager.cs
  4. 20
      framework/src/Volo.Abp.TickerQ/Microsoft/AspNetCore/Builder/AbpTickerQApplicationBuilderExtensions.cs
  5. 5
      framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs
  6. 15
      framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQModule.cs
  7. 3
      modules/background-jobs/Volo.Abp.BackgroundJobs.slnx
  8. 3
      modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs
  9. 53
      modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/DemoAppTickerQModule.cs
  10. 19
      modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/Program.cs
  11. 24
      modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/Volo.Abp.BackgroundJobs.DemoApp.TickerQ.csproj
  12. 3
      modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/appsettings.json

18
framework/src/Volo.Abp.BackgroundJobs.TickerQ/Volo/Abp/BackgroundJobs/TickerQ/AbpBackgroundJobsTickerQModule.cs

@ -29,18 +29,16 @@ public class AbpBackgroundJobsTickerQModule : AbpModule
requestTypes.TryAdd(jobConfiguration.JobName, (jobConfiguration.ArgsType.FullName, jobConfiguration.ArgsType)!);
}
PreConfigure<AbpTickerQOptions>(options =>
var abpTickerQFunctionProvider = context.ServiceProvider.GetRequiredService<AbpTickerQFunctionProvider>();
foreach (var functionDelegate in tickerFunctionDelegates)
{
foreach (var functionDelegate in tickerFunctionDelegates)
{
options.Functions.TryAdd(functionDelegate.Key, functionDelegate.Value);
}
abpTickerQFunctionProvider.Functions.TryAdd(functionDelegate.Key, functionDelegate.Value);
}
foreach (var requestType in requestTypes)
{
options.RequestTypes.TryAdd(requestType.Key, requestType.Value);
}
});
foreach (var requestType in requestTypes)
{
abpTickerQFunctionProvider.RequestTypes.TryAdd(requestType.Key, requestType.Value);
}
}
private static TickerFunctionDelegate GetTickerFunctionDelegate<TArgs>(Type argsType)

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

@ -34,6 +34,6 @@ public class TickerQBackgroundJobManager : IBackgroundJobManager, ITransientDepe
RetryIntervals = [30, 60, 120], // Retry after 30s, 60s, then 2min
});
return result.Result.Id.ToString();
return !result.IsSucceded ? throw result.Exception : result.Result.Id.ToString();
}
}

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

@ -1,7 +1,6 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using TickerQ.Utilities.Enums;
using Volo.Abp.DependencyInjection;
using Volo.Abp.TickerQ;
@ -12,11 +11,11 @@ namespace Volo.Abp.BackgroundWorkers.TickerQ;
[ExposeServices(typeof(IBackgroundWorkerManager), typeof(TickerQBackgroundWorkerManager))]
public class TickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingletonDependency
{
protected IObjectAccessor<IServiceCollection> ObjectAccessor { get; }
protected AbpTickerQFunctionProvider AbpTickerQFunctionProvider { get; }
public TickerQBackgroundWorkerManager(IObjectAccessor<IServiceCollection> objectAccessor)
public TickerQBackgroundWorkerManager(AbpTickerQFunctionProvider abpTickerQFunctionProvider)
{
ObjectAccessor = objectAccessor;
AbpTickerQFunctionProvider = abpTickerQFunctionProvider;
}
public override async Task AddAsync(IBackgroundWorker worker, CancellationToken cancellationToken = default)
@ -47,15 +46,12 @@ public class TickerQBackgroundWorkerManager : BackgroundWorkerManager, ISingleto
cronExpression = GetCron(period.Value);
}
ObjectAccessor.Value!.PreConfigure<AbpTickerQOptions>(options =>
var name = BackgroundWorkerNameAttribute.GetNameOrNull(worker.GetType()) ?? worker.GetType().FullName;
AbpTickerQFunctionProvider.Functions.TryAdd(name!, (cronExpression!, TickerTaskPriority.Normal, async (tickerQCancellationToken, serviceProvider, tickerFunctionContext) =>
{
var name = BackgroundWorkerNameAttribute.GetNameOrNull(worker.GetType()) ?? worker.GetType().FullName;
options.Functions.TryAdd(name!, (cronExpression!, TickerTaskPriority.Normal, async (tickerQCancellationToken, serviceProvider, tickerFunctionContext) =>
{
var workerInvoker = new TickerQPeriodicBackgroundWorkerInvoker(worker, serviceProvider);
await workerInvoker.DoWorkAsync(tickerFunctionContext, tickerQCancellationToken);
}));
});
var workerInvoker = new TickerQPeriodicBackgroundWorkerInvoker(worker, serviceProvider);
await workerInvoker.DoWorkAsync(tickerFunctionContext, tickerQCancellationToken);
}));
}
await base.AddAsync(worker, cancellationToken);

20
framework/src/Volo.Abp.TickerQ/Microsoft/AspNetCore/Builder/AbpTickerQApplicationBuilderExtensions.cs

@ -0,0 +1,20 @@
using Microsoft.Extensions.DependencyInjection;
using TickerQ.DependencyInjection;
using TickerQ.Utilities;
using TickerQ.Utilities.Enums;
using Volo.Abp.TickerQ;
namespace Microsoft.AspNetCore.Builder;
public static class AbpTickerQApplicationBuilderExtensions
{
public static IApplicationBuilder UseAbpTickerQ(this IApplicationBuilder app, TickerQStartMode qStartMode = TickerQStartMode.Immediate)
{
var abpTickerQFunctionProvider = app.ApplicationServices.GetRequiredService<AbpTickerQFunctionProvider>();
TickerFunctionProvider.RegisterFunctions(abpTickerQFunctionProvider.Functions);
TickerFunctionProvider.RegisterRequestType(abpTickerQFunctionProvider.RequestTypes);
app.UseTickerQ(qStartMode);
return app;
}
}

5
framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQOptions.cs → framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQFunctionProvider.cs

@ -2,16 +2,17 @@ using System;
using System.Collections.Generic;
using TickerQ.Utilities;
using TickerQ.Utilities.Enums;
using Volo.Abp.DependencyInjection;
namespace Volo.Abp.TickerQ;
public class AbpTickerQOptions
public class AbpTickerQFunctionProvider : ISingletonDependency
{
public Dictionary<string, (string, TickerTaskPriority, TickerFunctionDelegate)> Functions { get;}
public Dictionary<string, (string, Type)> RequestTypes { get; }
public AbpTickerQOptions()
public AbpTickerQFunctionProvider()
{
Functions = new Dictionary<string, (string, TickerTaskPriority, TickerFunctionDelegate)>();
RequestTypes = new Dictionary<string, (string, Type)>();

15
framework/src/Volo.Abp.TickerQ/Volo/Abp/TickerQ/AbpTickerQModule.cs

@ -1,7 +1,5 @@
using Microsoft.Extensions.DependencyInjection;
using TickerQ.DependencyInjection;
using TickerQ.Utilities;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Modularity;
namespace Volo.Abp.TickerQ;
@ -15,17 +13,4 @@ public class AbpTickerQModule : AbpModule
options.SetInstanceIdentifier(context.Services.GetApplicationName());
});
}
public override void OnPostApplicationInitialization(ApplicationInitializationContext context)
{
var serviceCollection = context.ServiceProvider.GetRequiredService<IObjectAccessor<IServiceCollection>>();
if (serviceCollection.Value == null)
{
return;
}
var tickerQ = serviceCollection.Value.ExecutePreConfiguredActions<AbpTickerQOptions>();
TickerFunctionProvider.RegisterFunctions(tickerQ.Functions);
TickerFunctionProvider.RegisterRequestType(tickerQ.RequestTypes);
}
}

3
modules/background-jobs/Volo.Abp.BackgroundJobs.slnx

@ -5,6 +5,7 @@
<Project Path="app/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq/Volo.Abp.BackgroundJobs.DemoApp.RabbitMq.csproj" />
<Project Path="app/Volo.Abp.BackgroundJobs.DemoApp.Shared/Volo.Abp.BackgroundJobs.DemoApp.Shared.csproj" />
<Project Path="app/Volo.Abp.BackgroundJobs.DemoApp/Volo.Abp.BackgroundJobs.DemoApp.csproj" />
<Project Path="app\Volo.Abp.BackgroundJobs.DemoApp.TickerQ\Volo.Abp.BackgroundJobs.DemoApp.TickerQ.csproj" />
</Folder>
<Folder Name="/src/">
<Project Path="src/Volo.Abp.BackgroundJobs.Domain.Shared/Volo.Abp.BackgroundJobs.Domain.Shared.csproj" />
@ -19,4 +20,4 @@
<Project Path="test/Volo.Abp.BackgroundJobs.MongoDB.Tests/Volo.Abp.BackgroundJobs.MongoDB.Tests.csproj" />
<Project Path="test/Volo.Abp.BackgroundJobs.TestBase/Volo.Abp.BackgroundJobs.TestBase.csproj" />
</Folder>
</Solution>
</Solution>

3
modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.Shared/DemoAppSharedModule.cs

@ -4,9 +4,6 @@ using Volo.Abp.Modularity;
namespace Volo.Abp.BackgroundJobs.DemoApp.Shared
{
[DependsOn(
typeof(AbpBackgroundJobsModule)
)]
public class DemoAppSharedModule : AbpModule
{
public override void OnPostApplicationInitialization(ApplicationInitializationContext context)

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

@ -0,0 +1,53 @@
using System;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Http;
using Microsoft.Extensions.DependencyInjection;
using TickerQ.Utilities.Interfaces.Managers;
using TickerQ.Utilities.Models.Ticker;
using Volo.Abp.AspNetCore;
using Volo.Abp.Autofac;
using Volo.Abp.BackgroundJobs.DemoApp.Shared;
using Volo.Abp.BackgroundJobs.DemoApp.Shared.Jobs;
using Volo.Abp.BackgroundJobs.TickerQ;
using Volo.Abp.Modularity;
namespace Volo.Abp.BackgroundJobs.DemoApp.TickerQ;
[DependsOn(
typeof(AbpBackgroundJobsTickerQModule),
typeof(DemoAppSharedModule),
typeof(AbpAutofacModule),
typeof(AbpAspNetCoreModule)
)]
public class DemoAppTickerQModule : AbpModule
{
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
{
var app = context.GetApplicationBuilder();
app.UseAbpTickerQ();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGet("/", async httpContext =>
{
await httpContext.Response.WriteAsync("Hello TickerQ!");
});
});
await CancelableBackgroundJobAsync(context.ServiceProvider);
}
private async Task CancelableBackgroundJobAsync(IServiceProvider serviceProvider)
{
var backgroundJobManager = serviceProvider.GetRequiredService<IBackgroundJobManager>();
var jobId = await backgroundJobManager.EnqueueAsync(new LongRunningJobArgs { Value = "test-1" });
await backgroundJobManager.EnqueueAsync(new LongRunningJobArgs { Value = "test-2" });
Thread.Sleep(1000);
var timeTickerManager = serviceProvider.GetRequiredService<ITimeTickerManager<TimeTicker>>();
var result = await timeTickerManager.DeleteAsync(Guid.Parse(jobId));
}
}

19
modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/Program.cs

@ -0,0 +1,19 @@
using System.Threading.Tasks;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
namespace Volo.Abp.BackgroundJobs.DemoApp.TickerQ;
public class Program
{
public static async Task Main(string[] args)
{
var builder = WebApplication.CreateBuilder(args);
builder.Host.AddAppSettingsSecretsJson().UseAutofac();
await builder.AddApplicationAsync<DemoAppTickerQModule>();
var app = builder.Build();
await app.InitializeApplicationAsync();
await app.RunAsync();
}
}

24
modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/Volo.Abp.BackgroundJobs.DemoApp.TickerQ.csproj

@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net10.0</TargetFramework>
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.BackgroundJobs.TickerQ\Volo.Abp.BackgroundJobs.TickerQ.csproj" />
<ProjectReference Include="..\Volo.Abp.BackgroundJobs.DemoApp.Shared\Volo.Abp.BackgroundJobs.DemoApp.Shared.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.AspNetCore\Volo.Abp.AspNetCore.csproj" />
</ItemGroup>
<ItemGroup>
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
<None Update="appsettings.json">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</None>
</ItemGroup>
</Project>

3
modules/background-jobs/app/Volo.Abp.BackgroundJobs.DemoApp.TickerQ/appsettings.json

@ -0,0 +1,3 @@
{
}
Loading…
Cancel
Save