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

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

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

Loading…
Cancel
Save