using System.Reflection; using Dlhis.ScheduledTask.Attributes; using Kurisu.AspNetCore.Cache; using Kurisu.AspNetCore.DataAccess.Entity; using Kurisu.AspNetCore.DataAccess.SqlSugar.Services; 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(); var recurringJob = this.GetType().GetCustomAttribute()!; var key = recurringJob.UniqueJobKey; var name = recurringJob.Name; Logger = scope.ServiceProvider.GetService>(); DbContext = scope.ServiceProvider.GetService(); try { var redisCache = scope.ServiceProvider.GetService(); await using var handler = await redisCache.LockAsync($"Scheduled:{key}"); if (handler.Acquired) { Logger.LogDebug("[{name}]开始执行...", name); await DbContext.IgnoreAsync(async () => { await RunAsync(scope.ServiceProvider); }); } } catch (Exception ex) { Logger.LogError(ex, "[{name}]执行失败:{message} {stacktrace}", name, ex.Message, ex.StackTrace); } finally { Logger.LogDebug("[{name}]执行结束...", name); } } protected abstract Task RunAsync(IServiceProvider serviceProvider); }