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)