2025-02-07 17:52:38 +08:00
|
|
|
|
using System.Linq.Expressions;
|
|
|
|
|
|
using Hangfire;
|
|
|
|
|
|
using Microsoft.Extensions.Configuration;
|
2024-11-19 18:38:58 +08:00
|
|
|
|
using Microsoft.Extensions.DependencyInjection;
|
2024-11-15 18:17:53 +08:00
|
|
|
|
using Volo.Abp.BackgroundWorkers;
|
|
|
|
|
|
using Volo.Abp.BackgroundWorkers.Hangfire;
|
2025-02-07 17:52:38 +08:00
|
|
|
|
using Volo.Abp.DynamicProxy;
|
2024-11-15 18:17:53 +08:00
|
|
|
|
|
|
|
|
|
|
namespace Yi.Framework.BackgroundWorkers.Hangfire;
|
|
|
|
|
|
|
|
|
|
|
|
[DependsOn(typeof(AbpBackgroundWorkersHangfireModule))]
|
2024-11-19 18:38:58 +08:00
|
|
|
|
public class YiFrameworkBackgroundWorkersHangfireModule : AbpModule
|
2024-11-15 18:17:53 +08:00
|
|
|
|
{
|
|
|
|
|
|
public override void PreConfigureServices(ServiceConfigurationContext context)
|
|
|
|
|
|
{
|
|
|
|
|
|
context.Services.AddConventionalRegistrar(new YiHangfireConventionalRegistrar());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
public override async Task OnApplicationInitializationAsync(ApplicationInitializationContext context)
|
|
|
|
|
|
{
|
|
|
|
|
|
//定时任务自动注入,Abp默认只有在Quartz才实现
|
|
|
|
|
|
var backgroundWorkerManager = context.ServiceProvider.GetRequiredService<IBackgroundWorkerManager>();
|
|
|
|
|
|
var works = context.ServiceProvider.GetServices<IHangfireBackgroundWorker>();
|
2024-11-19 18:38:58 +08:00
|
|
|
|
|
2025-02-07 17:52:38 +08:00
|
|
|
|
var configuration = context.ServiceProvider.GetRequiredService<IConfiguration>();
|
|
|
|
|
|
//【特殊,为了兼容内存模式,由于内存模式任务,不能使用队列】
|
|
|
|
|
|
bool.TryParse(configuration["Redis:IsEnabled"], out var redisEnabled);
|
2024-11-15 18:17:53 +08:00
|
|
|
|
foreach (var work in works)
|
|
|
|
|
|
{
|
2025-02-08 10:37:33 +08:00
|
|
|
|
//如果为空,默认使用服务器本地上海时间
|
|
|
|
|
|
work.TimeZone ??= TimeZoneInfo.FindSystemTimeZoneById("Asia/Shanghai");
|
2025-02-07 17:52:38 +08:00
|
|
|
|
if (redisEnabled)
|
|
|
|
|
|
{
|
|
|
|
|
|
await backgroundWorkerManager.AddAsync(work);
|
|
|
|
|
|
}
|
|
|
|
|
|
else
|
|
|
|
|
|
{
|
|
|
|
|
|
object unProxyWorker = ProxyHelper.UnProxy((object)work);
|
|
|
|
|
|
RecurringJob.AddOrUpdate(work.RecurringJobId,
|
|
|
|
|
|
(Expression<Func<Task>>)(() =>
|
|
|
|
|
|
((IHangfireBackgroundWorker)unProxyWorker).DoWorkAsync(default(CancellationToken))),
|
|
|
|
|
|
work.CronExpression, new RecurringJobOptions()
|
|
|
|
|
|
{
|
|
|
|
|
|
TimeZone = work.TimeZone
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
2024-11-15 18:17:53 +08:00
|
|
|
|
}
|
2024-11-19 18:38:58 +08:00
|
|
|
|
}
|
2024-11-15 18:17:53 +08:00
|
|
|
|
|
2024-11-19 18:38:58 +08:00
|
|
|
|
public override void OnPreApplicationInitialization(ApplicationInitializationContext context)
|
|
|
|
|
|
{
|
|
|
|
|
|
var services = context.ServiceProvider;
|
|
|
|
|
|
GlobalJobFilters.Filters.Add(services.GetRequiredService<UnitOfWorkHangfireFilter>());
|
2024-11-15 18:17:53 +08:00
|
|
|
|
}
|
|
|
|
|
|
}
|