Browse Source

fix: Tenant needs to be specified to execute job events

pull/622/head
cKey 4 years ago
parent
commit
79808f35b1
  1. 16
      aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobEventBase.cs
  2. 122
      aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobExecutedEvent.cs
  3. 8
      aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobLogEvent.cs

16
aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobEventBase.cs

@ -1,7 +1,9 @@
using Microsoft.Extensions.Logging; using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Logging.Abstractions;
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.BackgroundTasks; namespace LINGYUN.Abp.BackgroundTasks;
@ -17,7 +19,11 @@ public abstract class JobEventBase<TEvent> : IJobEvent
{ {
try try
{ {
await OnJobAfterExecutedAsync(context); var currentTenant = context.ServiceProvider.GetRequiredService<ICurrentTenant>();
using (currentTenant.Change(context.EventData.TenantId))
{
await OnJobAfterExecutedAsync(context);
}
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -29,7 +35,11 @@ public abstract class JobEventBase<TEvent> : IJobEvent
{ {
try try
{ {
await OnJobBeforeExecutedAsync(context); var currentTenant = context.ServiceProvider.GetRequiredService<ICurrentTenant>();
using (currentTenant.Change(context.EventData.TenantId))
{
await OnJobBeforeExecutedAsync(context);
}
} }
catch (Exception ex) catch (Exception ex)
{ {

122
aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobExecutedEvent.cs

@ -2,7 +2,6 @@
using System; using System;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.BackgroundTasks.Internal; namespace LINGYUN.Abp.BackgroundTasks.Internal;
@ -11,85 +10,80 @@ public class JobExecutedEvent : JobEventBase<JobExecutedEvent>, ITransientDepend
protected override async Task OnJobAfterExecutedAsync(JobEventContext context) protected override async Task OnJobAfterExecutedAsync(JobEventContext context)
{ {
var store = context.ServiceProvider.GetRequiredService<IJobStore>(); var store = context.ServiceProvider.GetRequiredService<IJobStore>();
var currentTenant = context.ServiceProvider.GetRequiredService<ICurrentTenant>(); var job = await store.FindAsync(context.EventData.Key);
if (job != null)
using (currentTenant.Change(context.EventData.TenantId))
{ {
var job = await store.FindAsync(context.EventData.Key); job.TriggerCount += 1;
if (job != null) 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.Status = JobStatus.Completed;
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) if (context.EventData.Exception != null)
{ {
job.Status = JobStatus.Completed; 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.Status = JobStatus.FailedRetry;
job.Result = GetExceptionMessage(context.EventData.Exception); // 多次异常后需要重新计算优先级
if (job.TryCount <= (job.MaxTryCount / 2) &&
// 周期性任务不用改变重试策略 job.TryCount > (job.MaxTryCount / 3))
if (job.JobType != JobType.Period)
{ {
// 将任务标记为运行中, 会被轮询重新进入队列 job.Priority = JobPriority.BelowNormal;
job.Status = JobStatus.FailedRetry; }
// 多次异常后需要重新计算优先级 else if (job.TryCount > (job.MaxTryCount / 1.5))
if (job.TryCount <= (job.MaxTryCount / 2) && {
job.TryCount > (job.MaxTryCount / 3)) job.Priority = JobPriority.Low;
{
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);
} }
// 当未设置最大重试次数时不会标记停止 // 等待时间调整
if (job.MaxTryCount > 0 && job.TryCount >= job.MaxTryCount) if (job.Interval <= 0)
{ {
job.Status = JobStatus.Stopped; job.Interval = 50;
job.IsAbandoned = true;
job.NextRunTime = null;
await RemoveJobAsync(context, job);
} }
var retryInterval = job.Interval * 1.5;
job.Interval = Convert.ToInt32(retryInterval);
} }
else
// 当未设置最大重试次数时不会标记停止
if (job.MaxTryCount > 0 && job.TryCount >= job.MaxTryCount)
{ {
// 成功一次重置重试次数 job.Status = JobStatus.Stopped;
job.TryCount = 0; job.IsAbandoned = true;
job.NextRunTime = null;
await RemoveJobAsync(context, job);
}
}
else
{
// 成功一次重置重试次数
job.TryCount = 0;
// 所有任务达到上限则标记已完成 // 所有任务达到上限则标记已完成
if (job.MaxCount > 0 && job.TriggerCount >= job.MaxCount) if (job.MaxCount > 0 && job.TriggerCount >= job.MaxCount)
{ {
job.Status = JobStatus.Completed; job.Status = JobStatus.Completed;
job.NextRunTime = null; job.NextRunTime = null;
await RemoveJobAsync(context, job); await RemoveJobAsync(context, job);
}
} }
await store.StoreAsync(job);
} }
await store.StoreAsync(job);
} }
} }

8
aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobLogEvent.cs

@ -2,7 +2,6 @@
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Auditing; using Volo.Abp.Auditing;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.BackgroundTasks.Internal; namespace LINGYUN.Abp.BackgroundTasks.Internal;
@ -21,11 +20,6 @@ public class JobLogEvent : JobEventBase<JobLogEvent>, ITransientDependency
return; return;
} }
var store = context.ServiceProvider.GetRequiredService<IJobStore>(); var store = context.ServiceProvider.GetRequiredService<IJobStore>();
var currentTenant = context.ServiceProvider.GetRequiredService<ICurrentTenant>(); await store.StoreLogAsync(context.EventData);
using (currentTenant.Change(context.EventData.TenantId))
{
await store.StoreLogAsync(context.EventData);
}
} }
} }

Loading…
Cancel
Save