|
|
|
@ -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<JobExecutedEvent>, ITransientDepend |
|
|
|
protected override async Task OnJobAfterExecutedAsync(JobEventContext context) |
|
|
|
{ |
|
|
|
var store = context.ServiceProvider.GetRequiredService<IJobStore>(); |
|
|
|
var currentTenant = context.ServiceProvider.GetRequiredService<ICurrentTenant>(); |
|
|
|
|
|
|
|
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); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|