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),