diff --git a/aspnet-core/LINGYUN.MicroService.TaskManagement.sln b/aspnet-core/LINGYUN.MicroService.TaskManagement.sln
index a89192380..1218fcaf6 100644
--- a/aspnet-core/LINGYUN.MicroService.TaskManagement.sln
+++ b/aspnet-core/LINGYUN.MicroService.TaskManagement.sln
@@ -46,6 +46,14 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.EventBus", "modules\task-management\LINGYUN.Abp.BackgroundTasks.EventBus\LINGYUN.Abp.BackgroundTasks.EventBus.csproj", "{D17DEF79-635B-478D-89D7-32EAE616869A}"
EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.DistributedLocking", "modules\task-management\LINGYUN.Abp.BackgroundTasks.DistributedLocking\LINGYUN.Abp.BackgroundTasks.DistributedLocking.csproj", "{A817B7B7-A225-404A-A301-B42D400DE4B7}"
+EndProject
+Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "LINGYUN.Abp.BackgroundTasks.Activities", "modules\task-management\LINGYUN.Abp.BackgroundTasks.Activities\LINGYUN.Abp.BackgroundTasks.Activities.csproj", "{3D0A1901-36FB-4DA2-9F8D-05308598E98C}"
+EndProject
+Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "extend-jobs", "extend-jobs", "{A9536BD2-2573-44CA-B033-DC16B7E345E5}"
+EndProject
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "LINGYUN.Abp.Notifications.Jobs", "modules\common\LINGYUN.Abp.Notifications.Jobs\LINGYUN.Abp.Notifications.Jobs.csproj", "{17D7ED0F-E789-4637-9B06-57DF693C6E1E}"
+EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@@ -112,6 +120,18 @@ Global
{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
+ {A817B7B7-A225-404A-A301-B42D400DE4B7}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {A817B7B7-A225-404A-A301-B42D400DE4B7}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {A817B7B7-A225-404A-A301-B42D400DE4B7}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {A817B7B7-A225-404A-A301-B42D400DE4B7}.Release|Any CPU.Build.0 = Release|Any CPU
+ {3D0A1901-36FB-4DA2-9F8D-05308598E98C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {3D0A1901-36FB-4DA2-9F8D-05308598E98C}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {3D0A1901-36FB-4DA2-9F8D-05308598E98C}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {3D0A1901-36FB-4DA2-9F8D-05308598E98C}.Release|Any CPU.Build.0 = Release|Any CPU
+ {17D7ED0F-E789-4637-9B06-57DF693C6E1E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {17D7ED0F-E789-4637-9B06-57DF693C6E1E}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {17D7ED0F-E789-4637-9B06-57DF693C6E1E}.Release|Any CPU.ActiveCfg = Release|Any CPU
+ {17D7ED0F-E789-4637-9B06-57DF693C6E1E}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@@ -132,6 +152,9 @@ Global
{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}
+ {A817B7B7-A225-404A-A301-B42D400DE4B7} = {C38EB7EF-BAE9-4129-862A-71C652B81775}
+ {3D0A1901-36FB-4DA2-9F8D-05308598E98C} = {C38EB7EF-BAE9-4129-862A-71C652B81775}
+ {17D7ED0F-E789-4637-9B06-57DF693C6E1E} = {A9536BD2-2573-44CA-B033-DC16B7E345E5}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {E1FD1F4C-D344-408B-97CF-B6F1F6D7D293}
diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/FodyWeavers.xml b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/FodyWeavers.xml
new file mode 100644
index 000000000..1715698cc
--- /dev/null
+++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/FodyWeavers.xsd b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/FodyWeavers.xsd
new file mode 100644
index 000000000..11da52550
--- /dev/null
+++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/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/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN.Abp.Notifications.Jobs.csproj b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN.Abp.Notifications.Jobs.csproj
new file mode 100644
index 000000000..d035b561a
--- /dev/null
+++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN.Abp.Notifications.Jobs.csproj
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+ netstandard2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/AbpNotificationsJobsModule.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/AbpNotificationsJobsModule.cs
new file mode 100644
index 000000000..c0e7850da
--- /dev/null
+++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/AbpNotificationsJobsModule.cs
@@ -0,0 +1,27 @@
+using LINGYUN.Abp.BackgroundTasks;
+using LINGYUN.Abp.Notifications.Localization;
+using Volo.Abp.Localization;
+using Volo.Abp.Modularity;
+using Volo.Abp.VirtualFileSystem;
+
+namespace LINGYUN.Abp.Notifications.Jobs;
+
+[DependsOn(typeof(AbpNotificationModule))]
+[DependsOn(typeof(AbpBackgroundTasksAbstractionsModule))]
+public class AbpNotificationsJobsModule : AbpModule
+{
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ Configure(options =>
+ {
+ options.FileSets.AddEmbedded();
+ });
+
+ Configure(options =>
+ {
+ options.Resources
+ .Get()
+ .AddVirtualJson("/LINGYUN/Abp/Notifications/Jobs/Localization/Resources");
+ });
+ }
+}
diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/LocalizableStatic.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/LocalizableStatic.cs
new file mode 100644
index 000000000..8e10ab532
--- /dev/null
+++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/LocalizableStatic.cs
@@ -0,0 +1,12 @@
+using LINGYUN.Abp.Notifications.Localization;
+using Volo.Abp.Localization;
+
+namespace LINGYUN.Abp.Notifications.Jobs;
+
+internal static class LocalizableStatic
+{
+ public static ILocalizableString Create(string name)
+ {
+ return LocalizableString.Create(name);
+ }
+}
diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/Localization/Resources/en.json b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/Localization/Resources/en.json
new file mode 100644
index 000000000..c9afc104d
--- /dev/null
+++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/Localization/Resources/en.json
@@ -0,0 +1,7 @@
+{
+ "culture": "en",
+ "texts": {
+ "NotificationCleanupJob": "Notification Cleanup Job",
+ "Notification:BatchCount": "Batch Count"
+ }
+}
\ No newline at end of file
diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/Localization/Resources/zh-Hans.json b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/Localization/Resources/zh-Hans.json
new file mode 100644
index 000000000..17f2ffd1a
--- /dev/null
+++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/Localization/Resources/zh-Hans.json
@@ -0,0 +1,7 @@
+{
+ "culture": "zh-Hans",
+ "texts": {
+ "NotificationCleanupJob": "清理过期通知作业",
+ "Notification:BatchCount": "批次数量"
+ }
+}
\ No newline at end of file
diff --git a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/BackgroundJobs/NotificationCleanupJob.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/NotificationCleanupJob.cs
similarity index 53%
rename from aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/BackgroundJobs/NotificationCleanupJob.cs
rename to aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/NotificationCleanupJob.cs
index dd1fd2b6e..03b3ae1c8 100644
--- a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/BackgroundJobs/NotificationCleanupJob.cs
+++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/NotificationCleanupJob.cs
@@ -1,17 +1,26 @@
using LINGYUN.Abp.BackgroundTasks;
-using LINGYUN.Abp.Notifications;
+using System.Collections.Generic;
using System.Threading.Tasks;
-namespace LY.MicroService.RealtimeMessage.BackgroundJobs;
+namespace LINGYUN.Abp.Notifications.Jobs;
public class NotificationCleanupJob : IJobRunnable
{
+ #region Definition Paramters
+
+ public readonly static IReadOnlyList Paramters =
+ new List
+ {
+ new JobDefinitionParamter(PropertyBatchCount, LocalizableStatic.Create("Notification:BatchCount"))
+ };
+
+ #endregion
+ public const string Name = "NotificationCleanupJob";
///
/// 每次清除记录大小
///
public const string PropertyBatchCount = "BatchCount";
-
public async virtual Task ExecuteAsync(JobRunnableContext context)
{
var count = context.GetJobData(PropertyBatchCount);
diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/NotificationJobDefinitionProvider.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/NotificationJobDefinitionProvider.cs
new file mode 100644
index 000000000..8c0b1ad50
--- /dev/null
+++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.Jobs/LINGYUN/Abp/Notifications/Jobs/NotificationJobDefinitionProvider.cs
@@ -0,0 +1,16 @@
+using LINGYUN.Abp.BackgroundTasks;
+
+namespace LINGYUN.Abp.Notifications.Jobs;
+
+public class NotificationJobDefinitionProvider : JobDefinitionProvider
+{
+ public override void Define(IJobDefinitionContext context)
+ {
+ context.Add(
+ new JobDefinition(
+ NotificationCleanupJob.Name,
+ typeof(NotificationCleanupJob),
+ LocalizableStatic.Create("NotificationCleanupJob"),
+ NotificationCleanupJob.Paramters));
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN.Abp.BackgroundTasks.Abstractions.csproj b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN.Abp.BackgroundTasks.Abstractions.csproj
index 958d8b36d..d8f1642fc 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN.Abp.BackgroundTasks.Abstractions.csproj
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN.Abp.BackgroundTasks.Abstractions.csproj
@@ -9,7 +9,7 @@
-
+
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTaskConcurrentException.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTaskConcurrentException.cs
index 02acfafd6..f91a4b0f5 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTaskConcurrentException.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTaskConcurrentException.cs
@@ -5,7 +5,7 @@ namespace LINGYUN.Abp.BackgroundTasks;
public class AbpBackgroundTaskConcurrentException : AbpJobExecutionException
{
///
- /// Creates a new object.
+ /// Creates a new object.
///
/// Inner exception
public AbpBackgroundTaskConcurrentException(Type jobType)
@@ -17,7 +17,7 @@ public class AbpBackgroundTaskConcurrentException : AbpJobExecutionException
}
///
- /// Creates a new object.
+ /// Creates a new object.
///
/// Execute job type
/// Inner exception
@@ -30,7 +30,7 @@ public class AbpBackgroundTaskConcurrentException : AbpJobExecutionException
}
///
- /// Creates a new object.
+ /// Creates a new object.
///
/// Execute job type
/// Exception message
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTasksAbstractionsModule.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTasksAbstractionsModule.cs
index 3e349c78c..4d9ddfc22 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTasksAbstractionsModule.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTasksAbstractionsModule.cs
@@ -1,7 +1,43 @@
-using Volo.Abp.Modularity;
+using LINGYUN.Abp.BackgroundTasks.Localization;
+using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Collections.Generic;
+using Volo.Abp.Localization;
+using Volo.Abp.Modularity;
namespace LINGYUN.Abp.BackgroundTasks;
+[DependsOn(typeof(AbpLocalizationModule))]
public class AbpBackgroundTasksAbstractionsModule : AbpModule
{
+ public override void PreConfigureServices(ServiceConfigurationContext context)
+ {
+ AutoAddDefinitionProviders(context.Services);
+ }
+
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ Configure(options =>
+ {
+ options.Resources.Add("en");
+ });
+ }
+
+ private static void AutoAddDefinitionProviders(IServiceCollection services)
+ {
+ var definitionProviders = new List();
+
+ services.OnRegistred(context =>
+ {
+ if (typeof(IJobDefinitionProvider).IsAssignableFrom(context.ImplementationType))
+ {
+ definitionProviders.Add(context.ImplementationType);
+ }
+ });
+
+ services.Configure(options =>
+ {
+ options.DefinitionProviders.AddIfNotContains(definitionProviders);
+ });
+ }
}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTasksOptions.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTasksOptions.cs
index 2efcb8f5f..2f808981f 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTasksOptions.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTasksOptions.cs
@@ -1,5 +1,4 @@
using System;
-using System.Collections.Generic;
using Volo.Abp.Collections;
namespace LINGYUN.Abp.BackgroundTasks;
@@ -19,10 +18,13 @@ public class AbpBackgroundTasksOptions
///
/// 用户实现的作业可以添加在集合中
///
- public IDictionary JobProviders { get; }
+ public ITypeList DefinitionProviders { get; }
///
/// 启用清理任务
///
+ ///
+ /// 主节点启用
+ ///
public bool JobCleanEnabled { get; set; }
///
/// 任务过期时间
@@ -48,6 +50,9 @@ public class AbpBackgroundTasksOptions
///
/// 启用轮询任务
///
+ ///
+ /// 主节点启用
+ ///
public bool JobFetchEnabled { get; set; }
///
/// 每次轮询任务批次大小
@@ -76,23 +81,17 @@ public class AbpBackgroundTasksOptions
public string NodeName { get; set; }
public AbpBackgroundTasksOptions()
{
- JobFetchEnabled = true;
+ JobFetchEnabled = false;
MaxJobFetchCount = 1000;
JobFetchLockTimeOut = 120;
JobFetchCronExpression = "0/30 * * * * ? ";
- JobCleanEnabled = true;
+ JobCleanEnabled = false;
MaxJobCleanCount = 1000;
JobExpiratime = TimeSpan.FromDays(15d);
JobCleanCronExpression = "0 0/10 * * * ? *";
JobMonitors = new TypeList();
- JobProviders = new Dictionary();
- }
-
- public void AddProvider(string name)
- where TJobRunnable : IJobRunnable
- {
- JobProviders[name] = typeof(TJobRunnable);
+ DefinitionProviders = new TypeList();
}
}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/DisableJobActionAttribute.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/DisableJobActionAttribute.cs
new file mode 100644
index 000000000..e9be68be0
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/DisableJobActionAttribute.cs
@@ -0,0 +1,8 @@
+using System;
+
+namespace LINGYUN.Abp.BackgroundTasks;
+
+[AttributeUsage(AttributeTargets.Class)]
+public class DisableJobActionAttribute : Attribute
+{
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobCompletedNotifierProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobCompletedNotifierProvider.cs
deleted file mode 100644
index b025841e7..000000000
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobCompletedNotifierProvider.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using JetBrains.Annotations;
-using System.Threading.Tasks;
-
-namespace LINGYUN.Abp.BackgroundTasks;
-
-public interface IJobCompletedNotifierProvider
-{
- Task NotifyComplateAsync([NotNull] JobEventContext context);
-}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobDefinitionContext.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobDefinitionContext.cs
new file mode 100644
index 000000000..a7aa4a947
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobDefinitionContext.cs
@@ -0,0 +1,12 @@
+using System.Collections.Generic;
+
+namespace LINGYUN.Abp.BackgroundTasks;
+
+public interface IJobDefinitionContext
+{
+ JobDefinition GetOrNull(string name);
+
+ IReadOnlyList GetAll();
+
+ void Add(params JobDefinition[] definitions);
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobDefinitionManager.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobDefinitionManager.cs
new file mode 100644
index 000000000..d357ba073
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobDefinitionManager.cs
@@ -0,0 +1,14 @@
+using JetBrains.Annotations;
+using System.Collections.Generic;
+
+namespace LINGYUN.Abp.BackgroundTasks;
+
+public interface IJobDefinitionManager
+{
+ [NotNull]
+ JobDefinition Get([NotNull] string name);
+
+ IReadOnlyList GetAll();
+
+ JobDefinition GetOrNull(string name);
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobDefinitionProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobDefinitionProvider.cs
new file mode 100644
index 000000000..912964752
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobDefinitionProvider.cs
@@ -0,0 +1,6 @@
+namespace LINGYUN.Abp.BackgroundTasks;
+
+public interface IJobDefinitionProvider
+{
+ void Define(IJobDefinitionContext context);
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobExecutedNotifier.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobExecutedNotifier.cs
deleted file mode 100644
index 4ae71f8ff..000000000
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobExecutedNotifier.cs
+++ /dev/null
@@ -1,11 +0,0 @@
-using JetBrains.Annotations;
-using System.Threading.Tasks;
-
-namespace LINGYUN.Abp.BackgroundTasks;
-
-public interface IJobExecutedNotifier
-{
- Task NotifyErrorAsync([NotNull] JobEventContext context);
- Task NotifySuccessAsync([NotNull] JobEventContext context);
- Task NotifyComplateAsync([NotNull] JobEventContext context);
-}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobFailedNotifierProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobFailedNotifierProvider.cs
deleted file mode 100644
index 610423ab7..000000000
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobFailedNotifierProvider.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using JetBrains.Annotations;
-using System.Threading.Tasks;
-
-namespace LINGYUN.Abp.BackgroundTasks;
-
-public interface IJobFailedNotifierProvider
-{
- Task NotifyErrorAsync([NotNull] JobEventContext context);
-}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobSuccessNotifierProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobSuccessNotifierProvider.cs
deleted file mode 100644
index fd1b358ad..000000000
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobSuccessNotifierProvider.cs
+++ /dev/null
@@ -1,9 +0,0 @@
-using JetBrains.Annotations;
-using System.Threading.Tasks;
-
-namespace LINGYUN.Abp.BackgroundTasks;
-
-public interface IJobSuccessNotifierProvider
-{
- Task NotifySuccessAsync([NotNull] JobEventContext context);
-}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobActionType.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobActionType.cs
new file mode 100644
index 000000000..1b4752f04
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobActionType.cs
@@ -0,0 +1,7 @@
+namespace LINGYUN.Abp.BackgroundTasks;
+
+public enum JobActionType
+{
+ Failed = -1,
+ Successed = 0,
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinition.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinition.cs
new file mode 100644
index 000000000..8605b2aaa
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinition.cs
@@ -0,0 +1,43 @@
+using JetBrains.Annotations;
+using System;
+using System.Collections.Generic;
+using Volo.Abp.Localization;
+
+namespace LINGYUN.Abp.BackgroundTasks;
+
+public class JobDefinition
+{
+ ///
+ /// 名称
+ ///
+ public string Name { get; }
+ ///
+ /// 作业类型
+ ///
+ public Type JobType { get; }
+ ///
+ /// 显示名称
+ ///
+ public ILocalizableString DisplayName { get; }
+ ///
+ /// 描述
+ ///
+ public ILocalizableString Description { get; }
+ ///
+ /// 参数列表
+ ///
+ public IReadOnlyList Paramters { get; }
+ public JobDefinition(
+ [NotNull] string name,
+ [NotNull] Type jobType,
+ [NotNull] ILocalizableString displayName,
+ [CanBeNull] IReadOnlyList paramters = null,
+ [CanBeNull] ILocalizableString description = null)
+ {
+ Name = name;
+ JobType = jobType;
+ DisplayName = displayName;
+ Description = description;
+ Paramters = paramters ?? new JobDefinitionParamter[0];
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinitionContext.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinitionContext.cs
new file mode 100644
index 000000000..5302b4209
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinitionContext.cs
@@ -0,0 +1,38 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+
+namespace LINGYUN.Abp.BackgroundTasks;
+
+public class JobDefinitionContext : IJobDefinitionContext
+{
+ protected Dictionary Jobs { get; }
+
+ public JobDefinitionContext(Dictionary jobs)
+ {
+ Jobs = jobs;
+ }
+
+ public virtual JobDefinition GetOrNull(string name)
+ {
+ return Jobs.GetOrDefault(name);
+ }
+
+ public virtual IReadOnlyList GetAll()
+ {
+ return Jobs.Values.ToImmutableList();
+ }
+
+ public virtual void Add(params JobDefinition[] definitions)
+ {
+ if (definitions.IsNullOrEmpty())
+ {
+ return;
+ }
+
+ foreach (var definition in definitions)
+ {
+ Jobs[definition.Name] = definition;
+ }
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinitionManager.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinitionManager.cs
new file mode 100644
index 000000000..ecba5eb98
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinitionManager.cs
@@ -0,0 +1,73 @@
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Linq;
+using Volo.Abp;
+using Volo.Abp.DependencyInjection;
+
+namespace LINGYUN.Abp.BackgroundTasks;
+
+public class JobDefinitionManager : IJobDefinitionManager, ISingletonDependency
+{
+ protected Lazy> JobDefinitions { get; }
+
+ protected AbpBackgroundTasksOptions Options { get; }
+
+ protected IServiceProvider ServiceProvider { get; }
+
+ public JobDefinitionManager(
+ IOptions options,
+ IServiceProvider serviceProvider)
+ {
+ ServiceProvider = serviceProvider;
+ Options = options.Value;
+
+ JobDefinitions = new Lazy>(CreateJobDefinitions, true);
+ }
+
+ public virtual JobDefinition Get(string name)
+ {
+ Check.NotNull(name, nameof(name));
+
+ var action = GetOrNull(name);
+
+ if (action == null)
+ {
+ throw new AbpException("Undefined job: " + name);
+ }
+
+ return action;
+ }
+
+ public virtual IReadOnlyList GetAll()
+ {
+ return JobDefinitions.Value.Values.ToImmutableList();
+ }
+
+ public virtual JobDefinition GetOrNull(string name)
+ {
+ return JobDefinitions.Value.GetOrDefault(name);
+ }
+
+ protected virtual IDictionary CreateJobDefinitions()
+ {
+ var jobs = new Dictionary();
+
+ using (var scope = ServiceProvider.CreateScope())
+ {
+ var providers = Options
+ .DefinitionProviders
+ .Select(p => scope.ServiceProvider.GetRequiredService(p) as IJobDefinitionProvider)
+ .ToList();
+
+ foreach (var provider in providers)
+ {
+ provider.Define(new JobDefinitionContext(jobs));
+ }
+ }
+
+ return jobs;
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinitionParamter.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinitionParamter.cs
new file mode 100644
index 000000000..d31e0fb7c
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinitionParamter.cs
@@ -0,0 +1,27 @@
+using JetBrains.Annotations;
+using Volo.Abp.Localization;
+
+namespace LINGYUN.Abp.BackgroundTasks;
+
+public class JobDefinitionParamter
+{
+ public string Name { get; }
+
+ public bool Required { get; }
+
+ public ILocalizableString DisplayName { get; }
+
+ public ILocalizableString Description { get; }
+
+ public JobDefinitionParamter(
+ [NotNull] string name,
+ [NotNull] ILocalizableString displayName,
+ [CanBeNull] ILocalizableString description = null,
+ bool required = false)
+ {
+ Name = name;
+ Required = required;
+ DisplayName = displayName;
+ Description = description;
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinitionProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinitionProvider.cs
new file mode 100644
index 000000000..112d4767c
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobDefinitionProvider.cs
@@ -0,0 +1,8 @@
+using Volo.Abp.DependencyInjection;
+
+namespace LINGYUN.Abp.BackgroundTasks;
+
+public abstract class JobDefinitionProvider : IJobDefinitionProvider, ITransientDependency
+{
+ public abstract void Define(IJobDefinitionContext context);
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobExecutedNotifier.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobExecutedNotifier.cs
deleted file mode 100644
index 128a1caa9..000000000
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/JobExecutedNotifier.cs
+++ /dev/null
@@ -1,67 +0,0 @@
-using JetBrains.Annotations;
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Logging.Abstractions;
-using System;
-using System.Threading.Tasks;
-using Volo.Abp.DependencyInjection;
-
-namespace LINGYUN.Abp.BackgroundTasks;
-
-public class JobExecutedNotifier : IJobExecutedNotifier, ISingletonDependency
-{
- public ILogger Logger { protected get; set; }
-
- public JobExecutedNotifier()
- {
- Logger = NullLogger.Instance;
- }
-
- public async Task NotifyComplateAsync([NotNull] JobEventContext context)
- {
- var notifier = context.ServiceProvider.GetService();
- if (notifier != null)
- {
- try
- {
- await notifier.NotifyComplateAsync(context);
- }
- catch (Exception ex)
- {
- Logger.LogWarning($"An exception thow with job complete notify: {ex.Message}");
- }
- }
- }
-
- public async Task NotifyErrorAsync([NotNull] JobEventContext context)
- {
- var notifier = context.ServiceProvider.GetService();
- if (notifier != null)
- {
- try
- {
- await notifier.NotifyErrorAsync(context);
- }
- catch (Exception ex)
- {
- Logger.LogWarning($"An exception thow with job error notify: {ex.Message}");
- }
- }
- }
-
- public async Task NotifySuccessAsync([NotNull] JobEventContext context)
- {
- var notifier = context.ServiceProvider.GetService();
- if (notifier != null)
- {
- try
- {
- await notifier.NotifySuccessAsync(context);
- }
- catch (Exception ex)
- {
- Logger.LogWarning($"An exception thow with job success notify: {ex.Message}");
- }
- }
- }
-}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Localization/BackgroundTasksResource.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/Localization/BackgroundTasksResource.cs
similarity index 100%
rename from aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Localization/BackgroundTasksResource.cs
rename to aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/Localization/BackgroundTasksResource.cs
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/README.md b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/README.md
new file mode 100644
index 000000000..6921dedf9
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/README.md
@@ -0,0 +1,19 @@
+# LINGYUN.Abp.BackgroundTasks.Abstractions
+
+后台任务(队列)模块抽象层,定义一些基本构造与接口
+
+## 特性参数
+
+* DisableJobActionAttribute 标记此特性不处理作业触发后行为
+
+## 配置使用
+
+模块按需引用
+
+```csharp
+[DependsOn(typeof(AbpBackgroundTasksAbstractionsModule))]
+public class YouProjectModule : AbpModule
+{
+ // other
+}
+```
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/FodyWeavers.xml b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/FodyWeavers.xml
new file mode 100644
index 000000000..ac6b5b292
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/FodyWeavers.xsd b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/FodyWeavers.xsd
new file mode 100644
index 000000000..11da52550
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/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.Activities/LINGYUN.Abp.BackgroundTasks.Activities.csproj b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN.Abp.BackgroundTasks.Activities.csproj
new file mode 100644
index 000000000..ddb17427a
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN.Abp.BackgroundTasks.Activities.csproj
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+ netstandard2.0
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/AbpBackgroundTasksActivitiesModule.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/AbpBackgroundTasksActivitiesModule.cs
new file mode 100644
index 000000000..024923c63
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/AbpBackgroundTasksActivitiesModule.cs
@@ -0,0 +1,57 @@
+using LINGYUN.Abp.BackgroundTasks.Localization;
+using Microsoft.Extensions.DependencyInjection;
+using System;
+using System.Collections.Generic;
+using Volo.Abp.Localization;
+using Volo.Abp.Modularity;
+using Volo.Abp.VirtualFileSystem;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+[DependsOn(typeof(AbpLocalizationModule))]
+[DependsOn(typeof(AbpBackgroundTasksAbstractionsModule))]
+public class AbpBackgroundTasksActivitiesModule : AbpModule
+{
+ public override void PreConfigureServices(ServiceConfigurationContext context)
+ {
+ AutoAddDefinitionProviders(context.Services);
+ }
+
+ public override void ConfigureServices(ServiceConfigurationContext context)
+ {
+ Configure(options =>
+ {
+ options.FileSets.AddEmbedded();
+ });
+
+ Configure(options =>
+ {
+ options.Resources
+ .Get()
+ .AddVirtualJson("/LINGYUN/Abp/BackgroundTasks/Activities/Localization/Resources");
+ });
+
+ Configure(options =>
+ {
+ options.JobMonitors.AddIfNotContains(typeof(JobActionEvent));
+ });
+ }
+
+ private static void AutoAddDefinitionProviders(IServiceCollection services)
+ {
+ var definitionProviders = new List();
+
+ services.OnRegistred(context =>
+ {
+ if (typeof(IJobActionDefinitionProvider).IsAssignableFrom(context.ImplementationType))
+ {
+ definitionProviders.Add(context.ImplementationType);
+ }
+ });
+
+ services.Configure(options =>
+ {
+ options.DefinitionProviders.AddIfNotContains(definitionProviders);
+ });
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/AbpBackgroundTasksActivitiesOptions.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/AbpBackgroundTasksActivitiesOptions.cs
new file mode 100644
index 000000000..6e0ee6f7b
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/AbpBackgroundTasksActivitiesOptions.cs
@@ -0,0 +1,13 @@
+using Volo.Abp.Collections;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public class AbpBackgroundTasksActivitiesOptions
+{
+ public ITypeList DefinitionProviders { get; }
+
+ public AbpBackgroundTasksActivitiesOptions()
+ {
+ DefinitionProviders = new TypeList();
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/DefaultJobActionStore.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/DefaultJobActionStore.cs
new file mode 100644
index 000000000..b43f7e764
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/DefaultJobActionStore.cs
@@ -0,0 +1,15 @@
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using Volo.Abp.DependencyInjection;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+[Dependency(TryRegister = true)]
+public class DefaultJobActionStore : IJobActionStore, ISingletonDependency
+{
+ public Task> GetActionsAsync(string id, CancellationToken cancellationToken = default)
+ {
+ return Task.FromResult(new List());
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobActionDefinitionContext.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobActionDefinitionContext.cs
new file mode 100644
index 000000000..02fb3a009
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobActionDefinitionContext.cs
@@ -0,0 +1,12 @@
+using System.Collections.Generic;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public interface IJobActionDefinitionContext
+{
+ JobActionDefinition GetOrNull(string name);
+
+ IReadOnlyList GetAll();
+
+ void Add(params JobActionDefinition[] definitions);
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobActionDefinitionManager.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobActionDefinitionManager.cs
new file mode 100644
index 000000000..2c62a9182
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobActionDefinitionManager.cs
@@ -0,0 +1,14 @@
+using JetBrains.Annotations;
+using System.Collections.Generic;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public interface IJobActionDefinitionManager
+{
+ [NotNull]
+ JobActionDefinition Get([NotNull] string name);
+
+ IReadOnlyList GetAll();
+
+ JobActionDefinition GetOrNull(string name);
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobActionDefinitionProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobActionDefinitionProvider.cs
new file mode 100644
index 000000000..4af4f9a83
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobActionDefinitionProvider.cs
@@ -0,0 +1,6 @@
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public interface IJobActionDefinitionProvider
+{
+ void Define(IJobActionDefinitionContext context);
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobActionStore.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobActionStore.cs
new file mode 100644
index 000000000..91b2dc87d
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobActionStore.cs
@@ -0,0 +1,10 @@
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public interface IJobActionStore
+{
+ Task> GetActionsAsync(string id, CancellationToken cancellationToken = default);
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobExecutedProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobExecutedProvider.cs
new file mode 100644
index 000000000..621f5f970
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/IJobExecutedProvider.cs
@@ -0,0 +1,11 @@
+using JetBrains.Annotations;
+using System.Threading.Tasks;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public interface IJobExecutedProvider
+{
+ Task NotifyErrorAsync([NotNull] JobActionExecuteContext context);
+ Task NotifySuccessAsync([NotNull] JobActionExecuteContext context);
+ Task NotifyComplateAsync([NotNull] JobActionExecuteContext context);
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobAction.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobAction.cs
new file mode 100644
index 000000000..f9af05183
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobAction.cs
@@ -0,0 +1,9 @@
+using System.Collections.Generic;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public class JobAction
+{
+ public string Name { get; set; }
+ public Dictionary Paramters { get; set; }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionDefinition.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionDefinition.cs
new file mode 100644
index 000000000..5946ccb0c
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionDefinition.cs
@@ -0,0 +1,57 @@
+using JetBrains.Annotations;
+using System.Collections.Generic;
+using Volo.Abp.Collections;
+using Volo.Abp.Localization;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public class JobActionDefinition
+{
+ ///
+ /// 名称
+ ///
+ public string Name { get; }
+ ///
+ /// 类型
+ ///
+ public JobActionType Type { get; }
+ ///
+ /// 显示名称
+ ///
+ public ILocalizableString DisplayName { get; }
+ ///
+ /// 描述
+ ///
+ public ILocalizableString Description { get; }
+ ///
+ /// 参数列表
+ ///
+ public IList Paramters { get; }
+ ///
+ /// 通知提供者
+ ///
+ public ITypeList Providers { get; }
+ public JobActionDefinition(
+ [NotNull] string name,
+ [NotNull] JobActionType type,
+ [NotNull] ILocalizableString displayName,
+ [NotNull] IList paramters,
+ ILocalizableString description = null)
+ {
+ Name = name;
+ Type = type;
+ DisplayName = displayName;
+ Paramters = paramters;
+ Description = description;
+
+ Providers = new TypeList();
+ }
+
+ public virtual JobActionDefinition WithProvider()
+ where TProvider : IJobExecutedProvider
+ {
+ Providers.Add(typeof(TProvider));
+
+ return this;
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionDefinitionContext.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionDefinitionContext.cs
new file mode 100644
index 000000000..dfe33a282
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionDefinitionContext.cs
@@ -0,0 +1,37 @@
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+public class JobActionDefinitionContext : IJobActionDefinitionContext
+{
+ protected Dictionary Actions { get; }
+
+ public JobActionDefinitionContext(Dictionary actions)
+ {
+ Actions = actions;
+ }
+
+ public virtual JobActionDefinition GetOrNull(string name)
+ {
+ return Actions.GetOrDefault(name);
+ }
+
+ public virtual IReadOnlyList GetAll()
+ {
+ return Actions.Values.ToImmutableList();
+ }
+
+ public virtual void Add(params JobActionDefinition[] definitions)
+ {
+ if (definitions.IsNullOrEmpty())
+ {
+ return;
+ }
+
+ foreach (var definition in definitions)
+ {
+ Actions[definition.Name] = definition;
+ }
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionDefinitionManager.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionDefinitionManager.cs
new file mode 100644
index 000000000..b85cd5a7a
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionDefinitionManager.cs
@@ -0,0 +1,73 @@
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Options;
+using System;
+using System.Collections.Generic;
+using System.Collections.Immutable;
+using System.Linq;
+using Volo.Abp;
+using Volo.Abp.DependencyInjection;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public class JobActionDefinitionManager : IJobActionDefinitionManager, ISingletonDependency
+{
+ protected Lazy> ActionDefinitions { get; }
+
+ protected AbpBackgroundTasksActivitiesOptions Options { get; }
+
+ protected IServiceProvider ServiceProvider { get; }
+
+ public JobActionDefinitionManager(
+ IOptions options,
+ IServiceProvider serviceProvider)
+ {
+ ServiceProvider = serviceProvider;
+ Options = options.Value;
+
+ ActionDefinitions = new Lazy>(CreateSettingDefinitions, true);
+ }
+
+ public virtual JobActionDefinition Get(string name)
+ {
+ Check.NotNull(name, nameof(name));
+
+ var action = GetOrNull(name);
+
+ if (action == null)
+ {
+ throw new AbpException("Undefined action: " + name);
+ }
+
+ return action;
+ }
+
+ public virtual IReadOnlyList GetAll()
+ {
+ return ActionDefinitions.Value.Values.ToImmutableList();
+ }
+
+ public virtual JobActionDefinition GetOrNull(string name)
+ {
+ return ActionDefinitions.Value.GetOrDefault(name);
+ }
+
+ protected virtual IDictionary CreateSettingDefinitions()
+ {
+ var actions = new Dictionary();
+
+ using (var scope = ServiceProvider.CreateScope())
+ {
+ var providers = Options
+ .DefinitionProviders
+ .Select(p => scope.ServiceProvider.GetRequiredService(p) as IJobActionDefinitionProvider)
+ .ToList();
+
+ foreach (var provider in providers)
+ {
+ provider.Define(new JobActionDefinitionContext(actions));
+ }
+ }
+
+ return actions;
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionDefinitionProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionDefinitionProvider.cs
new file mode 100644
index 000000000..74de3b288
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionDefinitionProvider.cs
@@ -0,0 +1,8 @@
+using Volo.Abp.DependencyInjection;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public abstract class JobActionDefinitionProvider : IJobActionDefinitionProvider, ITransientDependency
+{
+ public abstract void Define(IJobActionDefinitionContext context);
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionEvent.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionEvent.cs
new file mode 100644
index 000000000..c5e0e9cba
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionEvent.cs
@@ -0,0 +1,89 @@
+using Microsoft.Extensions.DependencyInjection;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Volo.Abp.DependencyInjection;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public class JobActionEvent : JobEventBase, ITransientDependency
+{
+ protected async override Task OnJobAfterExecutedAsync(JobEventContext context)
+ {
+ if (context.EventData.Type.IsDefined(typeof(DisableJobActionAttribute), true))
+ {
+ return;
+ }
+
+ var actions = await GetJobActions(context);
+ if (!actions.Any())
+ {
+ return;
+ }
+
+ var provider = context.ServiceProvider.GetRequiredService();
+
+ foreach (var action in actions)
+ {
+ var definition = provider.GetOrNull(action.Name);
+
+ if (definition == null)
+ {
+ Logger.LogWarning($"Cannot execute job action {definition.Name}, Because it's not registered.");
+ continue;
+ }
+
+ await ExecuteAction(context, definition, action);
+ }
+ }
+
+ private async Task> GetJobActions(JobEventContext context)
+ {
+ var store = context.ServiceProvider.GetRequiredService();
+
+ return await store.GetActionsAsync(context.EventData.Key);
+ }
+
+ private async Task ExecuteAction(JobEventContext context, JobActionDefinition actionDefinition, JobAction action)
+ {
+ var missingRequiredParams = actionDefinition.Paramters
+ .Where(p => p.Required)
+ .Where(rp => !action.Paramters.Any(p => string.Equals(rp.Name, p.Key)))
+ .Select(rp => rp.Name);
+
+ if (missingRequiredParams.Any())
+ {
+ Logger.LogWarning($"Cannot execute job action {actionDefinition.Name}, The required parameters are missing: {missingRequiredParams.JoinAsString(Environment.NewLine)}");
+ return;
+ }
+
+ var notifierContext = new JobActionExecuteContext(action, context);
+
+ foreach (var notifierType in actionDefinition.Providers)
+ {
+ if (context.ServiceProvider.GetService(notifierType) is IJobExecutedProvider notifier)
+ {
+ if (context.EventData.Exception != null)
+ {
+ if (actionDefinition.Type == JobActionType.Failed)
+ {
+ await notifier.NotifyErrorAsync(notifierContext);
+ Logger.LogInformation($"Executed Failed action with {notifierType.Name} was Successed.");
+ }
+ continue;
+ }
+
+ if (actionDefinition.Type == JobActionType.Successed)
+ {
+ await notifier.NotifySuccessAsync(notifierContext);
+ Logger.LogInformation($"Executed Successed action with {notifierType.Name} was Successed.");
+ }
+
+ await notifier.NotifyComplateAsync(notifierContext);
+ Logger.LogInformation($"Executed Complated action with {notifierType.Name} was Successed.");
+ }
+ }
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionExecuteContext.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionExecuteContext.cs
new file mode 100644
index 000000000..85a8033f1
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionExecuteContext.cs
@@ -0,0 +1,16 @@
+using JetBrains.Annotations;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public class JobActionExecuteContext
+{
+ public JobAction Action { get; }
+ public JobEventContext Event { get; }
+ public JobActionExecuteContext(
+ [NotNull] JobAction action,
+ [NotNull] JobEventContext @event)
+ {
+ Action = action;
+ Event = @event;
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionParamter.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionParamter.cs
new file mode 100644
index 000000000..122b14285
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobActionParamter.cs
@@ -0,0 +1,24 @@
+using JetBrains.Annotations;
+using Volo.Abp.Localization;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public class JobActionParamter
+{
+ public string Name { get; set; }
+ public bool Required { get; set; }
+ public ILocalizableString DisplayName { get; set; }
+ public ILocalizableString Description { get; set; }
+
+ public JobActionParamter(
+ [NotNull] string name,
+ [NotNull] ILocalizableString displayName,
+ [CanBeNull] ILocalizableString description = null,
+ bool required = false)
+ {
+ Name = name;
+ DisplayName = displayName;
+ Description = description;
+ Required = required;
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobExecutedProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobExecutedProvider.cs
new file mode 100644
index 000000000..50ac2ce2d
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/JobExecutedProvider.cs
@@ -0,0 +1,22 @@
+using JetBrains.Annotations;
+using System.Threading.Tasks;
+
+namespace LINGYUN.Abp.BackgroundTasks.Activities;
+
+public abstract class JobExecutedProvider : IJobExecutedProvider
+{
+ public virtual Task NotifyComplateAsync([NotNull] JobActionExecuteContext context)
+ {
+ return Task.CompletedTask;
+ }
+
+ public virtual Task NotifyErrorAsync([NotNull] JobActionExecuteContext context)
+ {
+ return Task.CompletedTask;
+ }
+
+ public virtual Task NotifySuccessAsync([NotNull] JobActionExecuteContext context)
+ {
+ return Task.CompletedTask;
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/Localization/Resources/en.json b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/Localization/Resources/en.json
new file mode 100644
index 000000000..a9c8dcc3f
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/Localization/Resources/en.json
@@ -0,0 +1,5 @@
+{
+ "culture": "en",
+ "texts": {
+ }
+}
\ No newline at end of file
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/Localization/Resources/zh-Hans.json b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/Localization/Resources/zh-Hans.json
new file mode 100644
index 000000000..c5ad81326
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/LINGYUN/Abp/BackgroundTasks/Activities/Localization/Resources/zh-Hans.json
@@ -0,0 +1,5 @@
+{
+ "culture": "zh-Hans",
+ "texts": {
+ }
+}
\ No newline at end of file
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/README.md b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/README.md
new file mode 100644
index 000000000..652d692c4
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Activities/README.md
@@ -0,0 +1,21 @@
+# LINGYUN.Abp.BackgroundTasks.Activities
+
+后台任务(队列)模块行为处理模块
+
+## 接口参数
+
+* IJobActionStore 实现此接口获取作业管理行为
+* JobActionDefinitionProvider 实现此接口自定义作业行为
+* JobExecutedProvider 实现此接口扩展作业行为
+
+## 配置使用
+
+模块按需引用
+
+```csharp
+[DependsOn(typeof(AbpBackgroundTasksActivitiesModule))]
+public class YouProjectModule : AbpModule
+{
+ // other
+}
+```
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/FodyWeavers.xml b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/FodyWeavers.xml
new file mode 100644
index 000000000..1715698cc
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/FodyWeavers.xml
@@ -0,0 +1,3 @@
+
+
+
\ No newline at end of file
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/FodyWeavers.xsd b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/FodyWeavers.xsd
new file mode 100644
index 000000000..11da52550
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/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.DistributedLocking/LINGYUN.Abp.BackgroundTasks.DistributedLocking.csproj b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/LINGYUN.Abp.BackgroundTasks.DistributedLocking.csproj
new file mode 100644
index 000000000..2fdf392db
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/LINGYUN.Abp.BackgroundTasks.DistributedLocking.csproj
@@ -0,0 +1,19 @@
+
+
+
+
+
+
+ netstandard2.0
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/LINGYUN/Abp/BackgroundTasks/DistributedLocking/AbpBackgroundTasksDistributedLockingModule.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/LINGYUN/Abp/BackgroundTasks/DistributedLocking/AbpBackgroundTasksDistributedLockingModule.cs
new file mode 100644
index 000000000..79600a03e
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/LINGYUN/Abp/BackgroundTasks/DistributedLocking/AbpBackgroundTasksDistributedLockingModule.cs
@@ -0,0 +1,11 @@
+using Volo.Abp.DistributedLocking;
+using Volo.Abp.Modularity;
+
+namespace LINGYUN.Abp.BackgroundTasks.DistributedLocking;
+
+[DependsOn(typeof(AbpBackgroundTasksModule))]
+[DependsOn(typeof(AbpDistributedLockingAbstractionsModule))]
+public class AbpBackgroundTasksDistributedLockingModule : AbpModule
+{
+
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/JobLockProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/LINGYUN/Abp/BackgroundTasks/DistributedLocking/JobDistributedLockingProvider.cs
similarity index 80%
rename from aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/JobLockProvider.cs
rename to aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/LINGYUN/Abp/BackgroundTasks/DistributedLocking/JobDistributedLockingProvider.cs
index 6f03ab576..05e27bcea 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/JobLockProvider.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/LINGYUN/Abp/BackgroundTasks/DistributedLocking/JobDistributedLockingProvider.cs
@@ -4,15 +4,15 @@ using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.DistributedLocking;
-namespace LINGYUN.Abp.BackgroundTasks;
+namespace LINGYUN.Abp.BackgroundTasks.DistributedLocking;
[Dependency(ReplaceServices = true)]
-public class JobLockProvider : IJobLockProvider, ISingletonDependency
+public class JobDistributedLockingProvider : IJobLockProvider, ISingletonDependency
{
protected IMemoryCache LockCache { get; }
protected IAbpDistributedLock DistributedLock { get; }
- public JobLockProvider(
+ public JobDistributedLockingProvider(
IMemoryCache lockCache,
IAbpDistributedLock distributedLock)
{
@@ -28,7 +28,7 @@ public class JobLockProvider : IJobLockProvider, ISingletonDependency
await LockCache.GetOrCreateAsync(jobKey, (entry) =>
{
entry.SetAbsoluteExpiration(TimeSpan.FromSeconds(lockSeconds));
- entry.RegisterPostEvictionCallback(async (key, value, reason, state) =>
+ entry.RegisterPostEvictionCallback(async (object key, object value, EvictionReason reason, object state) =>
{
if (reason == EvictionReason.Expired && value is IAbpDistributedLockHandle handleValue)
{
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/README.md b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/README.md
new file mode 100644
index 000000000..2c9abaa1e
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.DistributedLocking/README.md
@@ -0,0 +1,17 @@
+# LINGYUN.Abp.BackgroundTasks.DistributedLocking
+
+后台任务(队列)模块分布式锁模块
+
+See: [Distributed-Locking](https://docs.abp.io/en/abp/latest/Distributed-Locking)
+
+## 配置使用
+
+模块按需引用
+
+```csharp
+[DependsOn(typeof(AbpBackgroundTasksDistributedLockingModule))]
+public class YouProjectModule : AbpModule
+{
+ // other
+}
+```
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/README.md b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/README.md
new file mode 100644
index 000000000..54b4c3b05
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.EventBus/README.md
@@ -0,0 +1,15 @@
+# LINGYUN.Abp.BackgroundTasks.EventBus
+
+后台任务(队列)模块分布式事件模块,集成模块使应用程序具备处理作业事件能力
+
+## 配置使用
+
+模块按需引用
+
+```csharp
+[DependsOn(typeof(AbpBackgroundTasksEventBusModule))]
+public class YouProjectModule : AbpModule
+{
+ // other
+}
+```
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN.Abp.BackgroundTasks.ExceptionHandling.csproj b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN.Abp.BackgroundTasks.ExceptionHandling.csproj
index 45c0aed6a..95bdbb147 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN.Abp.BackgroundTasks.ExceptionHandling.csproj
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN.Abp.BackgroundTasks.ExceptionHandling.csproj
@@ -24,7 +24,7 @@
-
+
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/AbpBackgroundTasksExceptionHandlingModule.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/AbpBackgroundTasksExceptionHandlingModule.cs
index 4e20f436c..a626ff61d 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/AbpBackgroundTasksExceptionHandlingModule.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/AbpBackgroundTasksExceptionHandlingModule.cs
@@ -1,12 +1,13 @@
-using LINGYUN.Abp.BackgroundTasks.Localization;
+using LINGYUN.Abp.BackgroundTasks.Activities;
+using LINGYUN.Abp.BackgroundTasks.Localization;
+using Volo.Abp.Emailing;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
-using Volo.Abp.Emailing;
using Volo.Abp.VirtualFileSystem;
namespace LINGYUN.Abp.BackgroundTasks.ExceptionHandling;
-[DependsOn(typeof(AbpBackgroundTasksModule))]
+[DependsOn(typeof(AbpBackgroundTasksActivitiesModule))]
[DependsOn(typeof(AbpEmailingModule))]
public class AbpBackgroundTasksExceptionHandlingModule : AbpModule
{
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/ExceptionHandlingJobActionDefinitionProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/ExceptionHandlingJobActionDefinitionProvider.cs
new file mode 100644
index 000000000..41995f690
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/ExceptionHandlingJobActionDefinitionProvider.cs
@@ -0,0 +1,25 @@
+using LINGYUN.Abp.BackgroundTasks.Activities;
+using LINGYUN.Abp.BackgroundTasks.Localization;
+using Volo.Abp.Localization;
+
+namespace LINGYUN.Abp.BackgroundTasks.ExceptionHandling;
+
+public class ExceptionHandlingJobActionDefinitionProvider : JobActionDefinitionProvider
+{
+ public override void Define(IJobActionDefinitionContext context)
+ {
+ context.Add(
+ new JobActionDefinition(
+ JobExecutedFailedProvider.Name,
+ JobActionType.Failed,
+ L("JobExceptionNotifier"),
+ JobExecutedFailedProvider.Paramters,
+ L("JobExceptionNotifier"))
+ .WithProvider());
+ }
+
+ private static ILocalizableString L(string name)
+ {
+ return LocalizableString.Create(name);
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/JobExecutedFailedProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/JobExecutedFailedProvider.cs
new file mode 100644
index 000000000..cae5b37dc
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/JobExecutedFailedProvider.cs
@@ -0,0 +1,144 @@
+using JetBrains.Annotations;
+using LINGYUN.Abp.BackgroundTasks.Activities;
+using LINGYUN.Abp.BackgroundTasks.ExceptionHandling.Templates;
+using LINGYUN.Abp.BackgroundTasks.Localization;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Abstractions;
+using Newtonsoft.Json;
+using System;
+using System.Collections.Generic;
+using System.Globalization;
+using System.Threading.Tasks;
+using Volo.Abp.DependencyInjection;
+using Volo.Abp.Emailing;
+using Volo.Abp.Localization;
+using Volo.Abp.MultiTenancy;
+using Volo.Abp.TextTemplating;
+
+namespace LINGYUN.Abp.BackgroundTasks.ExceptionHandling;
+
+public class JobExecutedFailedProvider : JobExecutedProvider, ITransientDependency
+{
+ public const string Name = "JobExecutedFailedProvider";
+ public readonly static IList Paramters = new List
+ {
+ new JobActionParamter(PropertyTo, L("DisplayName:PropertyTo"), L("Description:PropertyTo"), true),
+
+ new JobActionParamter(PropertySubject, L("DisplayName:PropertySubject"), L("Description:PropertySubject")),
+ new JobActionParamter(PropertyFrom, L("DisplayName:PropertyFrom"), L("Description:PropertyFrom")),
+ new JobActionParamter(PropertyBody, L("DisplayName:PropertyBody"), L("Description:PropertyBody")),
+ new JobActionParamter(PropertyTemplate, L("DisplayName:PropertyTemplate"), L("Description:PropertyTemplate")),
+ new JobActionParamter(PropertyContext, L("DisplayName:PropertyContext"), L("Description:PropertyContext")),
+ new JobActionParamter(PropertyCulture, L("DisplayName:PropertyCulture"), L("Description:PropertyCulture")),
+ };
+
+ public const string Prefix = "exception.";
+ public const string JobGroup = "ExceptionNotifier";
+
+ public const string PropertyFrom = Prefix + "from";
+ ///
+ /// 接收者
+ ///
+ public const string PropertyTo = Prefix + "to";
+ ///
+ /// 必须,邮件主体
+ ///
+ public const string PropertySubject = Prefix + "subject";
+ ///
+ /// 消息内容, 文本消息时必须
+ ///
+ public const string PropertyBody = Prefix + "body";
+ ///
+ /// 发送模板消息
+ ///
+ public const string PropertyTemplate = Prefix + "template";
+ ///
+ /// 可选, 模板消息中的上下文参数
+ ///
+ public const string PropertyContext = Prefix + "context";
+ ///
+ /// 可选, 模板消息中的区域性
+ ///
+ public const string PropertyCulture = Prefix + "culture";
+
+ public ILogger Logger { protected get; set; }
+
+ protected IEmailSender EmailSender { get; }
+ protected ITemplateRenderer TemplateRenderer { get; }
+ public JobExecutedFailedProvider(
+ IEmailSender emailSender,
+ ITemplateRenderer templateRenderer)
+ {
+ EmailSender = emailSender;
+ TemplateRenderer = templateRenderer;
+
+ Logger = NullLogger.Instance;
+ }
+
+ public override async Task NotifyErrorAsync([NotNull] JobActionExecuteContext context)
+ {
+ if (context.Action.Paramters.TryGetValue(PropertyTo, out var exceptionTo) &&
+ exceptionTo is string to)
+ {
+ var template = context.Action.Paramters.GetOrDefault(PropertyTemplate)?.ToString() ?? "";
+ var subject = context.Action.Paramters.GetOrDefault(PropertySubject)?.ToString() ?? "From job execute exception";
+ var from = context.Action.Paramters.GetOrDefault(PropertyFrom)?.ToString() ?? "";
+ var errorMessage = context.Event.EventData.Exception.GetBaseException().Message;
+
+ if (template.IsNullOrWhiteSpace())
+ {
+ // var message = eventData.Args.GetOrDefault(SendEmailJob.PropertyBody)?.ToString() ?? "";
+ // await EmailSender.SendAsync(from, to, subject, message, false);
+ // return;
+ // 默认使用内置模板发送错误
+ template = JobExceptionHandlingTemplates.JobExceptionNotifier;
+ }
+
+ var footer = context.Action.Paramters.GetOrDefault("footer")?.ToString() ?? $"Copyright to LY Colin © {context.Event.EventData.RunTime.Year}";
+ var model = new
+ {
+ Title = subject,
+ Id = context.Event.EventData.Key,
+ Group = context.Action.Paramters.GetOrDefault(nameof(JobInfo.Group)) ?? context.Event.EventData.Group,
+ Name = context.Action.Paramters.GetOrDefault(nameof(JobInfo.Name)) ?? context.Event.EventData.Name,
+ Type = context.Action.Paramters.GetOrDefault(nameof(JobInfo.Type)) ?? context.Event.EventData.Type.Name,
+ Triggertime = context.Event.EventData.RunTime.ToString("yyyy-MM-dd HH:mm:ss"),
+ Message = errorMessage,
+ Tenantname = context.Action.Paramters.GetOrDefault(nameof(IMultiTenant.TenantId)),
+ Footer = footer,
+ };
+
+ var globalContext = new Dictionary();
+ if (context.Action.Paramters.TryGetValue(PropertyContext, out var ctx) &&
+ ctx is string ctxStr && !ctxStr.IsNullOrWhiteSpace())
+ {
+ try
+ {
+ globalContext = JsonConvert.DeserializeObject>(ctxStr);
+ }
+ catch { }
+ }
+ globalContext.AddIfNotContains(context.Action.Paramters);
+
+ var culture = context.Action.Paramters.GetOrDefault(PropertyCulture)?.ToString() ?? CultureInfo.CurrentCulture.Name;
+
+ var content = await TemplateRenderer.RenderAsync(
+ templateName: template,
+ model: model,
+ cultureName: culture,
+ globalContext: globalContext);
+
+ if (from.IsNullOrWhiteSpace())
+ {
+ await EmailSender.SendAsync(to, subject, content, true);
+ return;
+ }
+ await EmailSender.SendAsync(from, to, subject, content, true);
+ }
+ }
+
+ private static ILocalizableString L(string name)
+ {
+ return LocalizableString.Create(name);
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/JobFailedNotifierProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/JobFailedNotifierProvider.cs
deleted file mode 100644
index 33791fc93..000000000
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/JobFailedNotifierProvider.cs
+++ /dev/null
@@ -1,132 +0,0 @@
-using JetBrains.Annotations;
-using LINGYUN.Abp.BackgroundTasks.ExceptionHandling.Templates;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Logging.Abstractions;
-using Newtonsoft.Json;
-using System;
-using System.Collections.Generic;
-using System.Globalization;
-using System.Threading.Tasks;
-using Volo.Abp.DependencyInjection;
-using Volo.Abp.Emailing;
-using Volo.Abp.MultiTenancy;
-using Volo.Abp.TextTemplating;
-
-namespace LINGYUN.Abp.BackgroundTasks.ExceptionHandling;
-
-public class JobFailedNotifierProvider : IJobFailedNotifierProvider, ITransientDependency
-{
- public const string Prefix = "exception.";
- public const string JobGroup = "ExceptionNotifier";
-
- public const string PropertyFrom = "from";
- ///
- /// 接收者
- ///
- public const string PropertyTo = "to";
- ///
- /// 必须,邮件主体
- ///
- public const string PropertySubject = "subject";
- ///
- /// 消息内容, 文本消息时必须
- ///
- public const string PropertyBody = "body";
- ///
- /// 发送模板消息
- ///
- public const string PropertyTemplate = "template";
- ///
- /// 可选, 模板消息中的上下文参数
- ///
- public const string PropertyContext = "context";
- ///
- /// 可选, 模板消息中的区域性
- ///
- public const string PropertyCulture = "culture";
-
- public ILogger Logger { protected get; set; }
-
- protected IEmailSender EmailSender { get; }
- protected ITemplateRenderer TemplateRenderer { get; }
-
- public JobFailedNotifierProvider(
- IEmailSender emailSender,
- ITemplateRenderer templateRenderer)
- {
- EmailSender = emailSender;
- TemplateRenderer = templateRenderer;
-
- Logger = NullLogger.Instance;
- }
-
- public virtual async Task NotifyErrorAsync([NotNull] JobEventContext context)
- {
- var eventData = context.EventData;
- // 异常所属分组不处理, 防止死循环
- if (string.Equals(eventData.Group, JobGroup))
- {
- Logger.LogWarning($"There is a problem executing the job, reason: {eventData.Exception.Message}");
- return;
- }
- var notifyKey = Prefix + PropertyTo;
- if (eventData.Args.TryGetValue(notifyKey, out var exceptionTo) &&
- exceptionTo is string to)
- {
- var template = eventData.Args.GetOrDefault(Prefix + PropertyTemplate)?.ToString() ?? "";
- var subject = eventData.Args.GetOrDefault(Prefix + PropertySubject)?.ToString() ?? "From job execute exception";
- var from = eventData.Args.GetOrDefault(Prefix + PropertyFrom)?.ToString() ?? "";
- var errorMessage = eventData.Exception.GetBaseException().Message;
-
- if (template.IsNullOrWhiteSpace())
- {
- // var message = eventData.Args.GetOrDefault(Prefix + SendEmailJob.PropertyBody)?.ToString() ?? "";
- // await EmailSender.SendAsync(from, to, subject, message, false);
- // return;
- // 默认使用内置模板发送错误
- template = JobExceptionHandlingTemplates.JobExceptionNotifier;
- }
-
- var footer = eventData.Args.GetOrDefault("footer")?.ToString() ?? $"Copyright to LY Colin © {eventData.RunTime.Year}";
- var model = new
- {
- Title = subject,
- Id = eventData.Key,
- Group = eventData.Args.GetOrDefault(nameof(JobInfo.Group)) ?? eventData.Group,
- Name = eventData.Args.GetOrDefault(nameof(JobInfo.Name)) ?? eventData.Name,
- Type = eventData.Args.GetOrDefault(nameof(JobInfo.Type)) ?? eventData.Type.Name,
- Triggertime = eventData.RunTime.ToString("yyyy-MM-dd HH:mm:ss"),
- Message = errorMessage,
- Tenantname = eventData.Args.GetOrDefault(nameof(IMultiTenant.TenantId)),
- Footer = footer,
- };
-
- var globalContext = new Dictionary();
- if (eventData.Args.TryGetValue(Prefix + PropertyContext, out var ctx) &&
- ctx is string ctxStr && !ctxStr.IsNullOrWhiteSpace())
- {
- try
- {
- globalContext = JsonConvert.DeserializeObject>(ctxStr);
- }
- catch { }
- }
- globalContext.AddIfNotContains(eventData.Args);
-
- var culture = eventData.Args.GetOrDefault(Prefix + PropertyCulture)?.ToString() ?? CultureInfo.CurrentCulture.Name;
-
- var content = await TemplateRenderer.RenderAsync(
- templateName: template,
- model: model,
- cultureName: culture,
- globalContext: globalContext);
-
- if (from.IsNullOrWhiteSpace())
- {
- await EmailSender.SendAsync(to, subject, content, true);
- return;
- }
- await EmailSender.SendAsync(from, to, subject, content, true);
- }
- }
-}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/README.md b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/README.md
index 4f0cf8d92..3cd15a8ea 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/README.md
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/README.md
@@ -19,9 +19,9 @@ public class YouProjectModule : AbpModule
** 在定义作业时在参数中指定如下参数,在作业执行失败时将发送通知
* exception.to 必须, 接收者邮件地址
-* exception.from 必须, 邮件抬头发送者名称
+* exception.from 可选, 邮件抬头发送者名称
* exception.body 可选, 邮件内容(未指定模板名称则为必须参数)
-* exception.subject 必须, 邮件标题
+* exception.subject 可选, 邮件标题
* exception.template 可选, 邮件模板
* exception.context 可选, 使用模板时的上下文参数
* exception.culture 可选, 使用模板时的模板区域性
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN.Abp.BackgroundTasks.Jobs.csproj b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN.Abp.BackgroundTasks.Jobs.csproj
index adedc3bf9..26e2ad9a0 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN.Abp.BackgroundTasks.Jobs.csproj
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN.Abp.BackgroundTasks.Jobs.csproj
@@ -8,6 +8,14 @@
+
+
+
+
+
+
+
+
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/AbpBackgroundTasksJobsModule.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/AbpBackgroundTasksJobsModule.cs
index 03bbe252e..d3ec60c91 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/AbpBackgroundTasksJobsModule.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/AbpBackgroundTasksJobsModule.cs
@@ -1,10 +1,13 @@
-using LINGYUN.Abp.Dapr.Client;
+using LINGYUN.Abp.BackgroundTasks.Localization;
+using LINGYUN.Abp.Dapr.Client;
using LINGYUN.Abp.Dapr.Client.DynamicProxying;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.Emailing;
using Volo.Abp.Http.Client;
+using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.Sms;
+using Volo.Abp.VirtualFileSystem;
namespace LINGYUN.Abp.BackgroundTasks.Jobs;
@@ -12,6 +15,7 @@ namespace LINGYUN.Abp.BackgroundTasks.Jobs;
[DependsOn(typeof(AbpSmsModule))]
[DependsOn(typeof(AbpHttpClientModule))]
[DependsOn(typeof(AbpDaprClientModule))]
+[DependsOn(typeof(AbpBackgroundTasksAbstractionsModule))]
public class AbpBackgroundTasksJobsModule : AbpModule
{
protected const string DontWrapResultField = "_AbpDontWrapResult";
@@ -33,14 +37,16 @@ public class AbpBackgroundTasksJobsModule : AbpModule
public override void ConfigureServices(ServiceConfigurationContext context)
{
- Configure(options =>
+ Configure(options =>
{
- options.AddProvider(DefaultJobNames.ConsoleJob);
- options.AddProvider(DefaultJobNames.SendEmailJob);
- options.AddProvider(DefaultJobNames.SendSmsJob);
- options.AddProvider(DefaultJobNames.SleepJob);
- options.AddProvider(DefaultJobNames.ServiceInvocationJob);
- options.AddProvider(DefaultJobNames.HttpRequestJob);
+ options.FileSets.AddEmbedded();
+ });
+
+ Configure(options =>
+ {
+ options.Resources
+ .Get()
+ .AddVirtualJson("/LINGYUN/Abp/BackgroundTasks/Jobs/Localization/Resources");
});
Configure(options =>
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/ConsoleJob.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/ConsoleJob.cs
index 76fbf198e..576f8614f 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/ConsoleJob.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/ConsoleJob.cs
@@ -1,10 +1,21 @@
using System;
+using System.Collections.Generic;
using System.Threading.Tasks;
namespace LINGYUN.Abp.BackgroundTasks.Jobs;
public class ConsoleJob : IJobRunnable
{
+ #region Definition Paramters
+
+ public readonly static IReadOnlyList Paramters =
+ new List
+ {
+ new JobDefinitionParamter(PropertyMessage, LocalizableStatic.Create("Console:Message"))
+ };
+
+ #endregion
+
public const string PropertyMessage = "message";
public Task ExecuteAsync(JobRunnableContext context)
{
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/DefaultJobDefinitionProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/DefaultJobDefinitionProvider.cs
new file mode 100644
index 000000000..bbca3aaeb
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/DefaultJobDefinitionProvider.cs
@@ -0,0 +1,51 @@
+namespace LINGYUN.Abp.BackgroundTasks.Jobs;
+
+public class DefaultJobDefinitionProvider : JobDefinitionProvider
+{
+ public override void Define(IJobDefinitionContext context)
+ {
+ context.Add(CreateDefaultJobs());
+ }
+
+ private static JobDefinition[] CreateDefaultJobs()
+ {
+ return new[]
+ {
+ new JobDefinition(
+ DefaultJobNames.SleepJob,
+ typeof(SleepJob),
+ LocalizableStatic.Create("SleepJob"),
+ SleepJob.Paramters),
+
+ new JobDefinition(
+ DefaultJobNames.ConsoleJob,
+ typeof(ConsoleJob),
+ LocalizableStatic.Create("ConsoleJob"),
+ ConsoleJob.Paramters),
+
+ new JobDefinition(
+ DefaultJobNames.SendSmsJob,
+ typeof(SendSmsJob),
+ LocalizableStatic.Create("SendSmsJob"),
+ SendSmsJob.Paramters),
+
+ new JobDefinition(
+ DefaultJobNames.SendEmailJob,
+ typeof(SendEmailJob),
+ LocalizableStatic.Create("SendEmailJob"),
+ SendEmailJob.Paramters),
+
+ new JobDefinition(
+ DefaultJobNames.HttpRequestJob,
+ typeof(HttpRequestJob),
+ LocalizableStatic.Create("HttpRequestJob"),
+ HttpRequestJob.Paramters),
+
+ new JobDefinition(
+ DefaultJobNames.ServiceInvocationJob,
+ typeof(ServiceInvocationJob),
+ LocalizableStatic.Create("ServiceInvocationJob"),
+ ServiceInvocationJob.Paramters),
+ };
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/HttpRequestJob.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/HttpRequestJob.cs
index 055cf9093..ca3a5509d 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/HttpRequestJob.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/HttpRequestJob.cs
@@ -8,12 +8,34 @@ namespace LINGYUN.Abp.BackgroundTasks.Jobs;
public class HttpRequestJob : HttpRequestJobBase, IJobRunnable
{
+ #region Definition Paramters
+
+ public readonly static IReadOnlyList Paramters =
+ new List
+ {
+ new JobDefinitionParamter(
+ PropertyUrl,
+ LocalizableStatic.Create("Http:Url"),
+ required: true),
+ new JobDefinitionParamter(
+ PropertyMethod,
+ LocalizableStatic.Create("Http:Method"),
+ LocalizableStatic.Create("Http:MethodDesc"),
+ required: true),
+
+ new JobDefinitionParamter(PropertyData, LocalizableStatic.Create("Http:Data")),
+ new JobDefinitionParamter(PropertyContentType, LocalizableStatic.Create("Http:ContentType")),
+ new JobDefinitionParamter(PropertyHeaders, LocalizableStatic.Create("Http:Headers")),
+ new JobDefinitionParamter(PropertyCulture, LocalizableStatic.Create("Http:Culture")),
+ };
+
+ #endregion
+
public const string PropertyUrl = "url";
public const string PropertyMethod = "method";
public const string PropertyData = "data";
public const string PropertyContentType = "contentType";
public const string PropertyHeaders = "headers";
- public const string PropertyToken = "token";
public virtual async Task ExecuteAsync(JobRunnableContext context)
{
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/LocalizableStatic.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/LocalizableStatic.cs
new file mode 100644
index 000000000..f8e723b51
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/LocalizableStatic.cs
@@ -0,0 +1,12 @@
+using LINGYUN.Abp.BackgroundTasks.Localization;
+using Volo.Abp.Localization;
+
+namespace LINGYUN.Abp.BackgroundTasks.Jobs;
+
+internal static class LocalizableStatic
+{
+ public static ILocalizableString Create(string name)
+ {
+ return LocalizableString.Create(name);
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/Localization/Resources/en.json b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/Localization/Resources/en.json
new file mode 100644
index 000000000..4d39dde03
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/Localization/Resources/en.json
@@ -0,0 +1,37 @@
+{
+ "culture": "en",
+ "texts": {
+ "SleepJob": "Sleep Job",
+ "ConsoleJob": "Console Job",
+ "SendSmsJob": "Sms Job",
+ "SendEmailJob": "Email Job",
+ "HttpRequestJob": "Http Request Job",
+ "ServiceInvocationJob": "Service Invocation Job",
+ "Console:Message": "Message",
+ "Http:Url": "Url",
+ "Http:Method": "Method",
+ "Http:MethodDesc": "The request method can be GET, PUT, POST, PATCH, OPTIONS, or DELETE.",
+ "Http:Data": "Data",
+ "Http:ContentType": "Content Type",
+ "Http:Headers": "Headers",
+ "Http:Culture": "Culture",
+ "Http:Service": "Service",
+ "Http:Tenant": "Tenant",
+ "Http:Provider": "Provider",
+ "Http:ProviderDesc": "Interservice invocation program, optional scope: http、dapr.",
+ "Http:AppId": "App Id",
+ "Http:AppIdDesc": "App Id, This parameter takes effect only when the provider is dapr.",
+ "Sms:PhoneNumber": "Phone Number",
+ "Sms:Message": "Message",
+ "Sms:Properties": "Properties",
+ "Emailing:To": "To",
+ "Emailing:Subject": "Subject",
+ "Emailing:From": "From",
+ "Emailing:Body": "Body",
+ "Emailing:Template": "Template",
+ "Emailing:Model": "Model",
+ "Emailing:Context": "Context",
+ "Emailing:Culture": "Culture",
+ "Sleep:Delay": "Delay(ms)"
+ }
+}
\ No newline at end of file
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/Localization/Resources/zh-Hans.json b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/Localization/Resources/zh-Hans.json
new file mode 100644
index 000000000..85f879764
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/Localization/Resources/zh-Hans.json
@@ -0,0 +1,37 @@
+{
+ "culture": "zh-Hans",
+ "texts": {
+ "SleepJob": "休眠作业",
+ "ConsoleJob": "控制台作业",
+ "SendSmsJob": "短信作业",
+ "SendEmailJob": "邮件作业",
+ "HttpRequestJob": "Http请求作业",
+ "ServiceInvocationJob": "远程调用作业",
+ "Console:Message": "消息",
+ "Http:Url": "请求路径",
+ "Http:Method": "请求方法",
+ "Http:MethodDesc": "请求方法,支持的格式为GET、PUT、POST、PATCH、OPTIONS、DELETE.",
+ "Http:Data": "传输数据",
+ "Http:ContentType": "内容类型",
+ "Http:Headers": "请求头",
+ "Http:Culture": "文化名称",
+ "Http:Service": "服务名称",
+ "Http:Tenant": "租户",
+ "Http:Provider": "调用方",
+ "Http:ProviderDesc": "服务间调用程序,可选范围: http、dapr.",
+ "Http:AppId": "应用标识",
+ "Http:AppIdDesc": "应用标识,仅限调用方为dapr时生效.",
+ "Sms:PhoneNumber": "手机号码",
+ "Sms:Message": "消息内容",
+ "Sms:Properties": "消息参数",
+ "Emailing:To": "收件地址",
+ "Emailing:Subject": "邮件标题",
+ "Emailing:From": "发送方名称",
+ "Emailing:Body": "发送内容",
+ "Emailing:Template": "邮件模板",
+ "Emailing:Model": "数据",
+ "Emailing:Context": "全局参数",
+ "Emailing:Culture": "文化名称",
+ "Sleep:Delay": "延迟(ms)"
+ }
+}
\ No newline at end of file
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/SendEmailJob.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/SendEmailJob.cs
index 08dc41415..f0c44eb2c 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/SendEmailJob.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/SendEmailJob.cs
@@ -9,6 +9,25 @@ namespace LINGYUN.Abp.BackgroundTasks.Jobs;
public class SendEmailJob : IJobRunnable
{
+
+ #region Definition Paramters
+
+ public readonly static IReadOnlyList Paramters =
+ new List
+ {
+ new JobDefinitionParamter(PropertyTo, LocalizableStatic.Create("Emailing:To"), required: true),
+ new JobDefinitionParamter(PropertySubject, LocalizableStatic.Create("Emailing:Subject"), required: true),
+
+ new JobDefinitionParamter(PropertyFrom, LocalizableStatic.Create("Emailing:From")),
+ new JobDefinitionParamter(PropertyBody, LocalizableStatic.Create("Emailing:Body")),
+ new JobDefinitionParamter(PropertyTemplate, LocalizableStatic.Create("Emailing:Template")),
+ new JobDefinitionParamter(PropertyModel, LocalizableStatic.Create("Emailing:Model")),
+ new JobDefinitionParamter(PropertyContext, LocalizableStatic.Create("Emailing:Context")),
+ new JobDefinitionParamter(PropertyCulture, LocalizableStatic.Create("Emailing:Culture")),
+ };
+
+ #endregion
+
public const string PropertyFrom = "from";
///
/// 接收者
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/SendSmsJob.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/SendSmsJob.cs
index f16eadec1..4f7123569 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/SendSmsJob.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/SendSmsJob.cs
@@ -7,6 +7,19 @@ namespace LINGYUN.Abp.BackgroundTasks.Jobs;
public class SendSmsJob : IJobRunnable
{
+ #region Definition Paramters
+
+ public readonly static IReadOnlyList Paramters =
+ new List
+ {
+ new JobDefinitionParamter(PropertyPhoneNumber, LocalizableStatic.Create("Sms:PhoneNumber"), required: true),
+ new JobDefinitionParamter(PropertyMessage, LocalizableStatic.Create("Sms:Message"), required: true),
+
+ new JobDefinitionParamter(PropertyProperties, LocalizableStatic.Create("Sms:Properties")),
+ };
+
+ #endregion
+
public const string PropertyPhoneNumber = "phoneNumber";
public const string PropertyMessage = "message";
public const string PropertyProperties = "properties";
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/ServiceInvocationJob.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/ServiceInvocationJob.cs
index e6691813d..037cf94ab 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/ServiceInvocationJob.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/ServiceInvocationJob.cs
@@ -20,6 +20,23 @@ namespace LINGYUN.Abp.BackgroundTasks.Jobs;
public class ServiceInvocationJob : IJobRunnable
{
+ #region Definition Paramters
+
+ public readonly static IReadOnlyList Paramters =
+ new List
+ {
+ new JobDefinitionParamter(PropertyService, LocalizableStatic.Create("Http:Service"), required: true),
+ new JobDefinitionParamter(PropertyMethod, LocalizableStatic.Create("Http:Method"), required: true),
+
+ new JobDefinitionParamter(PropertyData, LocalizableStatic.Create("Http:Data")),
+ new JobDefinitionParamter(PropertyCulture, LocalizableStatic.Create("Http:Culture")),
+ new JobDefinitionParamter(PropertyTenant, LocalizableStatic.Create("Http:Tenant")),
+ new JobDefinitionParamter(PropertyProvider, LocalizableStatic.Create("Http:Provider"), LocalizableStatic.Create("Http:ProviderDesc")),
+ new JobDefinitionParamter(PropertyAppId, LocalizableStatic.Create("Http:AppId"), LocalizableStatic.Create("Http:AppIdDesc")),
+ };
+
+ #endregion
+
// 必须, 接口类型
public const string PropertyService = "service";
// 必须, 接口方法名称
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/SleepJob.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/SleepJob.cs
index ca78365f3..4cac9d820 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/SleepJob.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/SleepJob.cs
@@ -1,13 +1,26 @@
using System;
+using System.Collections.Generic;
using System.Threading.Tasks;
namespace LINGYUN.Abp.BackgroundTasks.Jobs;
public class SleepJob : IJobRunnable
{
+ #region Definition Paramters
+
+ public readonly static IReadOnlyList Paramters =
+ new List
+ {
+ new JobDefinitionParamter(PropertyDelay, LocalizableStatic.Create("Sleep:Delay"))
+ };
+
+ #endregion
+
+ public const string PropertyDelay = "delay";
+
public async Task ExecuteAsync(JobRunnableContext context)
{
- context.JobData.TryGetValue("Delay", out var sleep);
+ context.JobData.TryGetValue(PropertyDelay, out var sleep);
Console.WriteLine($"[{DateTime.Now:yyyy-MM-dd HH:mm:ss}] - Sleep {sleep ?? 20000} milliseconds.");
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/README.md b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/README.md
new file mode 100644
index 000000000..2069a9e53
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/README.md
@@ -0,0 +1,24 @@
+# LINGYUN.Abp.BackgroundTasks.Jobs
+
+后台任务(队列)常用作业模块
+
+## 作业列表
+
+* [ConsoleJob](./LINGYUN/Abp/BackgroundTasks/Jobs/ConsoleJob): 控制台输出
+* [HttpRequestJob](./LINGYUN/Abp/BackgroundTasks/Jobs/HttpRequestJob): Http请求
+* [SendEmailJob](./LINGYUN/Abp/BackgroundTasks/Jobs/SendEmailJob): 发送邮件
+* [SendSmsJob](./LINGYUN/Abp/BackgroundTasks/Jobs/SendSmsJob): 发送短信
+* [ServiceInvocationJob](./LINGYUN/Abp/BackgroundTasks/Jobs/ServiceInvocationJob): 服务间调用(Http请求的扩展)
+* [SleepJob](./LINGYUN/Abp/BackgroundTasks/Jobs/SleepJob): 休眠,使作业延期执行
+
+## 配置使用
+
+模块按需引用
+
+```csharp
+[DependsOn(typeof(AbpBackgroundTasksJobsModule))]
+public class YouProjectModule : AbpModule
+{
+ // other
+}
+```
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/IQuartzJobExecutorProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/IQuartzJobCreator.cs
similarity index 76%
rename from aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/IQuartzJobExecutorProvider.cs
rename to aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/IQuartzJobCreator.cs
index 0bd0b9b76..c15c34c8d 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/IQuartzJobExecutorProvider.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/IQuartzJobCreator.cs
@@ -2,7 +2,7 @@
namespace LINGYUN.Abp.BackgroundTasks.Quartz;
-public interface IQuartzJobExecutorProvider
+public interface IQuartzJobCreator
{
#nullable enable
IJobDetail? CreateJob(JobInfo job);
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/QuartzJobCreator.cs
similarity index 79%
rename from aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobExecutorProvider.cs
rename to aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobCreator.cs
index eb51520e2..a9fdb09ec 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/QuartzJobCreator.cs
@@ -1,46 +1,50 @@
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Logging.Abstractions;
-using Microsoft.Extensions.Options;
using Quartz;
using System;
-using System.Collections.Generic;
using Volo.Abp.DependencyInjection;
using Volo.Abp.Timing;
namespace LINGYUN.Abp.BackgroundTasks.Quartz;
-public class QuartzJobExecutorProvider : IQuartzJobExecutorProvider, ISingletonDependency
+public class QuartzJobCreator : IQuartzJobCreator, ISingletonDependency
{
- public ILogger Logger { protected get; set; }
+ public ILogger Logger { protected get; set; }
protected IClock Clock { get; }
- protected AbpBackgroundTasksOptions Options { get; }
protected IQuartzKeyBuilder KeyBuilder { get; }
- public QuartzJobExecutorProvider(
+ protected IJobDefinitionManager JobDefinitionManager { get; }
+ public QuartzJobCreator(
IClock clock,
IQuartzKeyBuilder keyBuilder,
- IOptions options)
+ IJobDefinitionManager jobDefinitionManager)
{
Clock = clock;
- Options = options.Value;
KeyBuilder = keyBuilder;
+ JobDefinitionManager = jobDefinitionManager;
- Logger = NullLogger.Instance;
+ Logger = NullLogger.Instance;
}
public IJobDetail CreateJob(JobInfo job)
{
- var jobType = Options.JobProviders.GetOrDefault(job.Type) ?? Type.GetType(job.Type);
+ var jobDefinition = JobDefinitionManager.GetOrNull(job.Type);
+ var jobType = jobDefinition?.JobType ?? Type.GetType(job.Type);
if (jobType == null)
{
- Logger.LogWarning($"The task: {job.Group} - {job.Name}: {job.Type} is not registered and cannot create an instance of the performer type.");
- return null;
- }
+ //Logger.LogWarning($"The task: {job.Group} - {job.Name}: {job.Type} is not registered and cannot create an instance of the performer type.");
+ //return null;
- if (!typeof(IJob).IsAssignableFrom(jobType))
+ // 运行时搜寻本地作业
+ jobType = typeof(QuartzJobSearchJobAdapter);
+ }
+ else
{
- var adapterType = typeof(QuartzJobSimpleAdapter<>);
- jobType = adapterType.MakeGenericType(jobType);
+ if (!typeof(IJob).IsAssignableFrom(jobType))
+ {
+ var adapterType = typeof(QuartzJobSimpleAdapter<>);
+ jobType = adapterType.MakeGenericType(jobType);
+ }
}
// 改为 JobId作为名称
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 913ddee7c..fb3d08356 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
@@ -33,12 +33,14 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency
public override Task JobExecutionVetoed(IJobExecutionContext context, CancellationToken cancellationToken = default)
{
- var jobType = context.JobDetail.JobType;
- if (jobType.IsGenericType)
+ var jobName = context.MergedJobDataMap.Get(nameof(JobInfo.Name))?.ToString();
+ if (jobName.IsNullOrWhiteSpace())
{
- jobType = jobType.GetGenericArguments()[0];
+ var jobType = context.JobDetail.JobType;
+ jobName = !jobType.IsGenericType ? jobType.Name : jobType.GetGenericArguments()[0].Name;
}
- Logger.LogWarning($"The task {jobType.Name} could not be performed...");
+
+ Logger.LogWarning($"The task {jobName} could not be performed...");
return Task.FromResult(-1);
}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobScheduler.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobScheduler.cs
index 891af8266..27065ea90 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobScheduler.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobScheduler.cs
@@ -16,18 +16,18 @@ public class QuartzJobScheduler : IJobScheduler, IJobPublisher, ISingletonDepend
protected IJobStore JobStore { get; }
protected IScheduler Scheduler { get; }
protected IQuartzKeyBuilder KeyBuilder { get; }
- protected IQuartzJobExecutorProvider QuartzJobExecutor { get; }
+ protected IQuartzJobCreator QuartzJobCreator { get; }
public QuartzJobScheduler(
IJobStore jobStore,
IScheduler scheduler,
IQuartzKeyBuilder keyBuilder,
- IQuartzJobExecutorProvider quartzJobExecutor)
+ IQuartzJobCreator quartzJobCreator)
{
JobStore = jobStore;
Scheduler = scheduler;
KeyBuilder = keyBuilder;
- QuartzJobExecutor = quartzJobExecutor;
+ QuartzJobCreator = quartzJobCreator;
}
public virtual async Task ExistsAsync(JobInfo job, CancellationToken cancellationToken = default)
@@ -61,13 +61,13 @@ public class QuartzJobScheduler : IJobScheduler, IJobPublisher, ISingletonDepend
return false;
}
- var jobDetail = QuartzJobExecutor.CreateJob(job);
+ var jobDetail = QuartzJobCreator.CreateJob(job);
if (jobDetail == null)
{
return false;
}
- var jobTrigger = QuartzJobExecutor.CreateTrigger(job);
+ var jobTrigger = QuartzJobCreator.CreateTrigger(job);
if (jobTrigger == null)
{
return false;
@@ -83,13 +83,13 @@ public class QuartzJobScheduler : IJobScheduler, IJobPublisher, ISingletonDepend
var jobDictionary = new Dictionary>();
foreach (var job in jobs)
{
- var jobDetail = QuartzJobExecutor.CreateJob(job);
+ var jobDetail = QuartzJobCreator.CreateJob(job);
if (jobDetail == null)
{
continue;
}
- var jobTrigger = QuartzJobExecutor.CreateTrigger(job);
+ var jobTrigger = QuartzJobCreator.CreateTrigger(job);
if (jobTrigger == null)
{
continue;
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobSearchJobAdapter.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobSearchJobAdapter.cs
new file mode 100644
index 000000000..998f960e4
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobSearchJobAdapter.cs
@@ -0,0 +1,40 @@
+using Microsoft.Extensions.DependencyInjection;
+using Quartz;
+using System.Collections.Immutable;
+using System.Threading.Tasks;
+
+namespace LINGYUN.Abp.BackgroundTasks.Quartz;
+
+public class QuartzJobSearchJobAdapter : IJob
+{
+ protected IServiceScopeFactory ServiceScopeFactory { get; }
+ protected IJobDefinitionManager JobDefinitionManager { get; }
+
+ public QuartzJobSearchJobAdapter(
+ IServiceScopeFactory serviceScopeFactory,
+ IJobDefinitionManager jobDefinitionManager)
+ {
+ ServiceScopeFactory = serviceScopeFactory;
+ JobDefinitionManager = jobDefinitionManager;
+ }
+
+ public async virtual Task Execute(IJobExecutionContext context)
+ {
+ var jobType = context.MergedJobDataMap.GetString(nameof(JobInfo.Type));
+ var jobDefinition = JobDefinitionManager.Get(jobType);
+
+ using var scope = ServiceScopeFactory.CreateScope();
+ var jobExecuter = scope.ServiceProvider.GetRequiredService();
+
+ var jobContext = new JobRunnableContext(
+ jobDefinition.JobType,
+ scope.ServiceProvider,
+ context.MergedJobDataMap.ToImmutableDictionary(),
+ getCache: (key) => context.Get(key),
+ setCache: context.Put);
+
+ await jobExecuter.ExecuteAsync(jobContext);
+
+ context.Result = jobContext.Result;
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzTriggerListener.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzTriggerListener.cs
index 29c095e47..177231fe3 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzTriggerListener.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzTriggerListener.cs
@@ -1,12 +1,11 @@
-using Microsoft.Extensions.Options;
+using Microsoft.Extensions.Logging;
+using Microsoft.Extensions.Logging.Abstractions;
+using Microsoft.Extensions.Options;
using Quartz;
using Quartz.Listener;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
-using System;
-using Microsoft.Extensions.Logging;
-using Microsoft.Extensions.Logging.Abstractions;
namespace LINGYUN.Abp.BackgroundTasks.Quartz;
@@ -36,15 +35,13 @@ public class QuartzTriggerListener : TriggerListenerSupport, ISingletonDependenc
IJobExecutionContext context,
CancellationToken cancellationToken = default)
{
- if (!Options.NodeName.IsNullOrWhiteSpace())
+ context.MergedJobDataMap.TryGetValue(nameof(JobInfo.NodeName), out var jobNode);
+ if (!Equals(Options.NodeName, jobNode))
{
- context.MergedJobDataMap.TryGetValue(nameof(JobInfo.NodeName), out var jobNode);
- if (!Equals(Options.NodeName, jobNode))
- {
- Logger.LogDebug("the job does not belong to the current node and will be ignored by the scheduler.");
- return true;
- }
+ Logger.LogDebug("the job does not belong to the current node and will be ignored by the scheduler.");
+ return true;
}
+
context.MergedJobDataMap.TryGetValue(nameof(JobInfo.Id), out var jobId);
context.MergedJobDataMap.TryGetValue(nameof(JobInfo.LockTimeOut), out var lockTime);
if (jobId != null && lockTime != null && int.TryParse(lockTime.ToString(), out var time) && time > 0)
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN.Abp.BackgroundTasks.csproj b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN.Abp.BackgroundTasks.csproj
index 8f121281f..77983f410 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN.Abp.BackgroundTasks.csproj
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN.Abp.BackgroundTasks.csproj
@@ -8,12 +8,19 @@
+
+
+
+
+
+
+
+
-
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTasksModule.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTasksModule.cs
index 3e46426d3..ee743fa15 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTasksModule.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/AbpBackgroundTasksModule.cs
@@ -5,7 +5,6 @@ using System.Collections.Generic;
using Volo.Abp.Auditing;
using Volo.Abp.BackgroundJobs;
using Volo.Abp.BackgroundWorkers;
-using Volo.Abp.DistributedLocking;
using Volo.Abp.Guids;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
@@ -14,11 +13,9 @@ using Volo.Abp.VirtualFileSystem;
namespace LINGYUN.Abp.BackgroundTasks;
[DependsOn(typeof(AbpAuditingModule))]
-[DependsOn(typeof(AbpLocalizationModule))]
[DependsOn(typeof(AbpBackgroundTasksAbstractionsModule))]
[DependsOn(typeof(AbpBackgroundJobsAbstractionsModule))]
[DependsOn(typeof(AbpBackgroundWorkersModule))]
-[DependsOn(typeof(AbpDistributedLockingAbstractionsModule))]
[DependsOn(typeof(AbpGuidsModule))]
public class AbpBackgroundTasksModule : AbpModule
{
@@ -37,7 +34,7 @@ public class AbpBackgroundTasksModule : AbpModule
Configure(options =>
{
options.Resources
- .Add("en")
+ .Get()
.AddVirtualJson("/LINGYUN/Abp/BackgroundTasks/Localization/Resources");
});
@@ -45,7 +42,6 @@ public class AbpBackgroundTasksModule : AbpModule
{
options.JobMonitors.AddIfNotContains(typeof(JobExecutedEvent));
options.JobMonitors.AddIfNotContains(typeof(JobLogEvent));
- options.JobMonitors.AddIfNotContains(typeof(JobNotifierEvent));
});
}
}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundWorkerAdapter.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundWorkerAdapter.cs
index e45e9210f..1b334742d 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundWorkerAdapter.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundWorkerAdapter.cs
@@ -94,7 +94,7 @@ public class BackgroundWorkerAdapter : BackgroundWorkerBase, IBackgroun
{
if (_doWorkAsyncMethod != null)
{
- await(Task) _doWorkAsyncMethod.Invoke(asyncWorker, new object[] { workerContext });
+ await(Task)_doWorkAsyncMethod.Invoke(asyncWorker, new object[] { workerContext });
}
break;
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/DefaultJobLockProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/DefaultJobLockProvider.cs
similarity index 100%
rename from aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/DefaultJobLockProvider.cs
rename to aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/DefaultJobLockProvider.cs
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobLockProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/IJobLockProvider.cs
similarity index 100%
rename from aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Abstractions/LINGYUN/Abp/BackgroundTasks/IJobLockProvider.cs
rename to aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/IJobLockProvider.cs
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/BackgroundCleaningJob.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/BackgroundCleaningJob.cs
index 3544f3474..b85b7e462 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/BackgroundCleaningJob.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/BackgroundCleaningJob.cs
@@ -7,6 +7,7 @@ using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.BackgroundTasks.Internal;
[DisableAuditing]
+[DisableJobAction]
public class BackgroundCleaningJob : IJobRunnable
{
public virtual async Task ExecuteAsync(JobRunnableContext context)
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/BackgroundPollingJob.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/BackgroundPollingJob.cs
index 0e1fff084..207e15b0b 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/BackgroundPollingJob.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/BackgroundPollingJob.cs
@@ -8,6 +8,7 @@ using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.BackgroundTasks.Internal;
[DisableAuditing]
+[DisableJobAction]
public class BackgroundPollingJob : IJobRunnable
{
public virtual async Task ExecuteAsync(JobRunnableContext context)
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobNotifierEvent.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobNotifierEvent.cs
deleted file mode 100644
index 0ad968f39..000000000
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/Internal/JobNotifierEvent.cs
+++ /dev/null
@@ -1,32 +0,0 @@
-using Microsoft.Extensions.DependencyInjection;
-using Microsoft.Extensions.Logging;
-using System;
-using System.Threading.Tasks;
-using Volo.Abp.DependencyInjection;
-
-namespace LINGYUN.Abp.BackgroundTasks.Internal;
-
-public class JobNotifierEvent : JobEventBase, ITransientDependency
-{
- protected async override Task OnJobAfterExecutedAsync(JobEventContext context)
- {
- try
- {
- var notifier = context.ServiceProvider.GetRequiredService();
- if (context.EventData.Exception != null)
- {
- await notifier.NotifyErrorAsync(context);
- }
- else
- {
- await notifier.NotifySuccessAsync(context);
- }
-
- await notifier.NotifyComplateAsync(context);
- }
- catch (Exception ex)
- {
- Logger.LogWarning($"An exception thow with job notify: {ex.Message}");
- }
- }
-}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/JobRunnableExecuter.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/JobRunnableExecuter.cs
index c16edc041..ae3d8ac7d 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/JobRunnableExecuter.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/JobRunnableExecuter.cs
@@ -1,5 +1,7 @@
using Microsoft.Extensions.DependencyInjection;
using System;
+using System.Collections.Generic;
+using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionCreateDto.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionCreateDto.cs
new file mode 100644
index 000000000..7cc846c80
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionCreateDto.cs
@@ -0,0 +1,14 @@
+using System.ComponentModel.DataAnnotations;
+using Volo.Abp.Validation;
+
+namespace LINGYUN.Abp.TaskManagement;
+
+public class BackgroundJobActionCreateDto : BackgroundJobActionCreateOrUpdateDto
+{
+ ///
+ /// 名称
+ ///
+ [Required]
+ [DynamicStringLength(typeof(BackgroundJobActionConsts), nameof(BackgroundJobActionConsts.MaxNameLength))]
+ public string Name { get; set; }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionCreateOrUpdateDto.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionCreateOrUpdateDto.cs
new file mode 100644
index 000000000..3f291287f
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionCreateOrUpdateDto.cs
@@ -0,0 +1,20 @@
+using Volo.Abp.Data;
+
+namespace LINGYUN.Abp.TaskManagement;
+
+public abstract class BackgroundJobActionCreateOrUpdateDto
+{
+ ///
+ /// 是否启用
+ ///
+ public bool IsEnabled { get; set; }
+ ///
+ /// 参数
+ ///
+ public ExtraPropertyDictionary Paramters { get; set; }
+
+ public BackgroundJobActionCreateOrUpdateDto()
+ {
+ Paramters = new ExtraPropertyDictionary();
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionDefinitionDto.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionDefinitionDto.cs
new file mode 100644
index 000000000..946684def
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionDefinitionDto.cs
@@ -0,0 +1,28 @@
+using LINGYUN.Abp.BackgroundTasks;
+using System.Collections.Generic;
+
+namespace LINGYUN.Abp.TaskManagement;
+
+public class BackgroundJobActionDefinitionDto
+{
+ ///
+ /// 名称
+ ///
+ public string Name { get; set; }
+ ///
+ /// 类型
+ ///
+ public JobActionType Type { get; set; }
+ ///
+ /// 显示名称
+ ///
+ public string DisplayName { get; set; }
+ ///
+ /// 描述
+ ///
+ public string Description { get; set; }
+ ///
+ /// 参数列表
+ ///
+ public IList Paramters { get; set; }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionDto.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionDto.cs
new file mode 100644
index 000000000..6f006fd53
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionDto.cs
@@ -0,0 +1,25 @@
+using System;
+using Volo.Abp.Application.Dtos;
+using Volo.Abp.Data;
+
+namespace LINGYUN.Abp.TaskManagement;
+
+public class BackgroundJobActionDto : EntityDto
+{
+ ///
+ /// 作业标识
+ ///
+ public string JobId { get; set; }
+ ///
+ /// 名称
+ ///
+ public string Name { get; set; }
+ ///
+ /// 是否启用
+ ///
+ public bool IsEnabled { get; set; }
+ ///
+ /// 参数
+ ///
+ public ExtraPropertyDictionary Paramters { get; set; }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionGetDefinitionsInput.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionGetDefinitionsInput.cs
new file mode 100644
index 000000000..2cead394e
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionGetDefinitionsInput.cs
@@ -0,0 +1,8 @@
+using LINGYUN.Abp.BackgroundTasks;
+
+namespace LINGYUN.Abp.TaskManagement;
+
+public class BackgroundJobActionGetDefinitionsInput
+{
+ public JobActionType? Type { get; set; }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionParamterDto.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionParamterDto.cs
new file mode 100644
index 000000000..fcf6f8254
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionParamterDto.cs
@@ -0,0 +1,9 @@
+namespace LINGYUN.Abp.TaskManagement;
+
+public class BackgroundJobActionParamterDto
+{
+ public string Name { get; set; }
+ public bool Required { get; set; }
+ public string DisplayName { get; set; }
+ public string Description { get; set; }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionUpdateDto.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionUpdateDto.cs
new file mode 100644
index 000000000..09ec625ea
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobActionUpdateDto.cs
@@ -0,0 +1,5 @@
+namespace LINGYUN.Abp.TaskManagement;
+
+public class BackgroundJobActionUpdateDto : BackgroundJobActionCreateOrUpdateDto
+{
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobDefinitionDto.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobDefinitionDto.cs
new file mode 100644
index 000000000..58acc7a46
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobDefinitionDto.cs
@@ -0,0 +1,14 @@
+using System.Collections.Generic;
+
+namespace LINGYUN.Abp.TaskManagement;
+
+public class BackgroundJobDefinitionDto
+{
+ public string Name { get; set; }
+
+ public string DisplayName { get; set; }
+
+ public string Description { get; set; }
+
+ public List Paramters { get; set; } = new List();
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobParamterDto.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobParamterDto.cs
new file mode 100644
index 000000000..bcc15dcd7
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/BackgroundJobParamterDto.cs
@@ -0,0 +1,12 @@
+namespace LINGYUN.Abp.TaskManagement;
+
+public class BackgroundJobParamterDto
+{
+ public string Name { get; set; }
+
+ public bool Required { get; set; }
+
+ public string DisplayName { get; set; }
+
+ public string Description { get; set; }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/IBackgroundJobActionAppService.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/IBackgroundJobActionAppService.cs
new file mode 100644
index 000000000..6a320eccc
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/IBackgroundJobActionAppService.cs
@@ -0,0 +1,19 @@
+using System;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Dtos;
+using Volo.Abp.Application.Services;
+
+namespace LINGYUN.Abp.TaskManagement;
+
+public interface IBackgroundJobActionAppService : IApplicationService
+{
+ Task AddActionAsync(string jobId, BackgroundJobActionCreateDto input);
+
+ Task UpdateActionAsync(Guid id, BackgroundJobActionUpdateDto input);
+
+ Task DeleteActionAsync(Guid id);
+
+ Task> GetActionsAsync(string jobId);
+
+ Task> GetDefinitionsAsync(BackgroundJobActionGetDefinitionsInput input);
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/IBackgroundJobInfoAppService.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/IBackgroundJobInfoAppService.cs
index 2ec0a4f22..bf998224d 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/IBackgroundJobInfoAppService.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/IBackgroundJobInfoAppService.cs
@@ -1,5 +1,5 @@
-using System;
-using System.Threading.Tasks;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.TaskManagement;
@@ -33,4 +33,6 @@ public interface IBackgroundJobInfoAppService :
Task BulkResumeAsync(BackgroundJobInfoBatchInput input);
Task BulkPauseAsync(BackgroundJobInfoBatchInput input);
+
+ Task> GetDefinitionsAsync();
}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/Permissions/TaskManagementPermissionDefinitionProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/Permissions/TaskManagementPermissionDefinitionProvider.cs
index 6e4985ed9..8706e3cbf 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/Permissions/TaskManagementPermissionDefinitionProvider.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/Permissions/TaskManagementPermissionDefinitionProvider.cs
@@ -42,6 +42,9 @@ public class TaskManagementPermissionDefinitionProvider : PermissionDefinitionPr
backgroundJobs.AddChild(
TaskManagementPermissions.BackgroundJobs.ManageSystemJobs,
L("Permissions:ManageSystemJobs"));
+ backgroundJobs.AddChild(
+ TaskManagementPermissions.BackgroundJobs.ManageActions,
+ L("Permissions:ManageActions"));
var backgroundJobLogs = group.AddPermission(
TaskManagementPermissions.BackgroundJobLogs.Default,
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/Permissions/TaskManagementPermissions.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/Permissions/TaskManagementPermissions.cs
index 85f84bebd..eb9e9b63f 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/Permissions/TaskManagementPermissions.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application.Contracts/LINGYUN/Abp/TaskManagement/Permissions/TaskManagementPermissions.cs
@@ -20,6 +20,10 @@ public static class TaskManagementPermissions
/// 通常内置作业是由程序运行中产生,需要控制用户行为
///
public const string ManageSystemJobs = Default + ".ManageSystemJobs";
+ ///
+ /// 管理作业行为
+ ///
+ public const string ManageActions = Default + ".ManageActions";
}
public static class BackgroundJobLogs
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application/LINGYUN/Abp/TaskManagement/BackgroundJobActionAppService.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application/LINGYUN/Abp/TaskManagement/BackgroundJobActionAppService.cs
new file mode 100644
index 000000000..8771c23a9
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application/LINGYUN/Abp/TaskManagement/BackgroundJobActionAppService.cs
@@ -0,0 +1,105 @@
+using LINGYUN.Abp.BackgroundTasks.Activities;
+using LINGYUN.Abp.TaskManagement.Permissions;
+using Microsoft.AspNetCore.Authorization;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading.Tasks;
+using Volo.Abp.Application.Dtos;
+
+namespace LINGYUN.Abp.TaskManagement;
+
+[Authorize(TaskManagementPermissions.BackgroundJobs.ManageActions)]
+public class BackgroundJobActionAppService : TaskManagementApplicationService, IBackgroundJobActionAppService
+{
+ protected IJobActionDefinitionManager JobActionDefinitionManager { get; }
+ protected IBackgroundJobInfoRepository BackgroundJobInfoRepository { get; }
+ protected IBackgroundJobActionRepository BackgroundJobActionRepository { get; }
+
+ public BackgroundJobActionAppService(
+ IJobActionDefinitionManager jobActionDefinitionManager,
+ IBackgroundJobInfoRepository backgroundJobInfoRepository,
+ IBackgroundJobActionRepository backgroundJobActionRepository)
+ {
+ JobActionDefinitionManager = jobActionDefinitionManager;
+ BackgroundJobInfoRepository = backgroundJobInfoRepository;
+ BackgroundJobActionRepository = backgroundJobActionRepository;
+ }
+
+ public async virtual Task AddActionAsync(string jobId, BackgroundJobActionCreateDto input)
+ {
+ var job = await BackgroundJobInfoRepository.GetAsync(jobId);
+
+ var action = new BackgroundJobAction(
+ GuidGenerator.Create(),
+ job.Id,
+ input.Name,
+ input.Paramters,
+ CurrentTenant.Id)
+ {
+ IsEnabled = input.IsEnabled,
+ };
+
+ action = await BackgroundJobActionRepository.InsertAsync(action);
+
+ await CurrentUnitOfWork.SaveChangesAsync();
+
+ return ObjectMapper.Map(action);
+ }
+
+ public async virtual Task DeleteActionAsync(Guid id)
+ {
+ var action = await BackgroundJobActionRepository.GetAsync(id);
+
+ await BackgroundJobActionRepository.DeleteAsync(action);
+
+ await CurrentUnitOfWork.SaveChangesAsync();
+ }
+
+ public async virtual Task> GetActionsAsync(string jobId)
+ {
+ var actions = await BackgroundJobActionRepository.GetListAsync(jobId);
+
+ return new ListResultDto(
+ ObjectMapper.Map, List>(actions));
+ }
+
+ public virtual Task> GetDefinitionsAsync(BackgroundJobActionGetDefinitionsInput input)
+ {
+ var actionDefinitions = JobActionDefinitionManager.GetAll();
+
+
+ var dtoList = actionDefinitions
+ .WhereIf(input.Type.HasValue, action => action.Type == input.Type.Value)
+ .Select(action => new BackgroundJobActionDefinitionDto
+ {
+ Name = action.Name,
+ Type = action.Type,
+ DisplayName = action.DisplayName.Localize(StringLocalizerFactory),
+ Description = action.Description?.Localize(StringLocalizerFactory),
+ Paramters = action.Paramters.Select(p => new BackgroundJobActionParamterDto
+ {
+ Name = p.Name,
+ Required = p.Required,
+ DisplayName = p.DisplayName.Localize(StringLocalizerFactory),
+ Description = p.Description?.Localize(StringLocalizerFactory),
+ }).ToList(),
+ }).ToList();
+
+ return Task.FromResult(new ListResultDto(dtoList));
+ }
+
+ public async virtual Task UpdateActionAsync(Guid id, BackgroundJobActionUpdateDto input)
+ {
+ var action = await BackgroundJobActionRepository.GetAsync(id);
+
+ action.IsEnabled = input.IsEnabled;
+ action.Paramters = input.Paramters;
+
+ action = await BackgroundJobActionRepository.UpdateAsync(action);
+
+ await CurrentUnitOfWork.SaveChangesAsync();
+
+ return ObjectMapper.Map(action);
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application/LINGYUN/Abp/TaskManagement/BackgroundJobInfoAppService.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application/LINGYUN/Abp/TaskManagement/BackgroundJobInfoAppService.cs
index c3a36539c..1911f943f 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application/LINGYUN/Abp/TaskManagement/BackgroundJobInfoAppService.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application/LINGYUN/Abp/TaskManagement/BackgroundJobInfoAppService.cs
@@ -16,20 +16,54 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
{
protected AbpBackgroundTasksOptions Options { get; }
protected BackgroundJobManager BackgroundJobManager { get; }
+ protected IJobDefinitionManager JobDefinitionManager { get; }
protected IBackgroundJobInfoRepository BackgroundJobInfoRepository { get; }
public BackgroundJobInfoAppService(
BackgroundJobManager backgroundJobManager,
+ IJobDefinitionManager jobDefinitionManager,
IBackgroundJobInfoRepository backgroundJobInfoRepository,
IOptions options)
{
BackgroundJobManager = backgroundJobManager;
+ JobDefinitionManager = jobDefinitionManager;
BackgroundJobInfoRepository = backgroundJobInfoRepository;
Options = options.Value;
}
+ public virtual Task> GetDefinitionsAsync()
+ {
+ var jobs = new List();
+
+ foreach (var jobDefinition in JobDefinitionManager.GetAll())
+ {
+ var job = new BackgroundJobDefinitionDto
+ {
+ Name = jobDefinition.Name,
+ DisplayName = jobDefinition.DisplayName.Localize(StringLocalizerFactory),
+ Description = jobDefinition.Description?.Localize(StringLocalizerFactory),
+ };
+
+ foreach (var jobParamter in jobDefinition.Paramters)
+ {
+ job.Paramters.Add(
+ new BackgroundJobParamterDto
+ {
+ Name = jobParamter.Name,
+ Required = jobParamter.Required,
+ DisplayName = jobParamter.DisplayName.Localize(StringLocalizerFactory),
+ Description = jobParamter.Description?.Localize(StringLocalizerFactory),
+ });
+ }
+
+ jobs.Add(job);
+ }
+
+ return Task.FromResult(new ListResultDto(jobs));
+ }
+
[Authorize(TaskManagementPermissions.BackgroundJobs.Create)]
- public virtual async Task CreateAsync(BackgroundJobInfoCreateDto input)
+ public async virtual Task CreateAsync(BackgroundJobInfoCreateDto input)
{
if (await BackgroundJobInfoRepository.CheckNameAsync(input.Group, input.Name))
{
@@ -64,7 +98,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Delete)]
- public virtual async Task DeleteAsync(string id)
+ public async virtual Task DeleteAsync(string id)
{
var backgroundJobInfo = await BackgroundJobInfoRepository.GetAsync(id);
@@ -73,14 +107,14 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
await BackgroundJobManager.DeleteAsync(backgroundJobInfo);
}
- public virtual async Task GetAsync(string id)
+ public async virtual Task GetAsync(string id)
{
var backgroundJobInfo = await BackgroundJobInfoRepository.GetAsync(id);
return ObjectMapper.Map(backgroundJobInfo);
}
- public virtual async Task> GetListAsync(BackgroundJobInfoGetListInput input)
+ public async virtual Task> GetListAsync(BackgroundJobInfoGetListInput input)
{
var filter = new BackgroundJobInfoFilter
{
@@ -109,7 +143,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Pause)]
- public virtual async Task PauseAsync(string id)
+ public async virtual Task PauseAsync(string id)
{
var backgroundJobInfo = await BackgroundJobInfoRepository.GetAsync(id);
@@ -119,7 +153,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Resume)]
- public virtual async Task ResumeAsync(string id)
+ public async virtual Task ResumeAsync(string id)
{
var backgroundJobInfo = await BackgroundJobInfoRepository.GetAsync(id);
@@ -129,7 +163,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Trigger)]
- public virtual async Task TriggerAsync(string id)
+ public async virtual Task TriggerAsync(string id)
{
var backgroundJobInfo = await BackgroundJobInfoRepository.GetAsync(id);
@@ -139,7 +173,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Stop)]
- public virtual async Task StopAsync(string id)
+ public async virtual Task StopAsync(string id)
{
var backgroundJobInfo = await BackgroundJobInfoRepository.GetAsync(id);
@@ -149,7 +183,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Start)]
- public virtual async Task StartAsync(string id)
+ public async virtual Task StartAsync(string id)
{
var backgroundJobInfo = await BackgroundJobInfoRepository.GetAsync(id);
@@ -159,7 +193,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Update)]
- public virtual async Task UpdateAsync(string id, BackgroundJobInfoUpdateDto input)
+ public async virtual Task UpdateAsync(string id, BackgroundJobInfoUpdateDto input)
{
var backgroundJobInfo = await BackgroundJobInfoRepository.GetAsync(id);
@@ -177,7 +211,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Delete)]
- public virtual async Task BulkDeleteAsync(BackgroundJobInfoBatchInput input)
+ public async virtual Task BulkDeleteAsync(BackgroundJobInfoBatchInput input)
{
if (!input.JobIds.Any())
{
@@ -194,7 +228,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Stop)]
- public virtual async Task BulkStopAsync(BackgroundJobInfoBatchInput input)
+ public async virtual Task BulkStopAsync(BackgroundJobInfoBatchInput input)
{
if (!input.JobIds.Any())
{
@@ -211,7 +245,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Start)]
- public virtual async Task BulkStartAsync(BackgroundJobInfoBatchInput input)
+ public async virtual Task BulkStartAsync(BackgroundJobInfoBatchInput input)
{
if (!input.JobIds.Any())
{
@@ -228,7 +262,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Trigger)]
- public virtual async Task BulkTriggerAsync(BackgroundJobInfoBatchInput input)
+ public async virtual Task BulkTriggerAsync(BackgroundJobInfoBatchInput input)
{
if (!input.JobIds.Any())
{
@@ -245,7 +279,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Resume)]
- public virtual async Task BulkResumeAsync(BackgroundJobInfoBatchInput input)
+ public async virtual Task BulkResumeAsync(BackgroundJobInfoBatchInput input)
{
if (!input.JobIds.Any())
{
@@ -262,7 +296,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
}
[Authorize(TaskManagementPermissions.BackgroundJobs.Pause)]
- public virtual async Task BulkPauseAsync(BackgroundJobInfoBatchInput input)
+ public async virtual Task BulkPauseAsync(BackgroundJobInfoBatchInput input)
{
if (!input.JobIds.Any())
{
@@ -278,7 +312,7 @@ public class BackgroundJobInfoAppService : TaskManagementApplicationService, IBa
await BackgroundJobManager.BulkPauseAsync(jobs);
}
- protected virtual async Task> GetListAsync(BackgroundJobInfoBatchInput input)
+ protected async virtual Task> GetListAsync(BackgroundJobInfoBatchInput input)
{
var quaryble = await BackgroundJobInfoRepository.GetQueryableAsync();
quaryble = quaryble.Where(x => input.JobIds.Contains(x.Id));
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application/LINGYUN/Abp/TaskManagement/TaskManagementApplicationMapperProfile.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application/LINGYUN/Abp/TaskManagement/TaskManagementApplicationMapperProfile.cs
index f250cfe5a..634871150 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application/LINGYUN/Abp/TaskManagement/TaskManagementApplicationMapperProfile.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Application/LINGYUN/Abp/TaskManagement/TaskManagementApplicationMapperProfile.cs
@@ -8,5 +8,6 @@ public class TaskManagementApplicationMapperProfile : Profile
{
CreateMap();
CreateMap();
+ CreateMap();
}
}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/BackgroundJobActionConsts.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/BackgroundJobActionConsts.cs
new file mode 100644
index 000000000..26ad48c8d
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/BackgroundJobActionConsts.cs
@@ -0,0 +1,8 @@
+namespace LINGYUN.Abp.TaskManagement;
+
+public static class BackgroundJobActionConsts
+{
+ public static int MaxJobIdLength { get; set; } = 255;
+
+ public static int MaxNameLength { get; set; } = 100;
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/en.json b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/en.json
index 0360c6b6b..3743ad687 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/en.json
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/en.json
@@ -12,6 +12,7 @@
"Permissions:StartJob": "Start Job",
"Permissions:StopJob": "Stop Job",
"Permissions:ManageSystemJobs": "Manage System Jobs",
+ "Permissions:ManageActions": "Manage Job Actions",
"Permissions:BackgroundJobLogs": "BackgroundJobs Logs",
"Permissions:DeleteJobLogs": "Delete Job Logs",
"TaskManagement:01000": "A job named {Name} already exists in the Group {Group}!",
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/zh-Hans.json b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/zh-Hans.json
index a29f2c6e3..fc39294f0 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/zh-Hans.json
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain.Shared/LINGYUN/Abp/TaskManagement/Localization/Resources/zh-Hans.json
@@ -12,6 +12,7 @@
"Permissions:StartJob": "启动作业",
"Permissions:StopJob": "停止作业",
"Permissions:ManageSystemJobs": "管理系统作业",
+ "Permissions:ManageActions": "管理作业行为",
"Permissions:BackgroundJobLogs": "日志管理",
"Permissions:DeleteJobLogs": "删除作业日志",
"TaskManagement:01000": "分组 {Group} 中已经存在一个名称为 {Name} 的作业!",
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 8cdcef31c..a850d09e0 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/BackgroundJobAction.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobAction.cs
new file mode 100644
index 000000000..0b78dd1ce
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobAction.cs
@@ -0,0 +1,48 @@
+using System;
+using System.Collections.Generic;
+using Volo.Abp;
+using Volo.Abp.Data;
+using Volo.Abp.Domain.Entities.Auditing;
+using Volo.Abp.MultiTenancy;
+
+namespace LINGYUN.Abp.TaskManagement;
+
+public class BackgroundJobAction : AuditedAggregateRoot, IMultiTenant
+{
+ public virtual Guid? TenantId { get; protected set; }
+ ///
+ /// 作业标识
+ ///
+ public virtual string JobId { get; protected set; }
+ ///
+ /// 名称
+ ///
+ public virtual string Name { get; protected set; }
+ ///
+ /// 是否启用
+ ///
+ public virtual bool IsEnabled { get; set; }
+ ///
+ /// 参数
+ ///
+ public virtual ExtraPropertyDictionary Paramters { get; set; }
+
+ protected BackgroundJobAction() { }
+
+ public BackgroundJobAction(
+ Guid id,
+ string jobId,
+ string name,
+ IDictionary paramters,
+ Guid? tenantId = null) : base(id)
+ {
+ JobId = Check.NotNullOrWhiteSpace(jobId, nameof(jobId), BackgroundJobActionConsts.MaxJobIdLength);
+ Name = Check.NotNullOrWhiteSpace(name, nameof(name), BackgroundJobActionConsts.MaxNameLength);
+ TenantId = tenantId;
+
+ IsEnabled = true;
+
+ Paramters = new ExtraPropertyDictionary();
+ Paramters.AddIfNotContains(paramters);
+ }
+}
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 2bcc98f46..d1ae8ec47 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
@@ -1,5 +1,4 @@
using LINGYUN.Abp.BackgroundTasks;
-using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Threading;
@@ -20,34 +19,30 @@ public class BackgroundJobStore : IJobStore, ITransientDependency
protected IBackgroundJobInfoRepository JobInfoRepository { get; }
protected IBackgroundJobLogRepository JobLogRepository { get; }
- protected AbpBackgroundTasksOptions Options { get; }
-
public BackgroundJobStore(
IObjectMapper objectMapper,
ICurrentTenant currentTenant,
IUnitOfWorkManager unitOfWorkManager,
IBackgroundJobInfoRepository jobInfoRepository,
- IBackgroundJobLogRepository jobLogRepository,
- IOptions options)
+ IBackgroundJobLogRepository jobLogRepository)
{
ObjectMapper = objectMapper;
CurrentTenant = currentTenant;
UnitOfWorkManager = unitOfWorkManager;
JobInfoRepository = jobInfoRepository;
JobLogRepository = jobLogRepository;
- Options = options.Value;
}
public async virtual Task> GetAllPeriodTasksAsync(CancellationToken cancellationToken = default)
{
- var jobInfos = await JobInfoRepository.GetAllPeriodTasksAsync(Options.NodeName, cancellationToken);
+ var jobInfos = await JobInfoRepository.GetAllPeriodTasksAsync(cancellationToken);
return ObjectMapper.Map, List>(jobInfos);
}
public async virtual Task> GetWaitingListAsync(int maxResultCount, CancellationToken cancellationToken = default)
{
- var jobInfos = await JobInfoRepository.GetWaitingListAsync(Options.NodeName, maxResultCount, cancellationToken);
+ var jobInfos = await JobInfoRepository.GetWaitingListAsync(maxResultCount, cancellationToken);
return ObjectMapper.Map, List>(jobInfos);
}
@@ -162,7 +157,6 @@ public class BackgroundJobStore : IJobStore, ITransientDependency
{
using var unitOfWork = UnitOfWorkManager.Begin();
var jobs = await JobInfoRepository.GetExpiredJobsAsync(
- Options.NodeName,
maxResultCount,
jobExpiratime,
cancellationToken);
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/IBackgroundJobActionRepository.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/IBackgroundJobActionRepository.cs
new file mode 100644
index 000000000..28b51ca1b
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/IBackgroundJobActionRepository.cs
@@ -0,0 +1,15 @@
+using System;
+using System.Collections.Generic;
+using System.Threading;
+using System.Threading.Tasks;
+using Volo.Abp.Domain.Repositories;
+
+namespace LINGYUN.Abp.TaskManagement;
+
+public interface IBackgroundJobActionRepository : IRepository
+{
+ Task> GetListAsync(
+ string jobId,
+ bool? isEnabled = null,
+ CancellationToken cancellationToken = default);
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/IBackgroundJobInfoRepository.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/IBackgroundJobInfoRepository.cs
index f02f59794..603d66c1f 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/IBackgroundJobInfoRepository.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/IBackgroundJobInfoRepository.cs
@@ -27,13 +27,11 @@ public interface IBackgroundJobInfoRepository : IRepository
/// 获取过期任务列表
///
- ///
///
///
///
///
Task> GetExpiredJobsAsync(
- string nodeName,
int maxResultCount,
TimeSpan jobExpiratime,
CancellationToken cancellationToken = default);
@@ -41,20 +39,16 @@ public interface IBackgroundJobInfoRepository : IRepository
- ///
///
Task> GetAllPeriodTasksAsync(
- string nodeName,
CancellationToken cancellationToken = default);
///
/// 获取等待入队的任务列表
///
- ///
///
///
///
Task> GetWaitingListAsync(
- string nodeName,
int maxResultCount,
CancellationToken cancellationToken = default);
///
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/JobActionStore.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/JobActionStore.cs
new file mode 100644
index 000000000..31eba33f4
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/JobActionStore.cs
@@ -0,0 +1,31 @@
+using LINGYUN.Abp.BackgroundTasks.Activities;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Volo.Abp.DependencyInjection;
+
+namespace LINGYUN.Abp.TaskManagement;
+
+[Dependency(ReplaceServices = true)]
+public class JobActionStore : IJobActionStore, ITransientDependency
+{
+ private readonly IBackgroundJobActionRepository _backgroundJobActionRepository;
+
+ public JobActionStore(
+ IBackgroundJobActionRepository backgroundJobActionRepository)
+ {
+ _backgroundJobActionRepository = backgroundJobActionRepository;
+ }
+
+ public async virtual Task> GetActionsAsync(string id, CancellationToken cancellationToken = default)
+ {
+ var jobActions = await _backgroundJobActionRepository.GetListAsync(id, true, cancellationToken);
+
+ return jobActions.Select(action => new JobAction
+ {
+ Name = action.Name,
+ Paramters = action.Paramters
+ }).ToList();
+ }
+}
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 92d7bcb9a..37c022960 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,4 +1,5 @@
using LINGYUN.Abp.BackgroundTasks;
+using LINGYUN.Abp.BackgroundTasks.Activities;
using LINGYUN.Abp.BackgroundTasks.EventBus;
using Microsoft.Extensions.DependencyInjection;
using Volo.Abp.AutoMapper;
@@ -13,6 +14,7 @@ namespace LINGYUN.Abp.TaskManagement;
[DependsOn(typeof(AbpDddDomainModule))]
[DependsOn(typeof(AbpBackgroundTasksModule))]
[DependsOn(typeof(AbpBackgroundTasksEventBusModule))]
+[DependsOn(typeof(AbpBackgroundTasksActivitiesModule))]
public class TaskManagementDomainModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobActionRepository.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobActionRepository.cs
new file mode 100644
index 000000000..5a5967f9f
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobActionRepository.cs
@@ -0,0 +1,31 @@
+using Microsoft.EntityFrameworkCore;
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Threading;
+using System.Threading.Tasks;
+using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
+using Volo.Abp.EntityFrameworkCore;
+
+namespace LINGYUN.Abp.TaskManagement.EntityFrameworkCore;
+public class EfCoreBackgroundJobActionRepository :
+ EfCoreRepository,
+ IBackgroundJobActionRepository
+{
+ public EfCoreBackgroundJobActionRepository(
+ IDbContextProvider dbContextProvider)
+ : base(dbContextProvider)
+ {
+ }
+
+ public async virtual Task> GetListAsync(
+ string jobId,
+ bool? isEnabled = null,
+ CancellationToken cancellationToken = default)
+ {
+ return await (await GetDbSetAsync())
+ .Where(x => x.JobId.Equals(jobId))
+ .WhereIf(isEnabled.HasValue, x => x.IsEnabled == isEnabled.Value)
+ .ToListAsync(GetCancellationToken(cancellationToken));
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobInfoRepository.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobInfoRepository.cs
index 9b86a16e4..f63725a14 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobInfoRepository.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobInfoRepository.cs
@@ -76,7 +76,6 @@ public class EfCoreBackgroundJobInfoRepository :
}
public virtual async Task> GetExpiredJobsAsync(
- string nodeName,
int maxResultCount,
TimeSpan jobExpiratime,
CancellationToken cancellationToken = default)
@@ -84,7 +83,6 @@ public class EfCoreBackgroundJobInfoRepository :
var expiratime = Clock.Now - jobExpiratime;
return await (await GetDbSetAsync())
- .Where(x => x.NodeName == nodeName)
.Where(x => x.Status == JobStatus.Completed &&
DateTime.Compare(x.LastRunTime.Value, expiratime) <= 0)
.OrderBy(x => x.CreationTime)
@@ -93,13 +91,11 @@ public class EfCoreBackgroundJobInfoRepository :
}
public virtual async Task> GetAllPeriodTasksAsync(
- string nodeName,
CancellationToken cancellationToken = default)
{
var status = new JobStatus[] { JobStatus.Running, JobStatus.FailedRetry };
return await (await GetDbSetAsync())
- .Where(x => x.NodeName == nodeName)
.Where(x => x.IsEnabled && !x.IsAbandoned)
.Where(x => x.JobType == JobType.Period && status.Contains(x.Status))
.Where(x => (x.MaxCount == 0 || x.TriggerCount < x.MaxCount) || (x.MaxTryCount == 0 || x.TryCount < x.MaxTryCount))
@@ -123,7 +119,6 @@ public class EfCoreBackgroundJobInfoRepository :
}
public virtual async Task> GetWaitingListAsync(
- string nodeName,
int maxResultCount,
CancellationToken cancellationToken = default)
{
@@ -131,7 +126,6 @@ public class EfCoreBackgroundJobInfoRepository :
var status = new JobStatus[] { JobStatus.Running, JobStatus.FailedRetry };
return await (await GetDbSetAsync())
- .Where(x => x.NodeName == nodeName)
.Where(x => x.IsEnabled && !x.IsAbandoned)
.Where(x => x.JobType != JobType.Period && status.Contains(x.Status))
.Where(x => (x.MaxCount == 0 || x.TriggerCount < x.MaxCount) || (x.MaxTryCount == 0 || x.TryCount < x.MaxTryCount))
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/TaskManagementDbContextModelCreatingExtensions.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/TaskManagementDbContextModelCreatingExtensions.cs
index 2a677e917..27c741f84 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/TaskManagementDbContextModelCreatingExtensions.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/TaskManagementDbContextModelCreatingExtensions.cs
@@ -91,5 +91,28 @@ public static class TaskManagementDbContextModelCreatingExtensions
b.HasIndex(p => new { p.JobGroup, p.JobName });
});
+
+ builder.Entity(b =>
+ {
+ b.ToTable(options.TablePrefix + "BackgroundJobActions", options.Schema);
+
+ b.Property(p => p.JobId)
+ .HasColumnName(nameof(BackgroundJobAction.JobId))
+ .HasMaxLength(BackgroundJobActionConsts.MaxJobIdLength)
+ .IsRequired(true);
+ b.Property(p => p.Name)
+ .HasColumnName(nameof(BackgroundJobAction.Name))
+ .HasMaxLength(BackgroundJobActionConsts.MaxNameLength)
+ .IsRequired(true);
+
+ b.Property(p => p.Paramters)
+ .HasColumnName(nameof(BackgroundJobAction.Paramters))
+ .HasConversion(new ExtraPropertiesValueConverter(b.Metadata.ClrType))
+ .Metadata.SetValueComparer(new ExtraPropertyDictionaryValueComparer());
+
+ b.ConfigureByConvention();
+
+ b.HasIndex(p => p.Name);
+ });
}
}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/TaskManagementEntityFrameworkCoreModule.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/TaskManagementEntityFrameworkCoreModule.cs
index f2edc4178..13e6d0111 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/TaskManagementEntityFrameworkCoreModule.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/TaskManagementEntityFrameworkCoreModule.cs
@@ -14,6 +14,7 @@ public class TaskManagementEntityFrameworkCoreModule : AbpModule
{
options.AddRepository();
options.AddRepository();
+ options.AddRepository();
});
}
}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.HttpApi/LINGYUN/Abp/TaskManagement/BackgroundJobActionController.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.HttpApi/LINGYUN/Abp/TaskManagement/BackgroundJobActionController.cs
new file mode 100644
index 000000000..abe9108db
--- /dev/null
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.HttpApi/LINGYUN/Abp/TaskManagement/BackgroundJobActionController.cs
@@ -0,0 +1,59 @@
+using LINGYUN.Abp.TaskManagement.Permissions;
+using Microsoft.AspNetCore.Authorization;
+using Microsoft.AspNetCore.Mvc;
+using System;
+using System.Threading.Tasks;
+using Volo.Abp;
+using Volo.Abp.Application.Dtos;
+
+namespace LINGYUN.Abp.TaskManagement;
+
+[RemoteService(Name = TaskManagementRemoteServiceConsts.RemoteServiceName)]
+[Area(TaskManagementRemoteServiceConsts.ModuleName)]
+[Authorize(TaskManagementPermissions.BackgroundJobs.ManageActions)]
+[Route($"api/{TaskManagementRemoteServiceConsts.ModuleName}/background-jobs/actions")]
+public class BackgroundJobActionController : TaskManagementController, IBackgroundJobActionAppService
+{
+ protected IBackgroundJobActionAppService Service { get; }
+
+ public BackgroundJobActionController(
+ IBackgroundJobActionAppService service)
+ {
+ Service = service;
+ }
+
+ [HttpPost]
+ [Route("{jobId}")]
+ public Task AddActionAsync(string jobId, BackgroundJobActionCreateDto input)
+ {
+ return Service.AddActionAsync(jobId, input);
+ }
+
+ [HttpDelete]
+ [Route("{id}")]
+ public Task DeleteActionAsync(Guid id)
+ {
+ return Service.DeleteActionAsync(id);
+ }
+
+ [HttpGet]
+ [Route("{jobId}")]
+ public Task> GetActionsAsync(string jobId)
+ {
+ return Service.GetActionsAsync(jobId);
+ }
+
+ [HttpGet]
+ [Route("definitions")]
+ public Task> GetDefinitionsAsync(BackgroundJobActionGetDefinitionsInput input)
+ {
+ return Service.GetDefinitionsAsync(input);
+ }
+
+ [HttpPut]
+ [Route("{id}")]
+ public Task UpdateActionAsync(Guid id, BackgroundJobActionUpdateDto input)
+ {
+ return Service.UpdateActionAsync(id, input);
+ }
+}
diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.HttpApi/LINGYUN/Abp/TaskManagement/BackgroundJobInfoController.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.HttpApi/LINGYUN/Abp/TaskManagement/BackgroundJobInfoController.cs
index f8b8a9605..162b6db46 100644
--- a/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.HttpApi/LINGYUN/Abp/TaskManagement/BackgroundJobInfoController.cs
+++ b/aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.HttpApi/LINGYUN/Abp/TaskManagement/BackgroundJobInfoController.cs
@@ -1,7 +1,6 @@
using LINGYUN.Abp.TaskManagement.Permissions;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
-using System;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
@@ -24,7 +23,7 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpPost]
[Authorize(TaskManagementPermissions.BackgroundJobs.Create)]
- public Task CreateAsync(BackgroundJobInfoCreateDto input)
+ public virtual Task CreateAsync(BackgroundJobInfoCreateDto input)
{
return BackgroundJobInfoAppService.CreateAsync(input);
}
@@ -32,20 +31,20 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpDelete]
[Route("{id}")]
[Authorize(TaskManagementPermissions.BackgroundJobs.Delete)]
- public Task DeleteAsync(string id)
+ public virtual Task DeleteAsync(string id)
{
return BackgroundJobInfoAppService.DeleteAsync(id);
}
[HttpGet]
[Route("{id}")]
- public Task GetAsync(string id)
+ public virtual Task GetAsync(string id)
{
return BackgroundJobInfoAppService.GetAsync(id);
}
[HttpGet]
- public Task> GetListAsync(BackgroundJobInfoGetListInput input)
+ public virtual Task> GetListAsync(BackgroundJobInfoGetListInput input)
{
return BackgroundJobInfoAppService.GetListAsync(input);
}
@@ -53,7 +52,7 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpPut]
[Route("{id}/pause")]
[Authorize(TaskManagementPermissions.BackgroundJobs.Pause)]
- public Task PauseAsync(string id)
+ public virtual Task PauseAsync(string id)
{
return BackgroundJobInfoAppService.PauseAsync(id);
}
@@ -61,7 +60,7 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpPut]
[Route("{id}/resume")]
[Authorize(TaskManagementPermissions.BackgroundJobs.Resume)]
- public Task ResumeAsync(string id)
+ public virtual Task ResumeAsync(string id)
{
return BackgroundJobInfoAppService.ResumeAsync(id);
}
@@ -69,7 +68,7 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpPut]
[Route("{id}/trigger")]
[Authorize(TaskManagementPermissions.BackgroundJobs.Trigger)]
- public Task TriggerAsync(string id)
+ public virtual Task TriggerAsync(string id)
{
return BackgroundJobInfoAppService.TriggerAsync(id);
}
@@ -77,7 +76,7 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpPut]
[Route("{id}/stop")]
[Authorize(TaskManagementPermissions.BackgroundJobs.Stop)]
- public Task StopAsync(string id)
+ public virtual Task StopAsync(string id)
{
return BackgroundJobInfoAppService.StopAsync(id);
}
@@ -85,7 +84,7 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpPut]
[Route("{id}")]
[Authorize(TaskManagementPermissions.BackgroundJobs.Update)]
- public Task UpdateAsync(string id, BackgroundJobInfoUpdateDto input)
+ public virtual Task UpdateAsync(string id, BackgroundJobInfoUpdateDto input)
{
return BackgroundJobInfoAppService.UpdateAsync(id, input);
}
@@ -93,7 +92,7 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpPut]
[Route("{id}/start")]
[Authorize(TaskManagementPermissions.BackgroundJobs.Start)]
- public Task StartAsync(string id)
+ public virtual Task StartAsync(string id)
{
return BackgroundJobInfoAppService.StartAsync(id);
}
@@ -101,7 +100,7 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpPut]
[Route("bulk-stop")]
[Authorize(TaskManagementPermissions.BackgroundJobs.Stop)]
- public Task BulkStopAsync(BackgroundJobInfoBatchInput input)
+ public virtual Task BulkStopAsync(BackgroundJobInfoBatchInput input)
{
return BackgroundJobInfoAppService.BulkStopAsync(input);
}
@@ -109,7 +108,7 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpPut]
[Route("bulk-start")]
[Authorize(TaskManagementPermissions.BackgroundJobs.Start)]
- public Task BulkStartAsync(BackgroundJobInfoBatchInput input)
+ public virtual Task BulkStartAsync(BackgroundJobInfoBatchInput input)
{
return BackgroundJobInfoAppService.BulkStartAsync(input);
}
@@ -117,7 +116,7 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpPut]
[Route("bulk-trigger")]
[Authorize(TaskManagementPermissions.BackgroundJobs.Trigger)]
- public Task BulkTriggerAsync(BackgroundJobInfoBatchInput input)
+ public virtual Task BulkTriggerAsync(BackgroundJobInfoBatchInput input)
{
return BackgroundJobInfoAppService.BulkTriggerAsync(input);
}
@@ -125,7 +124,7 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpPut]
[Route("bulk-resume")]
[Authorize(TaskManagementPermissions.BackgroundJobs.Resume)]
- public Task BulkResumeAsync(BackgroundJobInfoBatchInput input)
+ public virtual Task BulkResumeAsync(BackgroundJobInfoBatchInput input)
{
return BackgroundJobInfoAppService.BulkResumeAsync(input);
}
@@ -133,15 +132,22 @@ public class BackgroundJobInfoController : TaskManagementController, IBackground
[HttpPut]
[Route("bulk-pause")]
[Authorize(TaskManagementPermissions.BackgroundJobs.Pause)]
- public Task BulkPauseAsync(BackgroundJobInfoBatchInput input)
+ public virtual Task BulkPauseAsync(BackgroundJobInfoBatchInput input)
{
return BackgroundJobInfoAppService.BulkPauseAsync(input);
}
[HttpPut]
[Route("bulk-delete")]
- public Task BulkDeleteAsync(BackgroundJobInfoBatchInput input)
+ public virtual Task BulkDeleteAsync(BackgroundJobInfoBatchInput input)
{
return BackgroundJobInfoAppService.BulkDeleteAsync(input);
}
+
+ [HttpGet]
+ [Route("definitions")]
+ public virtual Task> GetDefinitionsAsync()
+ {
+ return BackgroundJobInfoAppService.GetDefinitionsAsync();
+ }
}
diff --git a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/LY.MicroService.RealtimeMessage.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/LY.MicroService.RealtimeMessage.HttpApi.Host.csproj
index 2f27951f0..369a4e39c 100644
--- a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/LY.MicroService.RealtimeMessage.HttpApi.Host.csproj
+++ b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/LY.MicroService.RealtimeMessage.HttpApi.Host.csproj
@@ -50,11 +50,13 @@
+
+
diff --git a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.Configure.cs b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.Configure.cs
index f76d5a0a4..0f8659f28 100644
--- a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.Configure.cs
+++ b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.Configure.cs
@@ -113,8 +113,6 @@ public partial class RealtimeMessageHttpApiHostModule
Configure(options =>
{
options.NodeName = ApplicationName;
-
- options.AddProvider("NotificationCleanupJob");
});
}
diff --git a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.cs
index 2f3b30acd..9cb850ee1 100644
--- a/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.cs
+++ b/aspnet-core/services/LY.MicroService.RealtimeMessage.HttpApi.Host/RealtimeMessageHttpApiHostModule.cs
@@ -4,6 +4,7 @@ using LINGYUN.Abp.AspNetCore.Mvc.Localization;
using LINGYUN.Abp.AuditLogging.Elasticsearch;
using LINGYUN.Abp.Authorization.OrganizationUnits;
using LINGYUN.Abp.BackgroundTasks.ExceptionHandling;
+using LINGYUN.Abp.BackgroundTasks.DistributedLocking;
using LINGYUN.Abp.BackgroundTasks.Quartz;
using LINGYUN.Abp.Data.DbMigrator;
using LINGYUN.Abp.EventBus.CAP;
@@ -17,6 +18,7 @@ using LINGYUN.Abp.MessageService;
using LINGYUN.Abp.MessageService.EntityFrameworkCore;
using LINGYUN.Abp.Notifications.Common;
using LINGYUN.Abp.Notifications.Emailing;
+using LINGYUN.Abp.Notifications.Jobs;
using LINGYUN.Abp.Notifications.SignalR;
using LINGYUN.Abp.Notifications.Sms;
using LINGYUN.Abp.Notifications.WeChat.MiniProgram;
@@ -54,6 +56,7 @@ namespace LY.MicroService.RealtimeMessage;
typeof(AbpMessageServiceHttpApiModule),
typeof(AbpIdentityWeChatModule),
typeof(AbpBackgroundTasksQuartzModule),
+ typeof(AbpBackgroundTasksDistributedLockingModule),
typeof(AbpBackgroundTasksExceptionHandlingModule),
typeof(TaskManagementEntityFrameworkCoreModule),
typeof(AbpMessageServiceEntityFrameworkCoreModule),
@@ -68,6 +71,7 @@ namespace LY.MicroService.RealtimeMessage;
typeof(AbpAuthorizationOrganizationUnitsModule),
typeof(AbpBackgroundWorkersModule),
typeof(AbpIMSignalRModule),
+ typeof(AbpNotificationsJobsModule),
typeof(AbpNotificationsCommonModule),
typeof(AbpNotificationsSmsModule),
typeof(AbpNotificationsEmailingModule),
diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/LY.MicroService.TaskManagement.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/LY.MicroService.TaskManagement.HttpApi.Host.csproj
index 802d1fea5..b5f017181 100644
--- a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/LY.MicroService.TaskManagement.HttpApi.Host.csproj
+++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/LY.MicroService.TaskManagement.HttpApi.Host.csproj
@@ -58,6 +58,7 @@
+
diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220707020828_Add-Task-Actions.Designer.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220707020828_Add-Task-Actions.Designer.cs
new file mode 100644
index 000000000..fb6789aa3
--- /dev/null
+++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220707020828_Add-Task-Actions.Designer.cs
@@ -0,0 +1,272 @@
+//
+using System;
+using LY.MicroService.TaskManagement.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Volo.Abp.EntityFrameworkCore;
+
+#nullable disable
+
+namespace LY.MicroService.TaskManagement.Migrations
+{
+ [DbContext(typeof(TaskManagementMigrationsDbContext))]
+ [Migration("20220707020828_Add-Task-Actions")]
+ partial class AddTaskActions
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.MySql)
+ .HasAnnotation("ProductVersion", "6.0.6")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobAction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("JobId")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("varchar(255)")
+ .HasColumnName("JobId");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasColumnName("Name");
+
+ b.Property("Paramters")
+ .HasColumnType("longtext")
+ .HasColumnName("Paramters");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name");
+
+ b.ToTable("TK_BackgroundJobActions", (string)null);
+ });
+
+ modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobInfo", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)");
+
+ b.Property("Args")
+ .HasColumnType("longtext")
+ .HasColumnName("Args");
+
+ b.Property("BeginTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("Cron")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)")
+ .HasColumnName("Cron");
+
+ b.Property("Description")
+ .HasMaxLength(255)
+ .HasColumnType("varchar(255)")
+ .HasColumnName("Description");
+
+ b.Property("EndTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("Group")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)")
+ .HasColumnName("Group");
+
+ b.Property("Interval")
+ .HasColumnType("int");
+
+ b.Property("IsAbandoned")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsEnabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("JobType")
+ .HasColumnType("int");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("LastRunTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("LockTimeOut")
+ .HasColumnType("int");
+
+ b.Property("MaxCount")
+ .HasColumnType("int");
+
+ b.Property("MaxTryCount")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasColumnName("Name");
+
+ b.Property("NextRunTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("NodeName")
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasColumnName("NodeName");
+
+ b.Property("Priority")
+ .HasColumnType("int");
+
+ b.Property("Result")
+ .HasMaxLength(1000)
+ .HasColumnType("varchar(1000)")
+ .HasColumnName("Result");
+
+ b.Property("Source")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasDefaultValue(-1)
+ .HasColumnName("Source");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.Property("TriggerCount")
+ .HasColumnType("int");
+
+ b.Property("TryCount")
+ .HasColumnType("int");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("varchar(1000)")
+ .HasColumnName("Type");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name", "Group");
+
+ b.ToTable("TK_BackgroundJobs", (string)null);
+ });
+
+ modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobLog", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ b.Property("Exception")
+ .HasMaxLength(2000)
+ .HasColumnType("varchar(2000)")
+ .HasColumnName("Exception");
+
+ b.Property("JobGroup")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)")
+ .HasColumnName("JobGroup");
+
+ b.Property("JobId")
+ .HasMaxLength(255)
+ .HasColumnType("varchar(255)")
+ .HasColumnName("JobId");
+
+ b.Property("JobName")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasColumnName("JobName");
+
+ b.Property("JobType")
+ .HasMaxLength(1000)
+ .HasColumnType("varchar(1000)")
+ .HasColumnName("JobType");
+
+ b.Property("Message")
+ .HasMaxLength(1000)
+ .HasColumnType("varchar(1000)")
+ .HasColumnName("Message");
+
+ b.Property("RunTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("JobGroup", "JobName");
+
+ b.ToTable("TK_BackgroundJobLogs", (string)null);
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220707020828_Add-Task-Actions.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220707020828_Add-Task-Actions.cs
new file mode 100644
index 000000000..dc50ee07c
--- /dev/null
+++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220707020828_Add-Task-Actions.cs
@@ -0,0 +1,51 @@
+using System;
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace LY.MicroService.TaskManagement.Migrations
+{
+ public partial class AddTaskActions : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.CreateTable(
+ name: "TK_BackgroundJobActions",
+ columns: table => new
+ {
+ Id = table.Column(type: "char(36)", nullable: false, collation: "ascii_general_ci"),
+ TenantId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"),
+ JobId = table.Column(type: "varchar(255)", maxLength: 255, nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ Name = table.Column(type: "varchar(100)", maxLength: 100, nullable: false)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ Paramters = table.Column(type: "longtext", nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ ExtraProperties = table.Column(type: "longtext", nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ ConcurrencyStamp = table.Column(type: "varchar(40)", maxLength: 40, nullable: true)
+ .Annotation("MySql:CharSet", "utf8mb4"),
+ CreationTime = table.Column(type: "datetime(6)", nullable: false),
+ CreatorId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci"),
+ LastModificationTime = table.Column(type: "datetime(6)", nullable: true),
+ LastModifierId = table.Column(type: "char(36)", nullable: true, collation: "ascii_general_ci")
+ },
+ constraints: table =>
+ {
+ table.PrimaryKey("PK_TK_BackgroundJobActions", x => x.Id);
+ })
+ .Annotation("MySql:CharSet", "utf8mb4");
+
+ migrationBuilder.CreateIndex(
+ name: "IX_TK_BackgroundJobActions_Name",
+ table: "TK_BackgroundJobActions",
+ column: "Name");
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropTable(
+ name: "TK_BackgroundJobActions");
+ }
+ }
+}
diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220707032320_Add-Field-IsEnabled-With-BackgroundJobAction.Designer.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220707032320_Add-Field-IsEnabled-With-BackgroundJobAction.Designer.cs
new file mode 100644
index 000000000..1a2d158c0
--- /dev/null
+++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220707032320_Add-Field-IsEnabled-With-BackgroundJobAction.Designer.cs
@@ -0,0 +1,275 @@
+//
+using System;
+using LY.MicroService.TaskManagement.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore;
+using Microsoft.EntityFrameworkCore.Infrastructure;
+using Microsoft.EntityFrameworkCore.Migrations;
+using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
+using Volo.Abp.EntityFrameworkCore;
+
+#nullable disable
+
+namespace LY.MicroService.TaskManagement.Migrations
+{
+ [DbContext(typeof(TaskManagementMigrationsDbContext))]
+ [Migration("20220707032320_Add-Field-IsEnabled-With-BackgroundJobAction")]
+ partial class AddFieldIsEnabledWithBackgroundJobAction
+ {
+ protected override void BuildTargetModel(ModelBuilder modelBuilder)
+ {
+#pragma warning disable 612, 618
+ modelBuilder
+ .HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.MySql)
+ .HasAnnotation("ProductVersion", "6.0.6")
+ .HasAnnotation("Relational:MaxIdentifierLength", 64);
+
+ modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobAction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsEnabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("JobId")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("varchar(255)")
+ .HasColumnName("JobId");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasColumnName("Name");
+
+ b.Property("Paramters")
+ .HasColumnType("longtext")
+ .HasColumnName("Paramters");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name");
+
+ b.ToTable("TK_BackgroundJobActions", (string)null);
+ });
+
+ modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobInfo", b =>
+ {
+ b.Property("Id")
+ .HasColumnType("varchar(255)");
+
+ b.Property("Args")
+ .HasColumnType("longtext")
+ .HasColumnName("Args");
+
+ b.Property("BeginTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("Cron")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)")
+ .HasColumnName("Cron");
+
+ b.Property("Description")
+ .HasMaxLength(255)
+ .HasColumnType("varchar(255)")
+ .HasColumnName("Description");
+
+ b.Property("EndTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("Group")
+ .IsRequired()
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)")
+ .HasColumnName("Group");
+
+ b.Property("Interval")
+ .HasColumnType("int");
+
+ b.Property("IsAbandoned")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("IsEnabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("JobType")
+ .HasColumnType("int");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("LastRunTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("LockTimeOut")
+ .HasColumnType("int");
+
+ b.Property("MaxCount")
+ .HasColumnType("int");
+
+ b.Property("MaxTryCount")
+ .HasColumnType("int");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasColumnName("Name");
+
+ b.Property("NextRunTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("NodeName")
+ .HasMaxLength(128)
+ .HasColumnType("varchar(128)")
+ .HasColumnName("NodeName");
+
+ b.Property("Priority")
+ .HasColumnType("int");
+
+ b.Property("Result")
+ .HasMaxLength(1000)
+ .HasColumnType("varchar(1000)")
+ .HasColumnName("Result");
+
+ b.Property("Source")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("int")
+ .HasDefaultValue(-1)
+ .HasColumnName("Source");
+
+ b.Property("Status")
+ .HasColumnType("int");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.Property("TriggerCount")
+ .HasColumnType("int");
+
+ b.Property("TryCount")
+ .HasColumnType("int");
+
+ b.Property("Type")
+ .IsRequired()
+ .HasMaxLength(1000)
+ .HasColumnType("varchar(1000)")
+ .HasColumnName("Type");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name", "Group");
+
+ b.ToTable("TK_BackgroundJobs", (string)null);
+ });
+
+ modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobLog", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("bigint");
+
+ b.Property("Exception")
+ .HasMaxLength(2000)
+ .HasColumnType("varchar(2000)")
+ .HasColumnName("Exception");
+
+ b.Property("JobGroup")
+ .HasMaxLength(50)
+ .HasColumnType("varchar(50)")
+ .HasColumnName("JobGroup");
+
+ b.Property("JobId")
+ .HasMaxLength(255)
+ .HasColumnType("varchar(255)")
+ .HasColumnName("JobId");
+
+ b.Property("JobName")
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasColumnName("JobName");
+
+ b.Property("JobType")
+ .HasMaxLength(1000)
+ .HasColumnType("varchar(1000)")
+ .HasColumnName("JobType");
+
+ b.Property("Message")
+ .HasMaxLength(1000)
+ .HasColumnType("varchar(1000)")
+ .HasColumnName("Message");
+
+ b.Property("RunTime")
+ .HasColumnType("datetime(6)");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("JobGroup", "JobName");
+
+ b.ToTable("TK_BackgroundJobLogs", (string)null);
+ });
+#pragma warning restore 612, 618
+ }
+ }
+}
diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220707032320_Add-Field-IsEnabled-With-BackgroundJobAction.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220707032320_Add-Field-IsEnabled-With-BackgroundJobAction.cs
new file mode 100644
index 000000000..5c2b55dd2
--- /dev/null
+++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/20220707032320_Add-Field-IsEnabled-With-BackgroundJobAction.cs
@@ -0,0 +1,26 @@
+using Microsoft.EntityFrameworkCore.Migrations;
+
+#nullable disable
+
+namespace LY.MicroService.TaskManagement.Migrations
+{
+ public partial class AddFieldIsEnabledWithBackgroundJobAction : Migration
+ {
+ protected override void Up(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.AddColumn(
+ name: "IsEnabled",
+ table: "TK_BackgroundJobActions",
+ type: "tinyint(1)",
+ nullable: false,
+ defaultValue: false);
+ }
+
+ protected override void Down(MigrationBuilder migrationBuilder)
+ {
+ migrationBuilder.DropColumn(
+ name: "IsEnabled",
+ table: "TK_BackgroundJobActions");
+ }
+ }
+}
diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/TaskManagementMigrationsDbContextModelSnapshot.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/TaskManagementMigrationsDbContextModelSnapshot.cs
index e77b0f616..9f1abeb11 100644
--- a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/TaskManagementMigrationsDbContextModelSnapshot.cs
+++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/Migrations/TaskManagementMigrationsDbContextModelSnapshot.cs
@@ -18,9 +18,71 @@ namespace LY.MicroService.TaskManagement.Migrations
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.MySql)
- .HasAnnotation("ProductVersion", "6.0.3")
+ .HasAnnotation("ProductVersion", "6.0.6")
.HasAnnotation("Relational:MaxIdentifierLength", 64);
+ modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobAction", b =>
+ {
+ b.Property("Id")
+ .ValueGeneratedOnAdd()
+ .HasColumnType("char(36)");
+
+ b.Property("ConcurrencyStamp")
+ .IsConcurrencyToken()
+ .HasMaxLength(40)
+ .HasColumnType("varchar(40)")
+ .HasColumnName("ConcurrencyStamp");
+
+ b.Property("CreationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("CreationTime");
+
+ b.Property("CreatorId")
+ .HasColumnType("char(36)")
+ .HasColumnName("CreatorId");
+
+ b.Property("ExtraProperties")
+ .HasColumnType("longtext")
+ .HasColumnName("ExtraProperties");
+
+ b.Property("IsEnabled")
+ .HasColumnType("tinyint(1)");
+
+ b.Property("JobId")
+ .IsRequired()
+ .HasMaxLength(255)
+ .HasColumnType("varchar(255)")
+ .HasColumnName("JobId");
+
+ b.Property("LastModificationTime")
+ .HasColumnType("datetime(6)")
+ .HasColumnName("LastModificationTime");
+
+ b.Property("LastModifierId")
+ .HasColumnType("char(36)")
+ .HasColumnName("LastModifierId");
+
+ b.Property("Name")
+ .IsRequired()
+ .HasMaxLength(100)
+ .HasColumnType("varchar(100)")
+ .HasColumnName("Name");
+
+ b.Property("Paramters")
+ .HasColumnType("longtext")
+ .HasColumnName("Paramters");
+
+ b.Property("TenantId")
+ .HasColumnType("char(36)")
+ .HasColumnName("TenantId");
+
+ b.HasKey("Id");
+
+ b.HasIndex("Name");
+
+ b.ToTable("TK_BackgroundJobActions", (string)null);
+ });
+
modelBuilder.Entity("LINGYUN.Abp.TaskManagement.BackgroundJobInfo", b =>
{
b.Property("Id")
diff --git a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.Configure.cs b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.Configure.cs
index 5472f2cb3..7cdda6fa5 100644
--- a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.Configure.cs
+++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.Configure.cs
@@ -1,4 +1,5 @@
using DotNetCore.CAP;
+using LINGYUN.Abp.BackgroundTasks;
using LINGYUN.Abp.ExceptionHandling;
using LINGYUN.Abp.ExceptionHandling.Emailing;
using LINGYUN.Abp.Localization.CultureMap;
@@ -103,6 +104,15 @@ public partial class TaskManagementHttpApiHostModule
});
}
+ private void ConfigureBackgroundTasks()
+ {
+ Configure(options =>
+ {
+ options.JobCleanEnabled = true;
+ options.JobFetchEnabled = true;
+ });
+ }
+
private void ConfigureDistributedLock(IServiceCollection services, IConfiguration configuration)
{
var redis = ConnectionMultiplexer.Connect(configuration["DistributedLock:Redis:Configuration"]);
@@ -287,6 +297,11 @@ public partial class TaskManagementHttpApiHostModule
options.Audience = configuration["AuthServer:ApiName"];
});
+ if (isDevelopment)
+ {
+ // services.AddAlwaysAllowAuthorization();
+ }
+
if (!isDevelopment)
{
var redis = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]);
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 a54b1cc4f..5a6985c58 100644
--- a/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.cs
+++ b/aspnet-core/services/LY.MicroService.TaskManagement.HttpApi.Host/TaskManagementHttpApiHostModule.cs
@@ -2,6 +2,7 @@
using LINGYUN.Abp.AspNetCore.Mvc.Localization;
using LINGYUN.Abp.AuditLogging.Elasticsearch;
using LINGYUN.Abp.Authorization.OrganizationUnits;
+using LINGYUN.Abp.BackgroundTasks.DistributedLocking;
using LINGYUN.Abp.BackgroundTasks.ExceptionHandling;
using LINGYUN.Abp.BackgroundTasks.Jobs;
using LINGYUN.Abp.BackgroundTasks.Quartz;
@@ -52,6 +53,7 @@ namespace LY.MicroService.TaskManagement;
typeof(AbpAspNetCoreMvcLocalizationModule),
typeof(AbpBackgroundTasksJobsModule),
typeof(AbpBackgroundTasksQuartzModule),
+ typeof(AbpBackgroundTasksDistributedLockingModule),
typeof(AbpBackgroundTasksExceptionHandlingModule),
typeof(TaskManagementApplicationModule),
typeof(TaskManagementHttpApiModule),
@@ -89,6 +91,7 @@ public partial class TaskManagementHttpApiHostModule : AbpModule
ConfigureDbContext();
ConfigureLocalization();
ConfigureJsonSerializer();
+ ConfigureBackgroundTasks();
ConfigureExceptionHandling();
ConfigureVirtualFileSystem();
ConfigureCaching(configuration);
@@ -97,9 +100,6 @@ public partial class TaskManagementHttpApiHostModule : AbpModule
ConfigureSwagger(context.Services);
ConfigureDistributedLock(context.Services, configuration);
ConfigureSecurity(context.Services, configuration, hostingEnvironment.IsDevelopment());
-
- // 开发取消权限检查
- // context.Services.AddAlwaysAllowAuthorization();
}
public override void OnApplicationInitialization(ApplicationInitializationContext context)
diff --git a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/LY.MicroService.WebhooksManagement.HttpApi.Host.csproj b/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/LY.MicroService.WebhooksManagement.HttpApi.Host.csproj
index 8e6d24aa6..ebefe4885 100644
--- a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/LY.MicroService.WebhooksManagement.HttpApi.Host.csproj
+++ b/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/LY.MicroService.WebhooksManagement.HttpApi.Host.csproj
@@ -53,6 +53,7 @@
+
diff --git a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.cs b/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.cs
index b71f54be1..69955d6a5 100644
--- a/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.cs
+++ b/aspnet-core/services/LY.MicroService.WebhooksManagement.HttpApi.Host/WebhooksManagementHttpApiHostModule.cs
@@ -4,6 +4,7 @@ using LINGYUN.Abp.AspNetCore.Mvc.Wrapper;
using LINGYUN.Abp.AuditLogging.Elasticsearch;
using LINGYUN.Abp.Authorization.OrganizationUnits;
using LINGYUN.Abp.BackgroundTasks.ExceptionHandling;
+using LINGYUN.Abp.BackgroundTasks.DistributedLocking;
using LINGYUN.Abp.BackgroundTasks.Quartz;
using LINGYUN.Abp.EventBus.CAP;
using LINGYUN.Abp.ExceptionHandling.Emailing;
@@ -48,6 +49,7 @@ namespace LY.MicroService.WebhooksManagement;
typeof(AbpWebhooksIdentityModule),
typeof(AbpWebhooksSaasModule),
typeof(AbpBackgroundTasksQuartzModule),
+ typeof(AbpBackgroundTasksDistributedLockingModule),
typeof(AbpBackgroundTasksExceptionHandlingModule),
typeof(TaskManagementEntityFrameworkCoreModule),
typeof(AbpEntityFrameworkCoreMySQLModule),