Files
jinko.yikatong/Src/Dlhis.ScheduledTask/BaseJob.cs

55 lines
1.8 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())
{
var recurringJob = this.GetType().GetCustomAttribute<RecurringJobAttribute>()!;
var key = recurringJob.UniqueJobKey;
var name = recurringJob.Name;
Logger = scope.ServiceProvider.GetService<ILogger<BaseJob>>();
DbContext = scope.ServiceProvider.GetService<IDbContext>();
try
{
var redisCache = scope.ServiceProvider.GetService<RedisCache>();
await using var handler = await redisCache.LockAsync($"Scheduled:{key}");
if (handler.Acquired)
{
Logger.LogDebug("[{name}]开始执行...", name);
await DbContext.IgnoreAsync<ITenantId>(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);
}