From 79808f35b110fb64d3cbe9f1355fbbee05641108 Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Fri, 8 Jul 2022 16:51:51 +0800 Subject: [PATCH] fix: Tenant needs to be specified to execute job events --- .../Abp/BackgroundTasks/JobEventBase.cs | 16 ++- .../Internal/JobExecutedEvent.cs | 122 +++++++++--------- .../BackgroundTasks/Internal/JobLogEvent.cs | 8 +- 3 files changed, 72 insertions(+), 74 deletions(-) diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobEventBase.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobEventBase.cs index a7174915f..e2a9ba8ea 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobEventBase.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobEventBase.cs @@ -1,7 +1,9 @@ -using Microsoft.Extensions.Logging; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging.Abstractions; using System; using System.Threading.Tasks; +using Volo.Abp.MultiTenancy; namespace LINGYUN.Abp.BackgroundTasks; @@ -17,7 +19,11 @@ public abstract class JobEventBase : IJobEvent { try { - await OnJobAfterExecutedAsync(context); + var currentTenant = context.ServiceProvider.GetRequiredService(); + using (currentTenant.Change(context.EventData.TenantId)) + { + await OnJobAfterExecutedAsync(context); + } } catch (Exception ex) { @@ -29,7 +35,11 @@ public abstract class JobEventBase : IJobEvent { try { - await OnJobBeforeExecutedAsync(context); + var currentTenant = context.ServiceProvider.GetRequiredService(); + using (currentTenant.Change(context.EventData.TenantId)) + { + await OnJobBeforeExecutedAsync(context); + } } catch (Exception ex) { diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobExecutedEvent.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobExecutedEvent.cs index 8460f3d36..0848c66fb 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobExecutedEvent.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobExecutedEvent.cs @@ -2,7 +2,6 @@ using System; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; namespace LINGYUN.Abp.BackgroundTasks.Internal; @@ -11,85 +10,80 @@ public class JobExecutedEvent : JobEventBase, ITransientDepend protected override async Task OnJobAfterExecutedAsync(JobEventContext context) { var store = context.ServiceProvider.GetRequiredService(); - var currentTenant = context.ServiceProvider.GetRequiredService(); - - using (currentTenant.Change(context.EventData.TenantId)) + var job = await store.FindAsync(context.EventData.Key); + if (job != null) { - var job = await store.FindAsync(context.EventData.Key); - if (job != null) + job.TriggerCount += 1; + job.TenantId = context.EventData.TenantId; + job.LastRunTime = context.EventData.RunTime; + job.NextRunTime = context.EventData.NextRunTime; + job.Result = context.EventData.Result ?? "OK"; + job.Status = JobStatus.Running; + + // 一次性任务执行一次后标记为已完成 + if (job.JobType == JobType.Once) { - job.TriggerCount += 1; - job.TenantId = context.EventData.TenantId; - job.LastRunTime = context.EventData.RunTime; - job.NextRunTime = context.EventData.NextRunTime; - job.Result = context.EventData.Result ?? "OK"; - job.Status = JobStatus.Running; + job.Status = JobStatus.Completed; + } - // 一次性任务执行一次后标记为已完成 - if (job.JobType == JobType.Once) - { - job.Status = JobStatus.Completed; - } + // 任务异常后可重试 + if (context.EventData.Exception != null) + { + job.TryCount += 1; + job.IsAbandoned = false; + job.Result = GetExceptionMessage(context.EventData.Exception); - // 任务异常后可重试 - if (context.EventData.Exception != null) + // 周期性任务不用改变重试策略 + if (job.JobType != JobType.Period) { - job.TryCount += 1; - job.IsAbandoned = false; - job.Result = GetExceptionMessage(context.EventData.Exception); - - // 周期性任务不用改变重试策略 - if (job.JobType != JobType.Period) + // 将任务标记为运行中, 会被轮询重新进入队列 + job.Status = JobStatus.FailedRetry; + // 多次异常后需要重新计算优先级 + if (job.TryCount <= (job.MaxTryCount / 2) && + job.TryCount > (job.MaxTryCount / 3)) { - // 将任务标记为运行中, 会被轮询重新进入队列 - job.Status = JobStatus.FailedRetry; - // 多次异常后需要重新计算优先级 - if (job.TryCount <= (job.MaxTryCount / 2) && - job.TryCount > (job.MaxTryCount / 3)) - { - job.Priority = JobPriority.BelowNormal; - } - else if (job.TryCount > (job.MaxTryCount / 1.5)) - { - job.Priority = JobPriority.Low; - } - - // 等待时间调整 - if (job.Interval <= 0) - { - job.Interval = 50; - } - - var retryInterval = job.Interval * 1.5; - job.Interval = Convert.ToInt32(retryInterval); + job.Priority = JobPriority.BelowNormal; + } + else if (job.TryCount > (job.MaxTryCount / 1.5)) + { + job.Priority = JobPriority.Low; } - // 当未设置最大重试次数时不会标记停止 - if (job.MaxTryCount > 0 && job.TryCount >= job.MaxTryCount) + // 等待时间调整 + if (job.Interval <= 0) { - job.Status = JobStatus.Stopped; - job.IsAbandoned = true; - job.NextRunTime = null; - await RemoveJobAsync(context, job); + job.Interval = 50; } + + var retryInterval = job.Interval * 1.5; + job.Interval = Convert.ToInt32(retryInterval); } - else + + // 当未设置最大重试次数时不会标记停止 + if (job.MaxTryCount > 0 && job.TryCount >= job.MaxTryCount) { - // 成功一次重置重试次数 - job.TryCount = 0; + job.Status = JobStatus.Stopped; + job.IsAbandoned = true; + job.NextRunTime = null; + await RemoveJobAsync(context, job); + } + } + else + { + // 成功一次重置重试次数 + job.TryCount = 0; - // 所有任务达到上限则标记已完成 - if (job.MaxCount > 0 && job.TriggerCount >= job.MaxCount) - { - job.Status = JobStatus.Completed; - job.NextRunTime = null; + // 所有任务达到上限则标记已完成 + if (job.MaxCount > 0 && job.TriggerCount >= job.MaxCount) + { + job.Status = JobStatus.Completed; + job.NextRunTime = null; - await RemoveJobAsync(context, job); - } + await RemoveJobAsync(context, job); } - - await store.StoreAsync(job); } + + await store.StoreAsync(job); } } diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobLogEvent.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobLogEvent.cs index 2af90102a..a517c7f9b 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobLogEvent.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobLogEvent.cs @@ -2,7 +2,6 @@ using System.Threading.Tasks; using Volo.Abp.Auditing; using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; namespace LINGYUN.Abp.BackgroundTasks.Internal; @@ -21,11 +20,6 @@ public class JobLogEvent : JobEventBase, ITransientDependency return; } var store = context.ServiceProvider.GetRequiredService(); - var currentTenant = context.ServiceProvider.GetRequiredService(); - - using (currentTenant.Change(context.EventData.TenantId)) - { - await store.StoreLogAsync(context.EventData); - } + await store.StoreLogAsync(context.EventData); } }