Browse Source

Merge pull request #1480 from dongfo/dev_bugfix_TaskMamange

Dev bugfix task mamange
pull/1483/head
yx lin 4 months ago
committed by GitHub
parent
commit
a90e1c68ad
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 24
      aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobCreator.cs
  2. 57
      aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundJobManager.cs

24
aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobCreator.cs

@ -125,11 +125,21 @@ public class QuartzJobCreator : IQuartzJobCreator, ISingletonDependency
triggerBuilder
.WithIdentity(KeyBuilder.CreateTriggerKey(job))
.WithDescription(job.Description)
.StartAt(Clock.Now.AddSeconds(job.Interval))
.EndAt(job.EndTime)
.ForJob(KeyBuilder.CreateJobKey(job))
.WithPriority((int)job.Priority);
// 首次启动时间由 BeginTime 决定,不再使用 Interval 作为"延迟启动"。
// Interval 仅在 Persistent 周期任务中表示"重复间隔"。
if (job.BeginTime > Clock.Now)
{
triggerBuilder.StartAt(job.BeginTime);
}
else
{
triggerBuilder.StartNow();
}
// Quartz约定. 重复间隔不能为0
// fix throw Quartz.SchedulerException: Repeat Interval cannot be zero.
var scheduleBuilder = SimpleScheduleBuilder.Create();
@ -139,14 +149,8 @@ public class QuartzJobCreator : IQuartzJobCreator, ISingletonDependency
{
scheduleBuilder.WithRepeatCount(maxCount);
}
if (job.Interval > 0)
{
scheduleBuilder.WithIntervalInSeconds(job.Interval);
}
else
{
scheduleBuilder.WithIntervalInSeconds(300);
}
scheduleBuilder.WithIntervalInSeconds(job.Interval > 0 ? job.Interval : 300);
triggerBuilder.WithSchedule(scheduleBuilder);

57
aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundJobManager.cs

@ -47,33 +47,36 @@ public class BackgroundJobManager : IBackgroundJobManager
TimeSpan? delay = null)
{
var jobConfiguration = Options.GetJob<TArgs>();
var interval = 0;
if (delay.HasValue)
{
interval = delay.Value.Seconds;
}
var jobId = GuidGenerator.Create();
var jobArgs = new Dictionary<string, object>
{
{ nameof(TArgs), JsonSerializer.Serialize(args) },
{ "ArgsType", jobConfiguration.ArgsType.AssemblyQualifiedName },
{ "JobType", jobConfiguration.JobType.AssemblyQualifiedName },
{ "JobName", jobConfiguration.JobName },
};
var jobInfo = new JobInfo
{
Id = jobId.ToString(),
TenantId = CurrentTenant.Id,
Name = jobId.ToString(),
Group = "BackgroundJobs",
Priority = ConverForm(priority),
Source = JobSource.System,
BeginTime = DateTime.Now,
Args = jobArgs,
Description = "From the framework background jobs",
JobType = JobType.Once,
Interval = interval,
CreationTime = Clock.Now,
// 用 BeginTime 表达延迟启动,避免与 JobInfo.Interval(重复间隔)语义混用。
// 原实现使用 delay.Value.Seconds(仅取秒分量 0-59),
// 会让 TimeSpan.FromMinutes(5) 这类整分钟/整小时的延迟退化为 0,导致任务立即执行。
var now = Clock.Now;
var beginTime = now;
if (delay.HasValue && delay.Value > TimeSpan.Zero)
{
beginTime = now.Add(delay.Value);
}
var jobId = GuidGenerator.Create();
var jobArgs = new Dictionary<string, object>
{
{ nameof(TArgs), JsonSerializer.Serialize(args) },
{ "ArgsType", jobConfiguration.ArgsType.AssemblyQualifiedName },
{ "JobType", jobConfiguration.JobType.AssemblyQualifiedName },
{ "JobName", jobConfiguration.JobName },
};
var jobInfo = new JobInfo
{
Id = jobId.ToString(),
TenantId = CurrentTenant.Id,
Name = jobId.ToString(),
Group = "BackgroundJobs",
Priority = ConverForm(priority),
Source = JobSource.System,
BeginTime = beginTime,
Args = jobArgs,
Description = "From the framework background jobs",
JobType = JobType.Once,
CreationTime = now,
// 确保不会被轮询入队
Status = JobStatus.None,
NodeName = TasksOptions.NodeName,

Loading…
Cancel
Save