55 lines
1.8 KiB
C#
55 lines
1.8 KiB
C#
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<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);
|
|
} |