using Furion;
using Furion.DatabaseAccessor;
using Furion.Schedule;
using Mapster;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace ApiTools.Core
{
///
/// 作业持久化(数据库)
///
public class DbJobPersistence : IJobPersistence
{
private readonly IServiceScopeFactory serviceScopeFactory;
public DbJobPersistence(IServiceScopeFactory serviceScopeFactory)
{
this.serviceScopeFactory = serviceScopeFactory;
}
///
/// 作业调度服务启动时
///
///
public Task> PreloadAsync(CancellationToken stoppingToken)
{
return Task.FromResult(App.EffectiveTypes.ScanToBuilders().AsEnumerable());
}
public Task OnLoadingAsync(SchedulerBuilder builder, CancellationToken stoppingToken)
{
return Task.FromResult(builder);
}
public Task OnChangedAsync(PersistenceContext context)
{
return Task.CompletedTask;
}
public Task OnTriggerChangedAsync(PersistenceTriggerContext context)
{
return Task.CompletedTask;
}
public async Task OnExecutionRecordAsync(PersistenceExecutionRecordContext context)
{
using (var scope = serviceScopeFactory.CreateScope())
{
var rep = scope.ServiceProvider.GetRequiredService>();
var entity = new ScheduleJobTriggerTimeline();
context.Timeline.Adapt(entity);
await rep.InsertNowAsync(entity);
}
}
}
}