diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobRunnableContext.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobRunnableContext.cs index 96f366af8..88b7cd81c 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobRunnableContext.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobRunnableContext.cs @@ -9,18 +9,50 @@ public class JobRunnableContext public IServiceProvider ServiceProvider { get; } public IReadOnlyDictionary JobData { get; } public object Result { get; private set; } + private Func GetCacheData { get; set; } + private Action SetCacheData { get; set; } public JobRunnableContext( Type jobType, IServiceProvider serviceProvider, - IReadOnlyDictionary jobData) + IReadOnlyDictionary jobData, + Func getCache = null, + Action setCache = null) { JobType = jobType; ServiceProvider = serviceProvider; JobData = jobData; + + GetCacheData = getCache; + SetCacheData = setCache; } public void SetResult(object result) { Result = result; } + /// + /// 设置缓存 + /// + /// + /// + public void SetCache(object key, object value) + { + SetCacheData?.Invoke(key, value); + } + +#nullable enable + /// + /// 获取缓存数据 + /// + /// + /// + public object? GetCache(object key) + { + if (GetCacheData != null) + { + return GetCacheData(key); + } + return null; + } +#nullable disable } diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobExecutorProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobExecutorProvider.cs index 70d45270e..3c940b628 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobExecutorProvider.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobExecutorProvider.cs @@ -53,11 +53,11 @@ public class QuartzJobExecutorProvider : IQuartzJobExecutorProvider, ISingletonD jobBuilder.UsingJobData(nameof(JobInfo.Name), job.Name); jobBuilder.UsingJobData(nameof(JobInfo.Type), job.Type); jobBuilder.UsingJobData(nameof(JobInfo.Group), job.Group); + // 计算增量需要 + jobBuilder.UsingJobData(nameof(JobInfo.TriggerCount), job.TriggerCount); + jobBuilder.UsingJobData(nameof(JobInfo.MaxCount), job.MaxCount); // 独占任务需要 jobBuilder.UsingJobData(nameof(JobInfo.LockTimeOut), job.LockTimeOut); - // 加入触发次数, 某些场景需要使用增量 - jobBuilder.UsingJobData(nameof(JobInfo.TriggerCount), job.TriggerCount); - jobBuilder.UsingJobData(nameof(JobInfo.TryCount), job.TryCount); // 传递的作业参数 jobBuilder.UsingJobData(new JobDataMap(job.Args)); if (job.TenantId.HasValue) 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 63b644dab..f4603734b 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 @@ -36,7 +36,7 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency var jobType = context.JobDetail.JobType; if (jobType.IsGenericType) { - jobType = jobType.GetGenericTypeDefinition(); + jobType = jobType.GetGenericArguments()[0]; } Logger.LogInformation($"The task {jobType.Name} could not be performed..."); @@ -53,6 +53,20 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency return; } + if (context.Trigger is ISimpleTrigger simpleTrigger) + { + // 增量数据写入临时数据 + if (context.MergedJobDataMap.TryGetValue(nameof(JobInfo.TriggerCount), out var count) && + int.TryParse(count?.ToString(), out var triggerCount)) + { + context.Put(nameof(JobInfo.TriggerCount), triggerCount + simpleTrigger.TimesTriggered); + } + if (context.MergedJobDataMap.TryGetValue(nameof(JobInfo.MaxCount), out var maxCount)) + { + context.Put(nameof(JobInfo.MaxCount), maxCount); + } + } + using var scope = ServiceScopeFactory.CreateScope(); var jobEventData = new JobEventData( jobId, diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobSimpleAdapter.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobSimpleAdapter.cs index eaa6368a3..ada12655c 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobSimpleAdapter.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobSimpleAdapter.cs @@ -24,7 +24,9 @@ public class QuartzJobSimpleAdapter : IJob var jobContext = new JobRunnableContext( typeof(TJobRunnable), scope.ServiceProvider, - context.MergedJobDataMap.ToImmutableDictionary()); + context.MergedJobDataMap.ToImmutableDictionary(), + getCache: (key) => context.Get(key), + setCache: context.Put); await jobExecuter.ExecuteAsync(jobContext); diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/InMemoryJobStore.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/InMemoryJobStore.cs index e59c59b94..604d6ad4d 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/InMemoryJobStore.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/InMemoryJobStore.cs @@ -66,19 +66,6 @@ internal class InMemoryJobStore : IJobStore, ISingletonDependency job.TriggerCount = jobInfo.TriggerCount; job.TryCount = jobInfo.TryCount; job.IsAbandoned = jobInfo.IsAbandoned; - foreach (var arg in jobInfo.Args) - { - if (!job.Args.ContainsKey(arg.Key)) - { - job.Args[arg.Key] = arg.Value; - continue; - } - if (job.Args.TryGetValue(arg.Key, out var value) && - !Equals(value, arg.Value)) - { - job.Args[arg.Key] = arg.Value; - } - } } else { diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobExecutedEvent.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobExecutedEvent.cs index 967450298..91722c18d 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobExecutedEvent.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobExecutedEvent.cs @@ -24,7 +24,6 @@ public class JobExecutedEvent : JobEventBase, ITransientDepend job.NextRunTime = context.EventData.NextRunTime; job.Result = context.EventData.Result ?? "OK"; job.Status = JobStatus.Running; - job.Args[nameof(JobInfo.TriggerCount)] = job.TriggerCount; // 一次性任务执行一次后标记为已完成 if (job.JobType == JobType.Once) @@ -36,7 +35,6 @@ public class JobExecutedEvent : JobEventBase, ITransientDepend if (context.EventData.Exception != null) { job.TryCount += 1; - job.Args[nameof(JobInfo.TryCount)] = job.TryCount; job.IsAbandoned = false; job.Result = GetExceptionMessage(context.EventData.Exception); @@ -70,7 +68,6 @@ public class JobExecutedEvent : JobEventBase, ITransientDepend { // 成功一次重置重试次数 job.TryCount = 0; - job.Args[nameof(JobInfo.TryCount)] = job.TryCount; // 所有任务达到上限则标记已完成 if (job.MaxCount > 0 && job.TriggerCount >= job.MaxCount) diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobStore.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobStore.cs index 932b95d50..403e4f3f4 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobStore.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobStore.cs @@ -66,20 +66,6 @@ public class BackgroundJobStore : IJobStore, ITransientDependency backgroundJobInfo.TryCount = jobInfo.TryCount; backgroundJobInfo.IsAbandoned = jobInfo.IsAbandoned; - foreach (var arg in jobInfo.Args) - { - if (!backgroundJobInfo.Args.ContainsKey(arg.Key)) - { - backgroundJobInfo.Args[arg.Key] = arg.Value; - continue; - } - if (backgroundJobInfo.Args.TryGetValue(arg.Key, out var value) && - !Equals(value, arg.Value)) - { - backgroundJobInfo.Args[arg.Key] = arg.Value; - } - } - await JobInfoRepository.UpdateAsync(backgroundJobInfo); } else