63 lines
2.2 KiB
C#
63 lines
2.2 KiB
C#
using System.Reflection;
|
|
using Dlhis.ScheduledTask.Attributes;
|
|
using Kurisu.AspNetCore.DataAccess.Entity;
|
|
using Kurisu.AspNetCore.DataAccess.SqlSugar.Services;
|
|
using Kurisu.AspNetCore.Utils;
|
|
using Kurisu.Scheduled.Abstractions;
|
|
|
|
namespace Dlhis.ScheduledTask;
|
|
|
|
public abstract class BaseJob : IJob
|
|
{
|
|
private readonly IServiceProvider _serviceProvider;
|
|
|
|
public BaseJob(IServiceProvider serviceProvider)
|
|
{
|
|
_serviceProvider = serviceProvider;
|
|
}
|
|
|
|
protected ILogger Logger { get; set; }
|
|
protected IDbContext DbContext { get; set; }
|
|
|
|
public async Task TodoAsync()
|
|
{
|
|
using (var scope = _serviceProvider.CreateScope())
|
|
{
|
|
Logger = scope.ServiceProvider.GetService<ILogger<BaseJob>>();
|
|
|
|
var recurringJob = this.GetType().GetCustomAttribute<RecurringJobAttribute>()!;
|
|
var key = recurringJob.UniqueJobKey;
|
|
var name = recurringJob!.Name;
|
|
|
|
var redisCache = scope.ServiceProvider.GetService<RedisCache>();
|
|
await using var handler = await redisCache.LockAsync($"scheduled:{key}");
|
|
|
|
DbContext = scope.ServiceProvider.GetService<IDbContext>();
|
|
DbContext.Client.QueryFilter.ClearAndBackup<ITenantId>();
|
|
var sqlSugarOptionsService = scope.ServiceProvider.GetService<ISqlSugarOptionsService>();
|
|
sqlSugarOptionsService.IgnoreTenant = true;
|
|
|
|
try
|
|
{
|
|
if (handler.Acquired)
|
|
{
|
|
Logger.LogInformation("[{name}]开始执行...", name);
|
|
|
|
await RunAsync(scope.ServiceProvider);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Logger.LogError(ex, "[{name}]执行失败:{message} {stacktrace}", name, ex.Message, ex.StackTrace);
|
|
}
|
|
finally
|
|
{
|
|
Logger.LogDebug("[{name}]执行结束...", name);
|
|
DbContext.Client.QueryFilter.Restore();
|
|
sqlSugarOptionsService.IgnoreTenant = false;
|
|
}
|
|
}
|
|
}
|
|
|
|
protected abstract Task RunAsync(IServiceProvider serviceProvider);
|
|
} |