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)秒后被执行