diff --git a/apps/vue/src/api/task-management/model/backgroundJobInfoModel.ts b/apps/vue/src/api/task-management/model/backgroundJobInfoModel.ts index 4a2b95ac0..50e1d0f15 100644 --- a/apps/vue/src/api/task-management/model/backgroundJobInfoModel.ts +++ b/apps/vue/src/api/task-management/model/backgroundJobInfoModel.ts @@ -1,6 +1,7 @@ export enum JobStatus { None = -1, Completed = 0, + Queuing = 5, Running = 10, FailedRetry = 15, Paused = 20, diff --git a/apps/vue/src/views/task-management/background-jobs/components/JobModal.vue b/apps/vue/src/views/task-management/background-jobs/components/JobModal.vue index 3a1bbaa0d..646af0d1f 100644 --- a/apps/vue/src/views/task-management/background-jobs/components/JobModal.vue +++ b/apps/vue/src/views/task-management/background-jobs/components/JobModal.vue @@ -54,14 +54,14 @@ { componentProps: { options: [ { label: JobStatusMap[JobStatus.None], value: JobStatus.None }, + { label: JobStatusMap[JobStatus.Queuing], value: JobStatus.Queuing }, { label: JobStatusMap[JobStatus.Running], value: JobStatus.Running }, { label: JobStatusMap[JobStatus.Completed], value: JobStatus.Completed }, + { label: JobStatusMap[JobStatus.FailedRetry], value: JobStatus.FailedRetry }, { label: JobStatusMap[JobStatus.Paused], value: JobStatus.Paused }, { label: JobStatusMap[JobStatus.Stopped], value: JobStatus.Stopped }, ], diff --git a/apps/vue/src/views/task-management/background-jobs/datas/typing.ts b/apps/vue/src/views/task-management/background-jobs/datas/typing.ts index 2da2ba9da..515ed6df4 100644 --- a/apps/vue/src/views/task-management/background-jobs/datas/typing.ts +++ b/apps/vue/src/views/task-management/background-jobs/datas/typing.ts @@ -6,6 +6,7 @@ const { L } = useLocalization('TaskManagement'); export const JobStatusMap = { [JobStatus.None]: L('DisplayName:None'), [JobStatus.Completed]: L('DisplayName:Completed'), + [JobStatus.Queuing]: L('DisplayName:Queuing'), [JobStatus.Running]: L('DisplayName:Running'), [JobStatus.FailedRetry]: L('DisplayName:FailedRetry'), [JobStatus.Paused]: L('DisplayName:Paused'), @@ -14,6 +15,7 @@ export const JobStatusMap = { export const JobStatusColor = { [JobStatus.None]: '', [JobStatus.Completed]: '#339933', + [JobStatus.Queuing]: '#008B8B', [JobStatus.Running]: '#3399CC', [JobStatus.FailedRetry]: '#FF6600', [JobStatus.Paused]: '#CC6633', diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobStatus.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobStatus.cs index 405f7157a..4be36d824 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobStatus.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobStatus.cs @@ -11,6 +11,10 @@ public enum JobStatus /// Completed = 0, /// + /// 队列中 + /// + Queuing = 5, + /// /// 运行中 /// Running = 10, diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobListener.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobListener.cs index 33dd38cf0..540519d19 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobListener.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobListener.cs @@ -40,7 +40,11 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency jobName = !jobType.IsGenericType ? jobType.Name : jobType.GetGenericArguments()[0].Name; } - Logger.LogWarning($"The task {jobName} could not be performed..."); + // 作业被锁定才记录warn事件 + if (context.TryGetCache("JobLocked", out var time) && time != null && int.TryParse(time.ToString(), out var lockTime)) + { + Logger.LogWarning($"The task {jobName} could not be performed, Because it is being scheduled by another job scheduler"); + } return Task.FromResult(-1); } diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobSearchJobAdapter.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobSearchJobAdapter.cs index ff72c7d24..c0ea3720a 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobSearchJobAdapter.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobSearchJobAdapter.cs @@ -30,7 +30,7 @@ public class QuartzJobSearchJobAdapter : IJob jobDefinition.JobType, scope.ServiceProvider, context.MergedJobDataMap.ToImmutableDictionary(), - getCache: (key) => context.Get(key), + getCache: context.Get, setCache: context.Put, cancellationToken: context.CancellationToken); diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzTriggerListener.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzTriggerListener.cs index 177231fe3..e6cd29b9d 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzTriggerListener.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzTriggerListener.cs @@ -49,6 +49,7 @@ public class QuartzTriggerListener : TriggerListenerSupport, ISingletonDependenc // 传递令牌将清除本次锁, 那并无意义 if (!await JobLockProvider.TryLockAsync(NormalizeKey(context, jobId), time)) { + context.Put("JobLocked", time); Logger.LogDebug("The exclusive job is already in use by another scheduler. Ignore this schedule."); return true; } diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/Quartz/IJobExecutionContextExtensions.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/Quartz/IJobExecutionContextExtensions.cs index 8772ba717..cfcdf2be3 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/Quartz/IJobExecutionContextExtensions.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/Quartz/IJobExecutionContextExtensions.cs @@ -42,4 +42,11 @@ public static class IJobExecutionContextExtensions } return false; } + + public static bool TryGetCache(this IJobExecutionContext context, string key, out object value) + { + value = context.Get(key); + + return value != null; + } } diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundWorkerAdapter.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundWorkerAdapter.cs index ef47712e8..b6ddcf4db 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundWorkerAdapter.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundWorkerAdapter.cs @@ -75,7 +75,6 @@ public class BackgroundWorkerAdapter : BackgroundWorkerBase, IBackgroun JobType = JobType.Persistent, Interval = period.Value / 1000, MaxCount = 0, - // TODO: 可配置 MaxTryCount = 10, // 确保不会被轮询入队 Status = JobStatus.None, diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/en.json b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/en.json index 3743ad687..1fc9ec0d9 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/en.json +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/en.json @@ -57,6 +57,7 @@ "DisplayName:None": "None", "DisplayName:Completed": "Completed", "DisplayName:Running": "Running", + "DisplayName:Queuing": "Queuing", "DisplayName:Paused": "Paused", "DisplayName:FailedRetry": "Failed Retry", "DisplayName:Stopped": "Stopped", diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/zh-Hans.json b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/zh-Hans.json index fc39294f0..0e92063df 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/zh-Hans.json +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/zh-Hans.json @@ -57,6 +57,7 @@ "DisplayName:None": "未定义", "DisplayName:Completed": "已完成", "DisplayName:Running": "运行中", + "DisplayName:Queuing": "队列中", "DisplayName:Paused": "已暂停", "DisplayName:FailedRetry": "失败重试", "DisplayName:Stopped": "已停止", diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfo.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfo.cs index 6c7342c94..871720cc0 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfo.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfo.cs @@ -141,7 +141,7 @@ public class BackgroundJobInfo : AuditedAggregateRoot, IMultiTenant NodeName = Check.Length(nodeName, nameof(nodeName), BackgroundJobInfoConsts.MaxNodeNameLength); TenantId = tenantId; - Status = JobStatus.Running; + Status = JobStatus.Queuing; // TODO: 是否需要将参数挪到另一个实体? // 任务参数的建议是尽量最小化, 仅存储关键信息 diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfoWaitingPeriodSpecification.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfoWaitingPeriodSpecification.cs index 2a5ef8ca8..7e2b3572b 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfoWaitingPeriodSpecification.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfoWaitingPeriodSpecification.cs @@ -8,7 +8,7 @@ public class BackgroundJobInfoWaitingPeriodSpecification : BackgroundJobInfoWait { public override Expression> ToExpression() { - var status = new JobStatus[] { JobStatus.Running, JobStatus.FailedRetry }; + var status = new JobStatus[] { JobStatus.Queuing, JobStatus.FailedRetry }; Expression> expression = _ => true; return expression diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfoWaitingSpecification.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfoWaitingSpecification.cs index e5c3695f3..5a88807d5 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfoWaitingSpecification.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobInfoWaitingSpecification.cs @@ -9,7 +9,7 @@ public class BackgroundJobInfoWaitingSpecification : Volo.Abp.Specifications.Spe { public override Expression> ToExpression() { - var status = new JobStatus[] { JobStatus.Running, JobStatus.FailedRetry }; + var status = new JobStatus[] { JobStatus.Queuing, JobStatus.FailedRetry }; Expression> expression = _ => true; diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobManager.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobManager.cs index 6d80257f2..ff0265705 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobManager.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobManager.cs @@ -170,7 +170,7 @@ public class BackgroundJobManager : DomainService public async virtual Task ResumeAsync(BackgroundJobInfo jobInfo) { - jobInfo.SetStatus(JobStatus.Running); + jobInfo.SetStatus(JobStatus.Queuing); jobInfo.IsAbandoned = false; jobInfo.IsEnabled = true; @@ -192,7 +192,7 @@ public class BackgroundJobManager : DomainService { foreach (var jobInfo in jobInfos) { - jobInfo.SetStatus(JobStatus.Running); + jobInfo.SetStatus(JobStatus.Queuing); jobInfo.IsAbandoned = false; jobInfo.IsEnabled = true; }