From 1cffe011882e69af7f06a54643b37abced96a0c0 Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Thu, 27 Jan 2022 19:55:50 +0800 Subject: [PATCH] feat(dapr): upgrade dapr to 1.6.0 --- .../src/api/messages/model/messagesModel.ts | 1 + .../header/components/notify/useMessages.ts | 7 +- aspnet-core/Directory.Build.props | 2 +- .../Abp/IM/SignalR/Hubs/MessagesHub.cs | 113 +++++++++++------- .../LINGYUN/Abp/IM/Messages/MessageType.cs | 7 +- ...ueVbenAdminNavigationDefinitionProvider.cs | 15 ++- .../JobFailedNotifierProvider.cs | 13 +- .../Jobs/HttpRequestJobBase.cs | 30 +++-- .../Quartz/QuartzJobExecutorProvider.cs | 9 +- .../Quartz/QuartzJobListener.cs | 38 +----- .../Abp/BackgroundTasks/IJobEventTrigger.cs | 10 ++ .../Abp/BackgroundTasks/JobEventTrigger.cs | 53 ++++++++ .../Abp/TaskManagement/BackgroundJobStore.cs | 15 ++- .../IBackgroundJobInfoRepository.cs | 14 ++- .../EfCoreBackgroundJobInfoRepository.cs | 37 ++++++ gateways/Directory.Build.props | 2 +- 16 files changed, 258 insertions(+), 108 deletions(-) create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/IJobEventTrigger.cs create mode 100644 aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/JobEventTrigger.cs diff --git a/apps/vue/src/api/messages/model/messagesModel.ts b/apps/vue/src/api/messages/model/messagesModel.ts index d7812756d..7fb9ea3cb 100644 --- a/apps/vue/src/api/messages/model/messagesModel.ts +++ b/apps/vue/src/api/messages/model/messagesModel.ts @@ -14,6 +14,7 @@ export enum MessageType { Video = 30, Voice = 40, File = 50, + Notifier = 100, } export enum MessageState { diff --git a/apps/vue/src/layouts/default/header/components/notify/useMessages.ts b/apps/vue/src/layouts/default/header/components/notify/useMessages.ts index 8b679e580..44258a0b8 100644 --- a/apps/vue/src/layouts/default/header/components/notify/useMessages.ts +++ b/apps/vue/src/layouts/default/header/components/notify/useMessages.ts @@ -75,6 +75,10 @@ export function useMessages() { message.extraProperties.content.Values as Recordable, ); } + if (message.messageType === MessageType.Notifier) { + createMessage.info(message.content); + return; + } if (message.groupId) { emitter.emit(ChatEventEnum.USER_MESSAGE_GROUP_NEW, message); } else { @@ -117,7 +121,8 @@ export function useMessages() { source: MessageSourceTye.User, isAnonymous: data.isAnonymous ?? false, }; - signalR.invoke('send', chatMessage).then(() => { + signalR.invoke('send', chatMessage).then((id) => { + chatMessage.messageId = id; !chatMessage.groupId && onMessageReceived(chatMessage); }); } diff --git a/aspnet-core/Directory.Build.props b/aspnet-core/Directory.Build.props index f450474b7..38d093183 100644 --- a/aspnet-core/Directory.Build.props +++ b/aspnet-core/Directory.Build.props @@ -2,7 +2,7 @@ 5.1.1 5.1.1 - 1.5.0 + 1.6.0 1.0.1 6.0.0 1.5.10 diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs index 8a574e615..68771cc76 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs @@ -3,7 +3,6 @@ using LINGYUN.Abp.IM.Contract; using LINGYUN.Abp.IM.Groups; using LINGYUN.Abp.IM.Localization; using LINGYUN.Abp.IM.Messages; -using LINGYUN.Abp.RealTime; using LINGYUN.Abp.RealTime.Localization; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.SignalR; @@ -85,54 +84,80 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs /// /// [HubMethodName("send")] - public virtual async Task SendMessageAsync(ChatMessage chatMessage) + public virtual async Task SendMessageAsync(ChatMessage chatMessage) { - await SendMessageAsync(Options.GetChatMessageMethod, chatMessage, true); + return await SendMessageAsync(Options.GetChatMessageMethod, chatMessage, true); } [HubMethodName("recall")] public virtual async Task ReCallAsync(ChatMessage chatMessage) { - await Processor?.ReCallAsync(chatMessage); - if (!chatMessage.GroupId.IsNullOrWhiteSpace()) + try { - await SendMessageAsync( - Options.ReCallChatMessageMethod, - ChatMessage.SystemLocalized( - chatMessage.FormUserId, - chatMessage.GroupId, - new LocalizableStringInfo( - LocalizationResourceNameAttribute.GetName(typeof(AbpIMResource)), - "Messages:RecallMessage", - new Dictionary - { + await Processor?.ReCallAsync(chatMessage); + if (!chatMessage.GroupId.IsNullOrWhiteSpace()) + { + await SendMessageAsync( + Options.ReCallChatMessageMethod, + ChatMessage.SystemLocalized( + chatMessage.FormUserId, + chatMessage.GroupId, + new LocalizableStringInfo( + LocalizationResourceNameAttribute.GetName(typeof(AbpIMResource)), + "Messages:RecallMessage", + new Dictionary + { + { "User", chatMessage.FormUserName } + }), + Clock, + chatMessage.MessageType, + chatMessage.TenantId) + .SetProperty(nameof(ChatMessage.MessageId).ToPascalCase(), chatMessage.MessageId), + callbackException: false); + } + else + { + await SendMessageAsync( + Options.ReCallChatMessageMethod, + ChatMessage.SystemLocalized( + chatMessage.ToUserId.Value, + chatMessage.FormUserId, + new LocalizableStringInfo( + LocalizationResourceNameAttribute.GetName(typeof(AbpIMResource)), + "Messages:RecallMessage", + new Dictionary + { { "User", chatMessage.FormUserName } - }), - Clock, - chatMessage.MessageType, - chatMessage.TenantId) - .SetProperty(nameof(ChatMessage.MessageId).ToPascalCase(), chatMessage.MessageId), - callbackException: false); + }), + Clock, + chatMessage.MessageType, + chatMessage.TenantId) + .SetProperty(nameof(ChatMessage.MessageId).ToPascalCase(), chatMessage.MessageId), + callbackException: false); + } } - else + catch (Exception ex) { - await SendMessageAsync( - Options.ReCallChatMessageMethod, - ChatMessage.SystemLocalized( - chatMessage.ToUserId.Value, - chatMessage.FormUserId, - new LocalizableStringInfo( - LocalizationResourceNameAttribute.GetName(typeof(AbpIMResource)), - "Messages:RecallMessage", - new Dictionary - { - { "User", chatMessage.FormUserName } - }), - Clock, - chatMessage.MessageType, - chatMessage.TenantId) - .SetProperty(nameof(ChatMessage.MessageId).ToPascalCase(), chatMessage.MessageId), - callbackException: false); + if (ex is IBusinessException) + { + var errorInfo = ErrorInfoConverter.Convert(ex, options => + { + options.SendExceptionsDetailsToClients = false; + options.SendStackTraceToClients = false; + }); + + await SendMessageAsync( + Options.ReCallChatMessageMethod, + ChatMessage.System( + chatMessage.ToUserId.Value, + chatMessage.FormUserId, + errorInfo.Message, + Clock, + MessageType.Notifier, + chatMessage.TenantId) + .SetProperty(nameof(ChatMessage.MessageId).ToPascalCase(), chatMessage.MessageId), + callbackException: false); + } } } @@ -142,7 +167,7 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs await Processor?.ReadAsync(chatMessage); } - protected virtual async Task SendMessageAsync(string methodName, ChatMessage chatMessage, bool callbackException = false) + protected virtual async Task SendMessageAsync(string methodName, ChatMessage chatMessage, bool callbackException = false) { // 持久化 try @@ -159,6 +184,8 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs { await SendMessageToUserAsync(methodName, chatMessage); } + + return chatMessage.MessageId; } catch (Exception ex) { @@ -178,7 +205,7 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs chatMessage.GroupId, errorInfo.Message, Clock, - chatMessage.MessageType, + MessageType.Notifier, chatMessage.TenantId)); } else @@ -190,11 +217,13 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs chatMessage.FormUserId, errorInfo.Message, Clock, - chatMessage.MessageType, + MessageType.Notifier, chatMessage.TenantId)); } } } + + return ""; } protected virtual async Task SendMessageToGroupAsync(string methodName, ChatMessage chatMessage) diff --git a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageType.cs b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageType.cs index f247d2d57..23d7c35c8 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageType.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageType.cs @@ -25,6 +25,11 @@ /// /// 文件 /// - File = 50 + File = 50, + /// + /// 通知 + /// 一般用于错误处理 + /// + Notifier = 100, } } diff --git a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs index bb2201f7f..4336dd4d3 100644 --- a/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs +++ b/aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs @@ -11,7 +11,8 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin context.Add(GetManage()); context.Add(GetSaas()); context.Add(GetPlatform()); - context.Add(GetApiGateway()); + // TODO: 网关不再需要动态管理 + // context.Add(GetApiGateway()); context.Add(GetLocalization()); context.Add(GetOssManagement()); context.Add(GetTaskManagement()); @@ -222,7 +223,8 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin displayName: "平台管理", url: "/platform", component: "", - description: "平台管理"); + description: "平台管理", + icon: "ep:platform"); platform.AddItem( new ApplicationMenu( name: "DataDictionary", @@ -370,7 +372,7 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin url: "/task-management", component: "", description: "任务调度平台", - icon: ""); + icon: "bi:list-task"); task.AddItem( new ApplicationMenu( name: "BackgroundJobs", @@ -378,6 +380,13 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin url: "/task-management/background-jobs", component: "/task-management/background-jobs/index", description: "任务管理")); + task.AddItem( + new ApplicationMenu( + name: "BackgroundJobInfoDetail", + displayName: "任务详情", + url: "/task-management/background-jobs/:id", + component: "/task-management/background-jobs/components/BackgroundJobInfoDetail", + description: "任务详情")); return new NavigationDefinition(task); } 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 index 2d64051ab..5f2f6493b 100644 --- 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 @@ -22,16 +22,13 @@ public class JobFailedNotifierProvider : IJobFailedNotifierProvider, ITransientD public ILogger Logger { protected get; set; } - protected IClock Clock { get; } protected IEmailSender EmailSender { get; } protected ITemplateRenderer TemplateRenderer { get; } public JobFailedNotifierProvider( - IClock clock, IEmailSender emailSender, ITemplateRenderer templateRenderer) { - Clock = clock; EmailSender = emailSender; TemplateRenderer = templateRenderer; @@ -63,15 +60,15 @@ public class JobFailedNotifierProvider : IJobFailedNotifierProvider, ITransientD return; } - var footer = eventData.Args.GetOrDefault("footer")?.ToString() ?? $"Copyright to LY Colin © {Clock.Now.Year}"; + var footer = eventData.Args.GetOrDefault("footer")?.ToString() ?? $"Copyright to LY Colin © {eventData.RunTime.Year}"; var model = new { Title = subject, - Group = eventData.Group, - Name = eventData.Name, Id = eventData.Key, - Type = eventData.Type, - Triggertime = Clock.Now.ToString("yyyy-MM-dd HH:mm:ss"), + 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, diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/HttpRequestJobBase.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/HttpRequestJobBase.cs index 47629c27f..4896e7242 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/HttpRequestJobBase.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/HttpRequestJobBase.cs @@ -10,12 +10,16 @@ using System.Threading.Tasks; using Volo.Abp.Content; using Volo.Abp.Http; using Volo.Abp.Http.Client; +using Volo.Abp.Localization; using Volo.Abp.MultiTenancy; namespace LINGYUN.Abp.BackgroundTasks.Jobs; public abstract class HttpRequestJobBase { + // 可选, 请求时指定区域性 + public const string PropertyCulture = "culture"; + protected ICurrentTenant CurrentTenant { get; set; } protected virtual void InitJob(JobRunnableContext context) @@ -77,21 +81,25 @@ public abstract class HttpRequestJobBase IReadOnlyDictionary headers = null, string clientName = null) { - var request = BuildRequestMessage(httpMethod, requestUrl, data, contentType, headers); - var clientFactory = context.GetRequiredService(); + context.TryGetString(PropertyCulture, out var culture); + using (CultureHelper.Use(culture ?? "en")) + { + var request = BuildRequestMessage(httpMethod, requestUrl, data, contentType, headers); + var clientFactory = context.GetRequiredService(); - var client = clientName.IsNullOrWhiteSpace() - ? clientFactory.CreateClient(BackgroundTasksConsts.DefaultHttpClient) - : clientFactory.CreateClient(clientName); + var client = clientName.IsNullOrWhiteSpace() + ? clientFactory.CreateClient(BackgroundTasksConsts.DefaultHttpClient) + : clientFactory.CreateClient(clientName); - var response = await client.SendAsync(request); + var response = await client.SendAsync(request); - if (!response.IsSuccessStatusCode) - { - await ThrowExceptionForResponseAsync(response); - } + if (!response.IsSuccessStatusCode) + { + await ThrowExceptionForResponseAsync(response); + } - return response; + return response; + } } protected virtual HttpRequestMessage BuildRequestMessage( diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobExecutorProvider.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobExecutorProvider.cs index 966be21e9..5e80dd1d1 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobExecutorProvider.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobExecutorProvider.cs @@ -47,12 +47,19 @@ public class QuartzJobExecutorProvider : IQuartzJobExecutorProvider, ISingletonD var jobBuilder = JobBuilder.Create(jobType) .WithIdentity(KeyBuilder.CreateJobKey(job)) .WithDescription(job.Description); - + // 查询任务需要 jobBuilder.UsingJobData(nameof(JobInfo.Id), job.Id); + // 有些场景需要 + jobBuilder.UsingJobData(nameof(JobInfo.Name), job.Name); + jobBuilder.UsingJobData(nameof(JobInfo.Type), job.Type); + jobBuilder.UsingJobData(nameof(JobInfo.Group), job.Group); + // 独占任务需要 jobBuilder.UsingJobData(nameof(JobInfo.LockTimeOut), job.LockTimeOut); + // 传递的作业参数 jobBuilder.UsingJobData(new JobDataMap(job.Args)); if (job.TenantId.HasValue) { + // 用于多租户场景 jobBuilder.UsingJobData(nameof(JobInfo.TenantId), job.TenantId.ToString()); } 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 0a9bcc5ca..63b644dab 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 @@ -5,11 +5,9 @@ using Quartz; using Quartz.Listener; using System; using System.Collections.Immutable; -using System.Linq; using System.Threading; using System.Threading.Tasks; using Volo.Abp.DependencyInjection; -using Volo.Abp.MultiTenancy; using Volo.Abp.Timing; namespace LINGYUN.Abp.BackgroundTasks.Quartz; @@ -21,16 +19,13 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency public override string Name => "QuartzJobListener"; protected IClock Clock { get; } - protected IJobEventProvider EventProvider { get; } protected IServiceScopeFactory ServiceScopeFactory { get; } public QuartzJobListener( IClock clock, - IJobEventProvider eventProvider, IServiceScopeFactory serviceScopeFactory) { Clock = clock; - EventProvider = eventProvider; ServiceScopeFactory = serviceScopeFactory; Logger = NullLogger.Instance; @@ -57,11 +52,6 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency { return; } - var jobEventList = EventProvider.GetAll(); - if (!jobEventList.Any()) - { - return; - } using var scope = ServiceScopeFactory.CreateScope(); var jobEventData = new JobEventData( @@ -78,15 +68,8 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency scope.ServiceProvider, jobEventData); - var index = 0; - var taskList = new Task[jobEventList.Count]; - foreach (var jobEvent in jobEventList) - { - taskList[index] = jobEvent.OnJobBeforeExecuted(eventContext); - index++; - } - - await Task.WhenAll(taskList); + var trigger = scope.ServiceProvider.GetRequiredService(); + await trigger.OnJobBeforeExecuted(eventContext); } catch (Exception ex) { @@ -104,12 +87,6 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency return; } - var jobEventList = EventProvider.GetAll(); - if (!jobEventList.Any()) - { - return; - } - using var scope = ServiceScopeFactory.CreateScope(); var jobType = context.JobDetail.JobType; if (jobType.IsGenericType) @@ -151,15 +128,8 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency scope.ServiceProvider, jobEventData); - var index = 0; - var taskList = new Task[jobEventList.Count]; - foreach (var jobEvent in jobEventList) - { - taskList[index] = jobEvent.OnJobAfterExecuted(eventContext); - index++; - } - - await Task.WhenAll(taskList); + var trigger = scope.ServiceProvider.GetRequiredService(); + await trigger.OnJobAfterExecuted(eventContext); } catch (Exception ex) { diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/IJobEventTrigger.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/IJobEventTrigger.cs new file mode 100644 index 000000000..bccd699d3 --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/IJobEventTrigger.cs @@ -0,0 +1,10 @@ +using System.Threading.Tasks; + +namespace LINGYUN.Abp.BackgroundTasks; + +public interface IJobEventTrigger +{ + Task OnJobBeforeExecuted(JobEventContext context); + + Task OnJobAfterExecuted(JobEventContext context); +} diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/JobEventTrigger.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/JobEventTrigger.cs new file mode 100644 index 000000000..74cb4872a --- /dev/null +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/JobEventTrigger.cs @@ -0,0 +1,53 @@ +using System.Linq; +using System.Threading.Tasks; +using Volo.Abp.DependencyInjection; + +namespace LINGYUN.Abp.BackgroundTasks; + +public class JobEventTrigger : IJobEventTrigger, ITransientDependency +{ + protected IJobEventProvider EventProvider { get; } + + public JobEventTrigger(IJobEventProvider jobEventProvider) + { + EventProvider = jobEventProvider; + } + + public async virtual Task OnJobBeforeExecuted(JobEventContext context) + { + var jobEventList = EventProvider.GetAll(); + if (!jobEventList.Any()) + { + return; + } + + var index = 0; + var taskList = new Task[jobEventList.Count]; + foreach (var jobEvent in jobEventList) + { + taskList[index] = jobEvent.OnJobBeforeExecuted(context); + index++; + } + + await Task.WhenAll(taskList); + } + + public async virtual Task OnJobAfterExecuted(JobEventContext context) + { + var jobEventList = EventProvider.GetAll(); + if (!jobEventList.Any()) + { + return; + } + + var index = 0; + var taskList = new Task[jobEventList.Count]; + foreach (var jobEvent in jobEventList) + { + taskList[index] = jobEvent.OnJobAfterExecuted(context); + index++; + } + + await Task.WhenAll(taskList); + } +} 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 7dda6ada1..987becbd8 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 @@ -46,9 +46,7 @@ public class BackgroundJobStore : IJobStore, ITransientDependency public async virtual Task FindAsync(string jobId) { - var jobInfo = await JobInfoRepository.FindAsync(jobId); - - return ObjectMapper.Map(jobInfo); + return await JobInfoRepository.FindJobAsync(jobId); } [UnitOfWork] @@ -128,7 +126,7 @@ public class BackgroundJobStore : IJobStore, ITransientDependency }; jogLog.SetMessage( - eventData.Exception == null ? eventData.Result ?? "OK" : "Failed", + eventData.Exception == null ? eventData.Result ?? "OK" : GetSourceException(eventData.Exception).Message, eventData.Exception); await JobLogRepository.InsertAsync(jogLog); @@ -148,4 +146,13 @@ public class BackgroundJobStore : IJobStore, ITransientDependency await JobInfoRepository.DeleteManyAsync(jobs, cancellationToken: cancellationToken); } + + protected virtual Exception GetSourceException(Exception exception) + { + if (exception.InnerException != null) + { + return GetSourceException(exception.InnerException); + } + return exception; + } } 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 767115c45..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 @@ -1,4 +1,5 @@ -using System; +using LINGYUN.Abp.BackgroundTasks; +using System; using System.Collections.Generic; using System.Threading; using System.Threading.Tasks; @@ -13,6 +14,17 @@ public interface IBackgroundJobInfoRepository : IRepository + /// 获取作业 + /// + /// + /// + /// + /// + Task FindJobAsync( + string id, + bool includeDetails = true, + CancellationToken cancellationToken = default); + /// /// 获取过期任务列表 /// /// 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 f7efe16ab..80d38a979 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 @@ -36,6 +36,43 @@ public class EfCoreBackgroundJobInfoRepository : GetCancellationToken(cancellationToken)); } + public virtual async Task FindJobAsync( + string id, + bool includeDetails = true, + CancellationToken cancellationToken = default) + { + return await (await GetDbSetAsync()) + .Where(x => x.Id.Equals(id)) + .Select(x => new JobInfo + { + Id = x.Id, + TenantId = x.TenantId, + Name = x.Name, + NextRunTime = x.NextRunTime, + Args = x.Args, + IsAbandoned = x.IsAbandoned, + BeginTime = x.BeginTime, + EndTime = x.EndTime, + CreationTime = x.CreationTime, + Cron = x.Cron, + MaxCount = x.MaxCount, + MaxTryCount = x.MaxTryCount, + Description = x.Description, + Group = x.Group, + Interval = x.Interval, + JobType = x.JobType, + Status = x.Status, + Priority = x.Priority, + LastRunTime = x.LastRunTime, + LockTimeOut = x.LockTimeOut, + Result = x.Result, + TriggerCount = x.TriggerCount, + TryCount = x.TryCount, + Type = x.Type + }) + .FirstOrDefaultAsync(GetCancellationToken(cancellationToken)); + } + public virtual async Task> GetExpiredJobsAsync( int maxResultCount, TimeSpan jobExpiratime, diff --git a/gateways/Directory.Build.props b/gateways/Directory.Build.props index 40ea61b92..155863c54 100644 --- a/gateways/Directory.Build.props +++ b/gateways/Directory.Build.props @@ -2,7 +2,7 @@ 5.1.1 5.1.1 - 1.5.0 + 1.6.0 5.2.0 1.5.10 2.13.0