From 44220eb2cc22b80e62c9c2fd7526bcbc7f9d3caa Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Sat, 8 Jan 2022 23:04:04 +0800 Subject: [PATCH] feat(tasks): if the task fails, recalculate the priority --- .../LINGYUN/Abp/BackgroundTasks/JobInfo.cs | 2 +- .../LINGYUN.Abp.BackgroundTasks.Quartz/README.md | 2 +- .../Abp/BackgroundTasks/IJobRunnableExecuter.cs | 0 .../BackgroundTasks/Internal/JobExecutedEvent.cs | 14 +++++++++++++- .../LINGYUN.Abp.BackgroundTasks/README.md | 2 ++ 5 files changed, 17 insertions(+), 3 deletions(-) rename aspnet-core/modules/task-management/{LINGYUN.Abp.BackgroundTasks.Abstractions => LINGYUN.Abp.BackgroundTasks}/LINGYUN/Abp/BackgroundTasks/IJobRunnableExecuter.cs (100%) diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobInfo.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobInfo.cs index ce724e44e..85246741a 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobInfo.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobInfo.cs @@ -62,7 +62,7 @@ public class JobInfo /// public JobType JobType { get; set; } = JobType.Once; /// - /// Cron表达式,如果是持续任务需要指定 + /// Cron表达式,如果是周期性任务需要指定 /// public string Cron { get; set; } /// diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/README.md b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/README.md index b1dd81e5b..84110905b 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/README.md +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/README.md @@ -1,6 +1,6 @@ # LINGYUN.Abp.BackgroundTasks.Quartz -后台任务(队列)模块的Quartz实现, 使用任务适配器来做到任务的幂等性控制. +后台任务(队列)模块的Quartz实现. 并添加一个监听器用于通知管理者任务状态 ## 配置使用 diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobRunnableExecuter.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/IJobRunnableExecuter.cs similarity index 100% rename from aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobRunnableExecuter.cs rename to aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/IJobRunnableExecuter.cs 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 dc64301b2..4cbbc0fd9 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 @@ -28,9 +28,21 @@ internal class JobExecutedEvent : JobEventBase, ITransientDepe if (context.EventData.Exception != null) { job.TryCount += 1; + // 将任务标记为运行中, 会被轮询重新进入队列 job.Status = JobStatus.Running; job.Result = context.EventData.Exception.Message; - + + // 多次异常后需要重新计算优先级 + 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.TryCount > job.MaxTryCount) { job.Status = JobStatus.Stopped; diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/README.md b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/README.md index a636695dc..b3a9bee08 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/README.md +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/README.md @@ -50,6 +50,8 @@ public class DemoClass Cron = "0/5 * * * * ? ", TryCount = 10, Status = JobStatus.Running, + // 定义此字段处理并发 + LockTimeOut = 120, }); // 将一次性任务添加到队列, 将在10(Interval)秒后被执行