| | |
| | | /// <summary> |
| | | /// 作业持久化(数据库) |
| | | /// </summary> |
| | | public class DbJobPersistence : IJobPersistence, IDisposable |
| | | public class DbJobPersistence : IJobPersistence |
| | | { |
| | | private readonly IServiceScope _serviceScope; |
| | | private readonly IRepository<ScheduleJobDetail> repScheduleJobDetail; |
| | | private readonly IRepository<ScheduleJobTrigger> repScheduleJobTrigger; |
| | | private readonly IRepository<ScheduleJobTriggerTimeline, LogDbContextLocator> repScheduleJobTriggerTimeline; |
| | | private readonly IServiceScopeFactory serviceScopeFactory; |
| | | |
| | | public DbJobPersistence(IServiceScopeFactory scopeFactory) |
| | | public DbJobPersistence(IServiceScopeFactory serviceScopeFactory) |
| | | { |
| | | _serviceScope = scopeFactory.CreateScope(); |
| | | var services = _serviceScope.ServiceProvider; |
| | | |
| | | repScheduleJobDetail = services.GetService<IRepository<ScheduleJobDetail>>(); |
| | | repScheduleJobTrigger = services.GetService<IRepository<ScheduleJobTrigger>>(); |
| | | repScheduleJobTriggerTimeline = services.GetService<IRepository<ScheduleJobTriggerTimeline, LogDbContextLocator>>(); |
| | | this.serviceScopeFactory = serviceScopeFactory; |
| | | } |
| | | |
| | | /// <summary> |
| | |
| | | |
| | | public Task<SchedulerBuilder> OnLoadingAsync(SchedulerBuilder builder, CancellationToken stoppingToken) |
| | | { |
| | | // 标记从其他地方更新,比如数据库 |
| | | return Task.FromResult(builder); |
| | | } |
| | | |
| | | public async Task OnChangedAsync(PersistenceContext context) |
| | | public Task OnChangedAsync(PersistenceContext context) |
| | | { |
| | | switch (context.Behavior) |
| | | { |
| | | case PersistenceBehavior.Appended: |
| | | var insertEntity = new ScheduleJobDetail(); |
| | | context.JobDetail.Adapt(insertEntity); |
| | | await repScheduleJobDetail.InsertNowAsync(insertEntity); |
| | | break; |
| | | case PersistenceBehavior.Updated: |
| | | var updateEntity = await repScheduleJobDetail.AsQueryable().FirstOrDefaultAsync(it => it.JobId == context.JobId); |
| | | if (updateEntity != null) |
| | | { |
| | | context.JobDetail.Adapt(updateEntity); |
| | | await repScheduleJobDetail.UpdateNowAsync(updateEntity); |
| | | } |
| | | break; |
| | | case PersistenceBehavior.Removed: |
| | | var deleteEntity = await repScheduleJobDetail.AsQueryable().FirstOrDefaultAsync(it => it.JobId == context.JobId); |
| | | if (deleteEntity != null) |
| | | { |
| | | await repScheduleJobDetail.DeleteNowAsync(deleteEntity); |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | public async Task OnTriggerChangedAsync(PersistenceTriggerContext context) |
| | | public Task OnTriggerChangedAsync(PersistenceTriggerContext context) |
| | | { |
| | | switch (context.Behavior) |
| | | { |
| | | case PersistenceBehavior.Appended: |
| | | var insertEntity = new ScheduleJobTrigger(); |
| | | context.Trigger.Adapt(insertEntity); |
| | | await repScheduleJobTrigger.InsertNowAsync(insertEntity); |
| | | break; |
| | | case PersistenceBehavior.Updated: |
| | | var updateEntity = await repScheduleJobTrigger.AsQueryable().FirstOrDefaultAsync(it => it.JobId == context.JobId && it.TriggerId == context.TriggerId); |
| | | if (updateEntity != null) |
| | | { |
| | | context.Trigger.Adapt(updateEntity); |
| | | await repScheduleJobTrigger.UpdateNowAsync(updateEntity); |
| | | } |
| | | break; |
| | | case PersistenceBehavior.Removed: |
| | | var deleteEntity = await repScheduleJobTrigger.AsQueryable().FirstOrDefaultAsync(it => it.JobId == context.JobId && it.TriggerId == context.TriggerId); |
| | | if (deleteEntity != null) |
| | | { |
| | | await repScheduleJobTrigger.DeleteNowAsync(deleteEntity); |
| | | } |
| | | break; |
| | | default: |
| | | break; |
| | | } |
| | | return Task.CompletedTask; |
| | | } |
| | | |
| | | public async Task OnExecutionRecordAsync(PersistenceExecutionRecordContext context) |
| | | { |
| | | using (var scope = serviceScopeFactory.CreateScope()) |
| | | { |
| | | var rep = scope.ServiceProvider.GetRequiredService<IRepository<ScheduleJobTriggerTimeline, LogDbContextLocator>>(); |
| | | var entity = new ScheduleJobTriggerTimeline(); |
| | | context.Timeline.Adapt(entity); |
| | | await repScheduleJobTriggerTimeline.InsertNowAsync(entity); |
| | | await rep.InsertNowAsync(entity); |
| | | } |
| | | |
| | | public void Dispose() |
| | | { |
| | | _serviceScope?.Dispose(); |
| | | } |
| | | } |
| | | } |