From 06a705ce75e2182971402836df5d106a560daf57 Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Thu, 14 Apr 2022 11:01:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(tasks):=20=E5=8F=91=E5=B8=83=E4=BD=9C?= =?UTF-8?q?=E4=B8=9A=E4=BA=8B=E4=BB=B6=E8=AE=A9=E5=8F=82=E4=B8=8E=E8=8A=82?= =?UTF-8?q?=E7=82=B9=E8=87=AA=E8=A1=8C=E7=AE=A1=E7=90=86=E4=BD=9C=E4=B8=9A?= =?UTF-8?q?=E7=8A=B6=E6=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../LINGYUN.MicroService.TaskManagement.sln | 7 + .../FodyWeavers.xml | 3 + .../FodyWeavers.xsd | 30 +++ ...INGYUN.Abp.BackgroundTasks.EventBus.csproj | 19 ++ .../AbpBackgroundTasksEventBusModule.cs | 10 + .../BackgroundTasks/EventBus/JobEventData.cs | 15 ++ .../EventBus/JobPauseEventData.cs | 10 + .../EventBus/JobResumeEventData.cs | 10 + .../EventBus/JobStartEventData.cs | 10 + .../EventBus/JobStopEventData.cs | 10 + .../EventBus/JobSynchronizer.cs | 118 +++++++++++ .../EventBus/JobTriggerEventData.cs | 11 ++ .../Abp/TaskManagement/BackgroundJobEto.cs | 19 ++ .../LINGYUN.Abp.TaskManagement.Domain.csproj | 1 + .../TaskManagement/BackgroundJobManager.cs | 185 +++++++++++++----- .../BackgroundJobSynchronizer.cs | 60 ++++++ .../TaskManagementDomainMapperProfile.cs | 1 + .../TaskManagementDomainModule.cs | 11 ++ .../Abp/WebhooksManagement/WebhookEventEto.cs | 5 +- .../WebhookSendAttemptEto.cs | 2 + .../WebhookSubscriptionEto.cs | 2 + .../TaskManagementHttpApiHostModule.cs | 2 +- 22 files changed, 485 insertions(+), 56 deletions(-) create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/FodyWeavers.xml create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/FodyWeavers.xsd create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN.Abp.BackgroundTasks.EventBus.csproj create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/AbpBackgroundTasksEventBusModule.cs create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobEventData.cs create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobPauseEventData.cs create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobResumeEventData.cs create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobStartEventData.cs create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobStopEventData.cs create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobSynchronizer.cs create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobTriggerEventData.cs create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/BackgroundJobEto.cs create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobSynchronizer.cs diff --git a/aspnet-core/LINGYUN.MicroService.TaskManagement.sln b/aspnet-core/LINGYUN.MicroService.TaskManagement.sln index 3f5395379..639f7c840 100644 --- a/aspnet-core/LINGYUN.MicroService.TaskManagement.sln +++ b/aspnet-core/LINGYUN.MicroService.TaskManagement.sln @@ -44,6 +44,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.TaskManagement. EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.TaskManagement", "modules\task-management\LINGYUN.Abp.BackgroundTasks.TaskManagement\LINGYUN.Abp.BackgroundTasks.TaskManagement.csproj", "{7937785C-0D28-46B3-A7E7-0B592821A1F2}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.BackgroundTasks.EventBus", "modules\task-management\LINGYUN.Abp.BackgroundTasks.EventBus\LINGYUN.Abp.BackgroundTasks.EventBus.csproj", "{D17DEF79-635B-478D-89D7-32EAE616869A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -106,6 +108,10 @@ Global {7937785C-0D28-46B3-A7E7-0B592821A1F2}.Debug|Any CPU.Build.0 = Debug|Any CPU {7937785C-0D28-46B3-A7E7-0B592821A1F2}.Release|Any CPU.ActiveCfg = Release|Any CPU {7937785C-0D28-46B3-A7E7-0B592821A1F2}.Release|Any CPU.Build.0 = Release|Any CPU + {D17DEF79-635B-478D-89D7-32EAE616869A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D17DEF79-635B-478D-89D7-32EAE616869A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D17DEF79-635B-478D-89D7-32EAE616869A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D17DEF79-635B-478D-89D7-32EAE616869A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -125,6 +131,7 @@ Global {8507BBFA-FE56-4426-BBFA-C92906CB8407} = {C38EB7EF-BAE9-4129-862A-71C652B81775} {56C759D1-6FE6-4111-A2DB-CD65DCE82061} = {C38EB7EF-BAE9-4129-862A-71C652B81775} {7937785C-0D28-46B3-A7E7-0B592821A1F2} = {385578CC-C0F1-4377-A7A2-682B8F416234} + {D17DEF79-635B-478D-89D7-32EAE616869A} = {C38EB7EF-BAE9-4129-862A-71C652B81775} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {E1FD1F4C-D344-408B-97CF-B6F1F6D7D293} diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/FodyWeavers.xml b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/FodyWeavers.xml new file mode 100644 index 000000000..1715698cc --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/FodyWeavers.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/FodyWeavers.xsd b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/FodyWeavers.xsd new file mode 100644 index 000000000..11da52550 --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/FodyWeavers.xsd @@ -0,0 +1,30 @@ + + + + + + + + + + + + + + + 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed. + + + + + A comma-separated list of error codes that can be safely ignored in assembly verification. + + + + + 'false' to turn off automatic generation of the XML Schema file. + + + + + \ No newline at end of file diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN.Abp.BackgroundTasks.EventBus.csproj b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN.Abp.BackgroundTasks.EventBus.csproj new file mode 100644 index 000000000..f88036b73 --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN.Abp.BackgroundTasks.EventBus.csproj @@ -0,0 +1,19 @@ + + + + + + + netstandard2.0 + + + + + + + + + + + + diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/AbpBackgroundTasksEventBusModule.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/AbpBackgroundTasksEventBusModule.cs new file mode 100644 index 000000000..9c5322a57 --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/AbpBackgroundTasksEventBusModule.cs @@ -0,0 +1,10 @@ +using Volo.Abp.EventBus; +using Volo.Abp.Modularity; + +namespace LINGYUN.Abp.BackgroundTasks.EventBus; + +[DependsOn(typeof(AbpEventBusModule))] +[DependsOn(typeof(AbpBackgroundTasksModule))] +public class AbpBackgroundTasksEventBusModule : AbpModule +{ +} diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobEventData.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobEventData.cs new file mode 100644 index 000000000..dbb9c4bca --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobEventData.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using Volo.Abp.EventBus; +using Volo.Abp.MultiTenancy; + +namespace LINGYUN.Abp.BackgroundTasks.EventBus; + +[Serializable] +[EventName("abp.background-tasks.job")] +public class JobEventData : IMultiTenant +{ + public Guid? TenantId { get; set; } + public string NodeName { get; set; } + public List IdList { get; set; } = new List(); +} diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobPauseEventData.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobPauseEventData.cs new file mode 100644 index 000000000..3ad5c53ff --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobPauseEventData.cs @@ -0,0 +1,10 @@ +using System; +using Volo.Abp.EventBus; + +namespace LINGYUN.Abp.BackgroundTasks.EventBus; + +[Serializable] +[EventName("abp.background-tasks.job.pause")] +public class JobPauseEventData : JobEventData +{ +} diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobResumeEventData.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobResumeEventData.cs new file mode 100644 index 000000000..7f839c7fe --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobResumeEventData.cs @@ -0,0 +1,10 @@ +using System; +using Volo.Abp.EventBus; + +namespace LINGYUN.Abp.BackgroundTasks.EventBus; + +[Serializable] +[EventName("abp.background-tasks.job.resume")] +public class JobResumeEventData : JobEventData +{ +} diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobStartEventData.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobStartEventData.cs new file mode 100644 index 000000000..092369611 --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobStartEventData.cs @@ -0,0 +1,10 @@ +using System; +using Volo.Abp.EventBus; + +namespace LINGYUN.Abp.BackgroundTasks.EventBus; + +[Serializable] +[EventName("abp.background-tasks.job.start")] +public class JobStartEventData : JobEventData +{ +} diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobStopEventData.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobStopEventData.cs new file mode 100644 index 000000000..7851156a3 --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobStopEventData.cs @@ -0,0 +1,10 @@ +using System; +using Volo.Abp.EventBus; + +namespace LINGYUN.Abp.BackgroundTasks.EventBus; + +[Serializable] +[EventName("abp.background-tasks.job.stop")] +public class JobStopEventData : JobEventData +{ +} diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobSynchronizer.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobSynchronizer.cs new file mode 100644 index 000000000..62df68a31 --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobSynchronizer.cs @@ -0,0 +1,118 @@ +using Microsoft.Extensions.Options; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.EventBus.Distributed; + +namespace LINGYUN.Abp.BackgroundTasks.EventBus; +public class JobSynchronizer : + IDistributedEventHandler, + IDistributedEventHandler, + IDistributedEventHandler, + IDistributedEventHandler, + IDistributedEventHandler, + ITransientDependency +{ + protected IJobStore JobStore { get; } + protected IJobScheduler JobScheduler { get; } + protected AbpBackgroundTasksOptions BackgroundTasksOptions { get; } + + public JobSynchronizer( + IJobStore jobStore, + IJobScheduler jobScheduler, + IOptions options) + { + JobStore = jobStore; + JobScheduler = jobScheduler; + BackgroundTasksOptions = options.Value; + } + + public async virtual Task HandleEventAsync(JobStartEventData eventData) + { + if (string.Equals(eventData.NodeName, BackgroundTasksOptions.NodeName)) + { + foreach (var jobId in eventData.IdList) + { + var jobInfo = await JobStore.FindAsync(jobId); + + if (jobInfo == null) + { + continue; + } + + await JobScheduler.QueueAsync(jobInfo); + } + } + } + + public async virtual Task HandleEventAsync(JobStopEventData eventData) + { + if (string.Equals(eventData.NodeName, BackgroundTasksOptions.NodeName)) + { + foreach (var jobId in eventData.IdList) + { + var jobInfo = await JobStore.FindAsync(jobId); + + if (jobInfo == null) + { + continue; + } + + await JobScheduler.RemoveAsync(jobInfo); + } + } + } + + public async virtual Task HandleEventAsync(JobTriggerEventData eventData) + { + if (string.Equals(eventData.NodeName, BackgroundTasksOptions.NodeName)) + { + foreach (var jobId in eventData.IdList) + { + var jobInfo = await JobStore.FindAsync(jobId); + + if (jobInfo == null) + { + continue; + } + + await JobScheduler.TriggerAsync(jobInfo); + } + } + } + + public async virtual Task HandleEventAsync(JobPauseEventData eventData) + { + if (string.Equals(eventData.NodeName, BackgroundTasksOptions.NodeName)) + { + foreach (var jobId in eventData.IdList) + { + var jobInfo = await JobStore.FindAsync(jobId); + + if (jobInfo == null) + { + continue; + } + + await JobScheduler.PauseAsync(jobInfo); + } + } + } + + public async virtual Task HandleEventAsync(JobResumeEventData eventData) + { + if (string.Equals(eventData.NodeName, BackgroundTasksOptions.NodeName)) + { + foreach (var jobId in eventData.IdList) + { + var jobInfo = await JobStore.FindAsync(jobId); + + if (jobInfo == null) + { + continue; + } + + await JobScheduler.ResumeAsync(jobInfo); + } + } + } +} diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobTriggerEventData.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobTriggerEventData.cs new file mode 100644 index 000000000..38c37ebad --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/LINGYUN/Abp/BackgroundTasks/EventBus/JobTriggerEventData.cs @@ -0,0 +1,11 @@ +using System; +using Volo.Abp.EventBus; + +namespace LINGYUN.Abp.BackgroundTasks.EventBus; + +[Serializable] +[EventName("abp.background-tasks.job.trigger")] +public class JobTriggerEventData : JobEventData +{ + +} diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/BackgroundJobEto.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/BackgroundJobEto.cs new file mode 100644 index 000000000..51322c39d --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/BackgroundJobEto.cs @@ -0,0 +1,19 @@ +using LINGYUN.Abp.BackgroundTasks; +using System; +using Volo.Abp.EventBus; +using Volo.Abp.MultiTenancy; + +namespace LINGYUN.Abp.TaskManagement; + +[Serializable] +[EventName("abp.tkm.background-job")] +public class BackgroundJobEto : IMultiTenant +{ + public string Id { get; set; } + public Guid? TenantId { get; set; } + public bool IsEnabled { get; set; } + public string Name { get; set; } + public string Group { get; set; } + public string NodeName { get; set; } + public JobStatus Status { get; set; } +} diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN.Abp.TaskManagement.Domain.csproj b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN.Abp.TaskManagement.Domain.csproj index 7b045dcbe..2f01d44e0 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN.Abp.TaskManagement.Domain.csproj +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN.Abp.TaskManagement.Domain.csproj @@ -14,6 +14,7 @@ + diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobManager.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobManager.cs index 19ea64aab..a962f119d 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobManager.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobManager.cs @@ -1,27 +1,26 @@ using LINGYUN.Abp.BackgroundTasks; +using LINGYUN.Abp.BackgroundTasks.EventBus; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Volo.Abp.Domain.Services; -using Volo.Abp.ObjectMapping; +using Volo.Abp.EventBus.Distributed; using Volo.Abp.Uow; namespace LINGYUN.Abp.TaskManagement; public class BackgroundJobManager : DomainService { - protected IObjectMapper ObjectMapper { get; } - protected IJobScheduler JobScheduler { get; } + protected IDistributedEventBus EventBus { get; } protected IUnitOfWorkManager UnitOfWorkManager { get; } protected IBackgroundJobInfoRepository BackgroundJobInfoRepository { get; } public BackgroundJobManager( - IObjectMapper objectMapper, - IJobScheduler jobScheduler, + IDistributedEventBus eventBus, IUnitOfWorkManager unitOfWorkManager, IBackgroundJobInfoRepository backgroundJobInfoRepository) { - ObjectMapper = objectMapper; - JobScheduler = jobScheduler; + EventBus = eventBus; UnitOfWorkManager = unitOfWorkManager; BackgroundJobInfoRepository = backgroundJobInfoRepository; } @@ -30,15 +29,6 @@ public class BackgroundJobManager : DomainService { await BackgroundJobInfoRepository.InsertAsync(jobInfo); - if (jobInfo.IsEnabled && jobInfo.JobType == JobType.Period) - { - var job = ObjectMapper.Map(jobInfo); - UnitOfWorkManager.Current.OnCompleted(async () => - { - await JobScheduler.QueueAsync(job); - }); - } - return jobInfo; } @@ -50,8 +40,13 @@ public class BackgroundJobManager : DomainService { UnitOfWorkManager.Current.OnCompleted(async () => { - var job = ObjectMapper.Map(jobInfo); - await JobScheduler.RemoveAsync(job); + await EventBus.PublishAsync( + new JobStopEventData + { + IdList = new List { jobInfo.Id }, + TenantId = jobInfo.TenantId, + NodeName = jobInfo.NodeName + }); }); } @@ -59,7 +54,13 @@ public class BackgroundJobManager : DomainService { UnitOfWorkManager.Current.OnCompleted(async () => { - await QueueAsync(jobInfo); + await EventBus.PublishAsync( + new JobStartEventData + { + IdList = new List { jobInfo.Id }, + TenantId = jobInfo.TenantId, + NodeName = jobInfo.NodeName + }); }); } @@ -69,107 +70,185 @@ public class BackgroundJobManager : DomainService public virtual async Task DeleteAsync(BackgroundJobInfo jobInfo) { await BackgroundJobInfoRepository.DeleteAsync(jobInfo); - - UnitOfWorkManager.Current.OnCompleted(async () => - { - var job = ObjectMapper.Map(jobInfo); - await JobScheduler.RemoveAsync(job); - }); } public virtual async Task BulkDeleteAsync(IEnumerable jobInfos) { - foreach (var jobInfo in jobInfos) - { - await DeleteAsync(jobInfo); - } + await BackgroundJobInfoRepository.DeleteManyAsync(jobInfos); } public virtual async Task QueueAsync(BackgroundJobInfo jobInfo) { - var job = ObjectMapper.Map(jobInfo); - await JobScheduler.QueueAsync(job); + await EventBus.PublishAsync( + new JobStartEventData + { + IdList = new List { jobInfo.Id }, + TenantId = jobInfo.TenantId, + NodeName = jobInfo.NodeName + }); } public virtual async Task BulkQueueAsync(IEnumerable jobInfos) { - var jobs = ObjectMapper.Map, List>(jobInfos); - await JobScheduler.QueuesAsync(jobs); + if (jobInfos.Any()) + { + await EventBus.PublishAsync( + new JobStartEventData + { + IdList = jobInfos.Select(x => x.Id).ToList(), + TenantId = jobInfos.Select(x => x.TenantId).First(), + NodeName = jobInfos.Select(x => x.NodeName).First() + }); + } } public virtual async Task TriggerAsync(BackgroundJobInfo jobInfo) { - var job = ObjectMapper.Map(jobInfo); - job.JobType = JobType.Once; - // 延迟两秒触发 - job.Interval = 2; - - await JobScheduler.TriggerAsync(job); + await EventBus.PublishAsync( + new JobTriggerEventData + { + IdList = new List { jobInfo.Id }, + TenantId = jobInfo.TenantId, + NodeName = jobInfo.NodeName + }); } public virtual async Task BulkTriggerAsync(IEnumerable jobInfos) { - foreach (var jobInfo in jobInfos) + if (jobInfos.Any()) { - await TriggerAsync(jobInfo); + await EventBus.PublishAsync( + new JobTriggerEventData + { + IdList = jobInfos.Select(x => x.Id).ToList(), + TenantId = jobInfos.Select(x => x.TenantId).First(), + NodeName = jobInfos.Select(x => x.NodeName).First() + }); } } public virtual async Task PauseAsync(BackgroundJobInfo jobInfo) { - var job = ObjectMapper.Map(jobInfo); - await JobScheduler.PauseAsync(job); - jobInfo.SetStatus(JobStatus.Paused); jobInfo.SetNextRunTime(null); await BackgroundJobInfoRepository.UpdateAsync(jobInfo); + + UnitOfWorkManager.Current.OnCompleted(async () => + { + await EventBus.PublishAsync( + new JobPauseEventData + { + IdList = new List { jobInfo.Id }, + TenantId = jobInfo.TenantId, + NodeName = jobInfo.NodeName + }); + }); } public virtual async Task BulkPauseAsync(IEnumerable jobInfos) { foreach (var jobInfo in jobInfos) { - await PauseAsync(jobInfo); + jobInfo.SetStatus(JobStatus.Paused); + jobInfo.SetNextRunTime(null); } + + await BackgroundJobInfoRepository.UpdateManyAsync(jobInfos); + + UnitOfWorkManager.Current.OnCompleted(async () => + { + await EventBus.PublishAsync( + new JobPauseEventData + { + IdList = jobInfos.Select(x => x.Id).ToList(), + TenantId = jobInfos.Select(x => x.TenantId).First(), + NodeName = jobInfos.Select(x => x.NodeName).First() + }); + }); } public virtual async Task ResumeAsync(BackgroundJobInfo jobInfo) { - var job = ObjectMapper.Map(jobInfo); - await JobScheduler.ResumeAsync(job); - jobInfo.SetStatus(JobStatus.Running); jobInfo.IsAbandoned = false; jobInfo.IsEnabled = true; await BackgroundJobInfoRepository.UpdateAsync(jobInfo); + + UnitOfWorkManager.Current.OnCompleted(async () => + { + await EventBus.PublishAsync( + new JobResumeEventData + { + IdList = new List { jobInfo.Id }, + TenantId = jobInfo.TenantId, + NodeName = jobInfo.NodeName + }); + }); } public virtual async Task BulkResumeAsync(IEnumerable jobInfos) { foreach (var jobInfo in jobInfos) { - await ResumeAsync(jobInfo); + jobInfo.SetStatus(JobStatus.Running); + jobInfo.IsAbandoned = false; + jobInfo.IsEnabled = true; } + + await BackgroundJobInfoRepository.UpdateManyAsync(jobInfos); + + UnitOfWorkManager.Current.OnCompleted(async () => + { + await EventBus.PublishAsync( + new JobResumeEventData + { + IdList = jobInfos.Select(x => x.Id).ToList(), + TenantId = jobInfos.Select(x => x.TenantId).First(), + NodeName = jobInfos.Select(x => x.NodeName).First() + }); + }); } public virtual async Task StopAsync(BackgroundJobInfo jobInfo) { - var job = ObjectMapper.Map(jobInfo); - await JobScheduler.RemoveAsync(job); - jobInfo.SetStatus(JobStatus.Stopped); jobInfo.SetNextRunTime(null); await BackgroundJobInfoRepository.UpdateAsync(jobInfo); + + UnitOfWorkManager.Current.OnCompleted(async () => + { + await EventBus.PublishAsync( + new JobStopEventData + { + IdList = new List { jobInfo.Id }, + TenantId = jobInfo.TenantId, + NodeName = jobInfo.NodeName + }); + }); } public virtual async Task BulkStopAsync(IEnumerable jobInfos) { foreach (var jobInfo in jobInfos) { - await StopAsync(jobInfo); + jobInfo.SetStatus(JobStatus.Stopped); + jobInfo.SetNextRunTime(null); } + + await BackgroundJobInfoRepository.UpdateManyAsync(jobInfos); + + UnitOfWorkManager.Current.OnCompleted(async () => + { + await EventBus.PublishAsync( + new JobStopEventData + { + IdList = jobInfos.Select(x => x.Id).ToList(), + TenantId = jobInfos.Select(x => x.TenantId).First(), + NodeName = jobInfos.Select(x => x.NodeName).First() + }); + }); } } diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobSynchronizer.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobSynchronizer.cs new file mode 100644 index 000000000..354ad08df --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobSynchronizer.cs @@ -0,0 +1,60 @@ +using LINGYUN.Abp.BackgroundTasks; +using Microsoft.Extensions.Options; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; +using Volo.Abp.Domain.Entities.Events.Distributed; +using Volo.Abp.EventBus.Distributed; + +namespace LINGYUN.Abp.TaskManagement; +public class BackgroundJobSynchronizer : + IDistributedEventHandler>, + IDistributedEventHandler>, + ITransientDependency +{ + protected IJobStore JobStore { get; } + protected IJobScheduler JobScheduler { get; } + protected AbpBackgroundTasksOptions BackgroundTasksOptions { get; } + + public BackgroundJobSynchronizer( + IJobStore jobStore, + IJobScheduler jobScheduler, + IOptions options) + { + JobStore = jobStore; + JobScheduler = jobScheduler; + BackgroundTasksOptions = options.Value; + } + + public async virtual Task HandleEventAsync(EntityDeletedEto eventData) + { + if (string.Equals(eventData.Entity.NodeName, BackgroundTasksOptions.NodeName)) + { + var jobInfo = await JobStore.FindAsync(eventData.Entity.Id); + + if (jobInfo == null) + { + return; + } + + await JobScheduler.RemoveAsync(jobInfo); + } + } + + public async virtual Task HandleEventAsync(EntityCreatedEto eventData) + { + if (string.Equals(eventData.Entity.NodeName, BackgroundTasksOptions.NodeName)) + { + var jobInfo = await JobStore.FindAsync(eventData.Entity.Id); + + if (jobInfo == null) + { + return; + } + + if (eventData.Entity.IsEnabled && jobInfo.JobType == JobType.Period) + { + await JobScheduler.QueueAsync(jobInfo); + } + } + } +} diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/TaskManagementDomainMapperProfile.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/TaskManagementDomainMapperProfile.cs index e5e133e55..bd169d073 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/TaskManagementDomainMapperProfile.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/TaskManagementDomainMapperProfile.cs @@ -8,5 +8,6 @@ public class TaskManagementDomainMapperProfile : Profile public TaskManagementDomainMapperProfile() { CreateMap(); + CreateMap(); } } diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/TaskManagementDomainModule.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/TaskManagementDomainModule.cs index 2d75c167c..92d7bcb9a 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/TaskManagementDomainModule.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/TaskManagementDomainModule.cs @@ -1,7 +1,9 @@ using LINGYUN.Abp.BackgroundTasks; +using LINGYUN.Abp.BackgroundTasks.EventBus; using Microsoft.Extensions.DependencyInjection; using Volo.Abp.AutoMapper; using Volo.Abp.Domain; +using Volo.Abp.Domain.Entities.Events.Distributed; using Volo.Abp.Modularity; namespace LINGYUN.Abp.TaskManagement; @@ -10,6 +12,7 @@ namespace LINGYUN.Abp.TaskManagement; [DependsOn(typeof(AbpAutoMapperModule))] [DependsOn(typeof(AbpDddDomainModule))] [DependsOn(typeof(AbpBackgroundTasksModule))] +[DependsOn(typeof(AbpBackgroundTasksEventBusModule))] public class TaskManagementDomainModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) @@ -20,5 +23,13 @@ public class TaskManagementDomainModule : AbpModule { options.AddProfile(validate: true); }); + + Configure(options => + { + options.EtoMappings.Add(typeof(TaskManagementDomainModule)); + + options.AutoEventSelectors.Add(); + }); + } } \ No newline at end of file diff --git a/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/WebhookEventEto.cs b/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/WebhookEventEto.cs index f6625a851..12fda5cdf 100644 --- a/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/WebhookEventEto.cs +++ b/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/WebhookEventEto.cs @@ -1,10 +1,11 @@ using System; -using Volo.Abp.MultiTenancy; +using Volo.Abp.EventBus; namespace LINGYUN.Abp.WebhooksManagement; [Serializable] -public class WebhookEventEto : IMultiTenant +[EventName("abp.webhooks.event")] +public class WebhookEventEto { public Guid Id { get; set; } public Guid? TenantId { get; set; } diff --git a/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/WebhookSendAttemptEto.cs b/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/WebhookSendAttemptEto.cs index 12f1cb812..02acc5008 100644 --- a/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/WebhookSendAttemptEto.cs +++ b/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/WebhookSendAttemptEto.cs @@ -1,9 +1,11 @@ using System; +using Volo.Abp.EventBus; using Volo.Abp.MultiTenancy; namespace LINGYUN.Abp.WebhooksManagement; [Serializable] +[EventName("abp.webhooks.send-attempt")] public class WebhookSendAttemptEto : IMultiTenant { public Guid Id { get; set; } diff --git a/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/WebhookSubscriptionEto.cs b/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/WebhookSubscriptionEto.cs index 157d6bc04..d8371b652 100644 --- a/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/WebhookSubscriptionEto.cs +++ b/aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/WebhookSubscriptionEto.cs @@ -1,9 +1,11 @@ using System; +using Volo.Abp.EventBus; using Volo.Abp.MultiTenancy; namespace LINGYUN.Abp.WebhooksManagement; [Serializable] +[EventName("abp.webhooks.subscription")] public class WebhookSubscriptionEto : IMultiTenant { public Guid Id { get; set; } diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.cs index ac0cc8b7d..6bf7988f9 100644 --- a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.cs +++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.cs @@ -93,7 +93,7 @@ public partial class TaskManagementHttpApiHostModule : AbpModule ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment()); // 开发取消权限检查 - // context.Services.AddAlwaysAllowAuthorization(); + context.Services.AddAlwaysAllowAuthorization(); } public override void OnApplicationInitialization(ApplicationInitializationContext context)