72 lines
2.5 KiB
C#
72 lines
2.5 KiB
C#
using Hangfire;
|
||
using Hangfire.PostgreSql;
|
||
using Microsoft.AspNetCore.Builder;
|
||
using Microsoft.Extensions.Configuration;
|
||
using Microsoft.Extensions.DependencyInjection;
|
||
using Microsoft.Extensions.Options;
|
||
using TakeoutSaaS.Module.Scheduler.Abstractions;
|
||
using TakeoutSaaS.Module.Scheduler.HostedServices;
|
||
using TakeoutSaaS.Module.Scheduler.Jobs;
|
||
using TakeoutSaaS.Module.Scheduler.Options;
|
||
using TakeoutSaaS.Module.Scheduler.Services;
|
||
|
||
namespace TakeoutSaaS.Module.Scheduler.Extensions;
|
||
|
||
/// <summary>
|
||
/// 调度模块注册扩展(默认 Hangfire)。
|
||
/// </summary>
|
||
public static class SchedulerServiceCollectionExtensions
|
||
{
|
||
/// <summary>
|
||
/// 注册调度模块。
|
||
/// </summary>
|
||
public static IServiceCollection AddSchedulerModule(this IServiceCollection services, IConfiguration configuration)
|
||
{
|
||
services.AddOptions<SchedulerOptions>()
|
||
.Bind(configuration.GetSection("Scheduler"))
|
||
.ValidateDataAnnotations()
|
||
.ValidateOnStart();
|
||
|
||
services.AddHangfire((serviceProvider, config) =>
|
||
{
|
||
var options = serviceProvider.GetRequiredService<IOptionsMonitor<SchedulerOptions>>().CurrentValue;
|
||
config
|
||
.UseSimpleAssemblyNameTypeSerializer()
|
||
.UseRecommendedSerializerSettings()
|
||
.UsePostgreSqlStorage(storage =>
|
||
{
|
||
storage.UseNpgsqlConnection(options.ConnectionString);
|
||
});
|
||
});
|
||
|
||
services.AddHangfireServer((serviceProvider, options) =>
|
||
{
|
||
var scheduler = serviceProvider.GetRequiredService<IOptionsMonitor<SchedulerOptions>>().CurrentValue;
|
||
options.WorkerCount = scheduler.WorkerCount ?? options.WorkerCount;
|
||
});
|
||
|
||
services.AddSingleton<IRecurringJobRegistrar, RecurringJobRegistrar>();
|
||
services.AddHostedService<RecurringJobHostedService>();
|
||
|
||
services.AddScoped<OrderTimeoutJob>();
|
||
services.AddScoped<CouponExpireJob>();
|
||
services.AddScoped<LogCleanupJob>();
|
||
|
||
return services;
|
||
}
|
||
|
||
/// <summary>
|
||
/// 启用 Hangfire Dashboard(默认关闭,可通过配置开启)。
|
||
/// </summary>
|
||
public static IApplicationBuilder UseSchedulerDashboard(this IApplicationBuilder app, IConfiguration configuration)
|
||
{
|
||
var options = configuration.GetSection("Scheduler").Get<SchedulerOptions>();
|
||
if (options is { DashboardEnabled: true })
|
||
{
|
||
app.UseHangfireDashboard(options.DashboardPath);
|
||
}
|
||
|
||
return app;
|
||
}
|
||
}
|