Browse Source

feat(dapr): upgrade dapr to 1.6.0

pull/485/head
cKey 4 years ago
parent
commit
1cffe01188
  1. 1
      apps/vue/src/api/messages/model/messagesModel.ts
  2. 7
      apps/vue/src/layouts/default/header/components/notify/useMessages.ts
  3. 2
      aspnet-core/Directory.Build.props
  4. 113
      aspnet-core/modules/common/LINGYUN.Abp.IM.SignalR/LINGYUN/Abp/IM/SignalR/Hubs/MessagesHub.cs
  5. 7
      aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageType.cs
  6. 15
      aspnet-core/modules/platform/LINGYUN.Abp.UI.Navigation.VueVbenAdmin/LINGYUN/Abp/UI/Navigation/VueVbenAdmin/AbpUINavigationVueVbenAdminNavigationDefinitionProvider.cs
  7. 13
      aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.ExceptionHandling/LINGYUN/Abp/BackgroundTasks/ExceptionHandling/JobFailedNotifierProvider.cs
  8. 30
      aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Jobs/LINGYUN/Abp/BackgroundTasks/Jobs/HttpRequestJobBase.cs
  9. 9
      aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobExecutorProvider.cs
  10. 38
      aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks.Quartz/LINGYUN/Abp/BackgroundTasks/Quartz/QuartzJobListener.cs
  11. 10
      aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/IJobEventTrigger.cs
  12. 53
      aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/JobEventTrigger.cs
  13. 15
      aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/BackgroundJobStore.cs
  14. 14
      aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.Domain/LINGYUN/Abp/TaskManagement/IBackgroundJobInfoRepository.cs
  15. 37
      aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobInfoRepository.cs
  16. 2
      gateways/Directory.Build.props

1
apps/vue/src/api/messages/model/messagesModel.ts

@ -14,6 +14,7 @@ export enum MessageType {
Video = 30, Video = 30,
Voice = 40, Voice = 40,
File = 50, File = 50,
Notifier = 100,
} }
export enum MessageState { export enum MessageState {

7
apps/vue/src/layouts/default/header/components/notify/useMessages.ts

@ -75,6 +75,10 @@ export function useMessages() {
message.extraProperties.content.Values as Recordable, message.extraProperties.content.Values as Recordable,
); );
} }
if (message.messageType === MessageType.Notifier) {
createMessage.info(message.content);
return;
}
if (message.groupId) { if (message.groupId) {
emitter.emit(ChatEventEnum.USER_MESSAGE_GROUP_NEW, message); emitter.emit(ChatEventEnum.USER_MESSAGE_GROUP_NEW, message);
} else { } else {
@ -117,7 +121,8 @@ export function useMessages() {
source: MessageSourceTye.User, source: MessageSourceTye.User,
isAnonymous: data.isAnonymous ?? false, isAnonymous: data.isAnonymous ?? false,
}; };
signalR.invoke('send', chatMessage).then(() => { signalR.invoke('send', chatMessage).then((id) => {
chatMessage.messageId = id;
!chatMessage.groupId && onMessageReceived(chatMessage); !chatMessage.groupId && onMessageReceived(chatMessage);
}); });
} }

2
aspnet-core/Directory.Build.props

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<VoloAbpPackageVersion>5.1.1</VoloAbpPackageVersion> <VoloAbpPackageVersion>5.1.1</VoloAbpPackageVersion>
<LINGYUNAbpPackageVersion>5.1.1</LINGYUNAbpPackageVersion> <LINGYUNAbpPackageVersion>5.1.1</LINGYUNAbpPackageVersion>
<DaprPackageVersion>1.5.0</DaprPackageVersion> <DaprPackageVersion>1.6.0</DaprPackageVersion>
<DistributedLockRedisPackageVersion>1.0.1</DistributedLockRedisPackageVersion> <DistributedLockRedisPackageVersion>1.0.1</DistributedLockRedisPackageVersion>
<DotNetCoreCAPPackageVersion>6.0.0</DotNetCoreCAPPackageVersion> <DotNetCoreCAPPackageVersion>6.0.0</DotNetCoreCAPPackageVersion>
<AliyunSDKPackageVersion>1.5.10</AliyunSDKPackageVersion> <AliyunSDKPackageVersion>1.5.10</AliyunSDKPackageVersion>

113
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.Groups;
using LINGYUN.Abp.IM.Localization; using LINGYUN.Abp.IM.Localization;
using LINGYUN.Abp.IM.Messages; using LINGYUN.Abp.IM.Messages;
using LINGYUN.Abp.RealTime;
using LINGYUN.Abp.RealTime.Localization; using LINGYUN.Abp.RealTime.Localization;
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.SignalR; using Microsoft.AspNetCore.SignalR;
@ -85,54 +84,80 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs
/// <param name="chatMessage"></param> /// <param name="chatMessage"></param>
/// <returns></returns> /// <returns></returns>
[HubMethodName("send")] [HubMethodName("send")]
public virtual async Task SendMessageAsync(ChatMessage chatMessage) public virtual async Task<string> SendMessageAsync(ChatMessage chatMessage)
{ {
await SendMessageAsync(Options.GetChatMessageMethod, chatMessage, true); return await SendMessageAsync(Options.GetChatMessageMethod, chatMessage, true);
} }
[HubMethodName("recall")] [HubMethodName("recall")]
public virtual async Task ReCallAsync(ChatMessage chatMessage) public virtual async Task ReCallAsync(ChatMessage chatMessage)
{ {
await Processor?.ReCallAsync(chatMessage); try
if (!chatMessage.GroupId.IsNullOrWhiteSpace())
{ {
await SendMessageAsync( await Processor?.ReCallAsync(chatMessage);
Options.ReCallChatMessageMethod, if (!chatMessage.GroupId.IsNullOrWhiteSpace())
ChatMessage.SystemLocalized( {
chatMessage.FormUserId, await SendMessageAsync(
chatMessage.GroupId, Options.ReCallChatMessageMethod,
new LocalizableStringInfo( ChatMessage.SystemLocalized(
LocalizationResourceNameAttribute.GetName(typeof(AbpIMResource)), chatMessage.FormUserId,
"Messages:RecallMessage", chatMessage.GroupId,
new Dictionary<object, object> new LocalizableStringInfo(
{ LocalizationResourceNameAttribute.GetName(typeof(AbpIMResource)),
"Messages:RecallMessage",
new Dictionary<object, object>
{
{ "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<object, object>
{
{ "User", chatMessage.FormUserName } { "User", chatMessage.FormUserName }
}), }),
Clock, Clock,
chatMessage.MessageType, chatMessage.MessageType,
chatMessage.TenantId) chatMessage.TenantId)
.SetProperty(nameof(ChatMessage.MessageId).ToPascalCase(), chatMessage.MessageId), .SetProperty(nameof(ChatMessage.MessageId).ToPascalCase(), chatMessage.MessageId),
callbackException: false); callbackException: false);
}
} }
else catch (Exception ex)
{ {
await SendMessageAsync( if (ex is IBusinessException)
Options.ReCallChatMessageMethod, {
ChatMessage.SystemLocalized( var errorInfo = ErrorInfoConverter.Convert(ex, options =>
chatMessage.ToUserId.Value, {
chatMessage.FormUserId, options.SendExceptionsDetailsToClients = false;
new LocalizableStringInfo( options.SendStackTraceToClients = false;
LocalizationResourceNameAttribute.GetName(typeof(AbpIMResource)), });
"Messages:RecallMessage",
new Dictionary<object, object> await SendMessageAsync(
{ Options.ReCallChatMessageMethod,
{ "User", chatMessage.FormUserName } ChatMessage.System(
}), chatMessage.ToUserId.Value,
Clock, chatMessage.FormUserId,
chatMessage.MessageType, errorInfo.Message,
chatMessage.TenantId) Clock,
.SetProperty(nameof(ChatMessage.MessageId).ToPascalCase(), chatMessage.MessageId), MessageType.Notifier,
callbackException: false); 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); await Processor?.ReadAsync(chatMessage);
} }
protected virtual async Task SendMessageAsync(string methodName, ChatMessage chatMessage, bool callbackException = false) protected virtual async Task<string> SendMessageAsync(string methodName, ChatMessage chatMessage, bool callbackException = false)
{ {
// 持久化 // 持久化
try try
@ -159,6 +184,8 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs
{ {
await SendMessageToUserAsync(methodName, chatMessage); await SendMessageToUserAsync(methodName, chatMessage);
} }
return chatMessage.MessageId;
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -178,7 +205,7 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs
chatMessage.GroupId, chatMessage.GroupId,
errorInfo.Message, errorInfo.Message,
Clock, Clock,
chatMessage.MessageType, MessageType.Notifier,
chatMessage.TenantId)); chatMessage.TenantId));
} }
else else
@ -190,11 +217,13 @@ namespace LINGYUN.Abp.IM.SignalR.Hubs
chatMessage.FormUserId, chatMessage.FormUserId,
errorInfo.Message, errorInfo.Message,
Clock, Clock,
chatMessage.MessageType, MessageType.Notifier,
chatMessage.TenantId)); chatMessage.TenantId));
} }
} }
} }
return "";
} }
protected virtual async Task SendMessageToGroupAsync(string methodName, ChatMessage chatMessage) protected virtual async Task SendMessageToGroupAsync(string methodName, ChatMessage chatMessage)

7
aspnet-core/modules/common/LINGYUN.Abp.IM/LINGYUN/Abp/IM/Messages/MessageType.cs

@ -25,6 +25,11 @@
/// <summary> /// <summary>
/// 文件 /// 文件
/// </summary> /// </summary>
File = 50 File = 50,
/// <summary>
/// 通知
/// 一般用于错误处理
/// </summary>
Notifier = 100,
} }
} }

15
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(GetManage());
context.Add(GetSaas()); context.Add(GetSaas());
context.Add(GetPlatform()); context.Add(GetPlatform());
context.Add(GetApiGateway()); // TODO: 网关不再需要动态管理
// context.Add(GetApiGateway());
context.Add(GetLocalization()); context.Add(GetLocalization());
context.Add(GetOssManagement()); context.Add(GetOssManagement());
context.Add(GetTaskManagement()); context.Add(GetTaskManagement());
@ -222,7 +223,8 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin
displayName: "平台管理", displayName: "平台管理",
url: "/platform", url: "/platform",
component: "", component: "",
description: "平台管理"); description: "平台管理",
icon: "ep:platform");
platform.AddItem( platform.AddItem(
new ApplicationMenu( new ApplicationMenu(
name: "DataDictionary", name: "DataDictionary",
@ -370,7 +372,7 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin
url: "/task-management", url: "/task-management",
component: "", component: "",
description: "任务调度平台", description: "任务调度平台",
icon: ""); icon: "bi:list-task");
task.AddItem( task.AddItem(
new ApplicationMenu( new ApplicationMenu(
name: "BackgroundJobs", name: "BackgroundJobs",
@ -378,6 +380,13 @@ namespace LINGYUN.Abp.UI.Navigation.VueVbenAdmin
url: "/task-management/background-jobs", url: "/task-management/background-jobs",
component: "/task-management/background-jobs/index", component: "/task-management/background-jobs/index",
description: "任务管理")); 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); return new NavigationDefinition(task);
} }

13
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<JobFailedNotifierProvider> Logger { protected get; set; } public ILogger<JobFailedNotifierProvider> Logger { protected get; set; }
protected IClock Clock { get; }
protected IEmailSender EmailSender { get; } protected IEmailSender EmailSender { get; }
protected ITemplateRenderer TemplateRenderer { get; } protected ITemplateRenderer TemplateRenderer { get; }
public JobFailedNotifierProvider( public JobFailedNotifierProvider(
IClock clock,
IEmailSender emailSender, IEmailSender emailSender,
ITemplateRenderer templateRenderer) ITemplateRenderer templateRenderer)
{ {
Clock = clock;
EmailSender = emailSender; EmailSender = emailSender;
TemplateRenderer = templateRenderer; TemplateRenderer = templateRenderer;
@ -63,15 +60,15 @@ public class JobFailedNotifierProvider : IJobFailedNotifierProvider, ITransientD
return; 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 var model = new
{ {
Title = subject, Title = subject,
Group = eventData.Group,
Name = eventData.Name,
Id = eventData.Key, Id = eventData.Key,
Type = eventData.Type, Group = eventData.Args.GetOrDefault(nameof(JobInfo.Group)) ?? eventData.Group,
Triggertime = Clock.Now.ToString("yyyy-MM-dd HH:mm:ss"), 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, Message = errorMessage,
Tenantname = eventData.Args.GetOrDefault(nameof(IMultiTenant.TenantId)), Tenantname = eventData.Args.GetOrDefault(nameof(IMultiTenant.TenantId)),
Footer = footer, Footer = footer,

30
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.Content;
using Volo.Abp.Http; using Volo.Abp.Http;
using Volo.Abp.Http.Client; using Volo.Abp.Http.Client;
using Volo.Abp.Localization;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
namespace LINGYUN.Abp.BackgroundTasks.Jobs; namespace LINGYUN.Abp.BackgroundTasks.Jobs;
public abstract class HttpRequestJobBase public abstract class HttpRequestJobBase
{ {
// 可选, 请求时指定区域性
public const string PropertyCulture = "culture";
protected ICurrentTenant CurrentTenant { get; set; } protected ICurrentTenant CurrentTenant { get; set; }
protected virtual void InitJob(JobRunnableContext context) protected virtual void InitJob(JobRunnableContext context)
@ -77,21 +81,25 @@ public abstract class HttpRequestJobBase
IReadOnlyDictionary<string, string> headers = null, IReadOnlyDictionary<string, string> headers = null,
string clientName = null) string clientName = null)
{ {
var request = BuildRequestMessage(httpMethod, requestUrl, data, contentType, headers); context.TryGetString(PropertyCulture, out var culture);
var clientFactory = context.GetRequiredService<IHttpClientFactory>(); using (CultureHelper.Use(culture ?? "en"))
{
var request = BuildRequestMessage(httpMethod, requestUrl, data, contentType, headers);
var clientFactory = context.GetRequiredService<IHttpClientFactory>();
var client = clientName.IsNullOrWhiteSpace() var client = clientName.IsNullOrWhiteSpace()
? clientFactory.CreateClient(BackgroundTasksConsts.DefaultHttpClient) ? clientFactory.CreateClient(BackgroundTasksConsts.DefaultHttpClient)
: clientFactory.CreateClient(clientName); : clientFactory.CreateClient(clientName);
var response = await client.SendAsync(request); var response = await client.SendAsync(request);
if (!response.IsSuccessStatusCode) if (!response.IsSuccessStatusCode)
{ {
await ThrowExceptionForResponseAsync(response); await ThrowExceptionForResponseAsync(response);
} }
return response; return response;
}
} }
protected virtual HttpRequestMessage BuildRequestMessage( protected virtual HttpRequestMessage BuildRequestMessage(

9
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) var jobBuilder = JobBuilder.Create(jobType)
.WithIdentity(KeyBuilder.CreateJobKey(job)) .WithIdentity(KeyBuilder.CreateJobKey(job))
.WithDescription(job.Description); .WithDescription(job.Description);
// 查询任务需要
jobBuilder.UsingJobData(nameof(JobInfo.Id), job.Id); 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(nameof(JobInfo.LockTimeOut), job.LockTimeOut);
// 传递的作业参数
jobBuilder.UsingJobData(new JobDataMap(job.Args)); jobBuilder.UsingJobData(new JobDataMap(job.Args));
if (job.TenantId.HasValue) if (job.TenantId.HasValue)
{ {
// 用于多租户场景
jobBuilder.UsingJobData(nameof(JobInfo.TenantId), job.TenantId.ToString()); jobBuilder.UsingJobData(nameof(JobInfo.TenantId), job.TenantId.ToString());
} }

38
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 Quartz.Listener;
using System; using System;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.MultiTenancy;
using Volo.Abp.Timing; using Volo.Abp.Timing;
namespace LINGYUN.Abp.BackgroundTasks.Quartz; namespace LINGYUN.Abp.BackgroundTasks.Quartz;
@ -21,16 +19,13 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency
public override string Name => "QuartzJobListener"; public override string Name => "QuartzJobListener";
protected IClock Clock { get; } protected IClock Clock { get; }
protected IJobEventProvider EventProvider { get; }
protected IServiceScopeFactory ServiceScopeFactory { get; } protected IServiceScopeFactory ServiceScopeFactory { get; }
public QuartzJobListener( public QuartzJobListener(
IClock clock, IClock clock,
IJobEventProvider eventProvider,
IServiceScopeFactory serviceScopeFactory) IServiceScopeFactory serviceScopeFactory)
{ {
Clock = clock; Clock = clock;
EventProvider = eventProvider;
ServiceScopeFactory = serviceScopeFactory; ServiceScopeFactory = serviceScopeFactory;
Logger = NullLogger<QuartzJobListener>.Instance; Logger = NullLogger<QuartzJobListener>.Instance;
@ -57,11 +52,6 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency
{ {
return; return;
} }
var jobEventList = EventProvider.GetAll();
if (!jobEventList.Any())
{
return;
}
using var scope = ServiceScopeFactory.CreateScope(); using var scope = ServiceScopeFactory.CreateScope();
var jobEventData = new JobEventData( var jobEventData = new JobEventData(
@ -78,15 +68,8 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency
scope.ServiceProvider, scope.ServiceProvider,
jobEventData); jobEventData);
var index = 0; var trigger = scope.ServiceProvider.GetRequiredService<IJobEventTrigger>();
var taskList = new Task[jobEventList.Count]; await trigger.OnJobBeforeExecuted(eventContext);
foreach (var jobEvent in jobEventList)
{
taskList[index] = jobEvent.OnJobBeforeExecuted(eventContext);
index++;
}
await Task.WhenAll(taskList);
} }
catch (Exception ex) catch (Exception ex)
{ {
@ -104,12 +87,6 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency
return; return;
} }
var jobEventList = EventProvider.GetAll();
if (!jobEventList.Any())
{
return;
}
using var scope = ServiceScopeFactory.CreateScope(); using var scope = ServiceScopeFactory.CreateScope();
var jobType = context.JobDetail.JobType; var jobType = context.JobDetail.JobType;
if (jobType.IsGenericType) if (jobType.IsGenericType)
@ -151,15 +128,8 @@ public class QuartzJobListener : JobListenerSupport, ISingletonDependency
scope.ServiceProvider, scope.ServiceProvider,
jobEventData); jobEventData);
var index = 0; var trigger = scope.ServiceProvider.GetRequiredService<IJobEventTrigger>();
var taskList = new Task[jobEventList.Count]; await trigger.OnJobAfterExecuted(eventContext);
foreach (var jobEvent in jobEventList)
{
taskList[index] = jobEvent.OnJobAfterExecuted(eventContext);
index++;
}
await Task.WhenAll(taskList);
} }
catch (Exception ex) catch (Exception ex)
{ {

10
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);
}

53
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);
}
}

15
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<JobInfo> FindAsync(string jobId) public async virtual Task<JobInfo> FindAsync(string jobId)
{ {
var jobInfo = await JobInfoRepository.FindAsync(jobId); return await JobInfoRepository.FindJobAsync(jobId);
return ObjectMapper.Map<BackgroundJobInfo, JobInfo>(jobInfo);
} }
[UnitOfWork] [UnitOfWork]
@ -128,7 +126,7 @@ public class BackgroundJobStore : IJobStore, ITransientDependency
}; };
jogLog.SetMessage( jogLog.SetMessage(
eventData.Exception == null ? eventData.Result ?? "OK" : "Failed", eventData.Exception == null ? eventData.Result ?? "OK" : GetSourceException(eventData.Exception).Message,
eventData.Exception); eventData.Exception);
await JobLogRepository.InsertAsync(jogLog); await JobLogRepository.InsertAsync(jogLog);
@ -148,4 +146,13 @@ public class BackgroundJobStore : IJobStore, ITransientDependency
await JobInfoRepository.DeleteManyAsync(jobs, cancellationToken: cancellationToken); await JobInfoRepository.DeleteManyAsync(jobs, cancellationToken: cancellationToken);
} }
protected virtual Exception GetSourceException(Exception exception)
{
if (exception.InnerException != null)
{
return GetSourceException(exception.InnerException);
}
return exception;
}
} }

14
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.Collections.Generic;
using System.Threading; using System.Threading;
using System.Threading.Tasks; using System.Threading.Tasks;
@ -13,6 +14,17 @@ public interface IBackgroundJobInfoRepository : IRepository<BackgroundJobInfo, s
string name, string name,
CancellationToken cancellationToken = default); CancellationToken cancellationToken = default);
/// <summary> /// <summary>
/// 获取作业
/// </summary>
/// <param name="id"></param>
/// <param name="includeDetails"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
Task<JobInfo> FindJobAsync(
string id,
bool includeDetails = true,
CancellationToken cancellationToken = default);
/// <summary>
/// 获取过期任务列表 /// 获取过期任务列表
/// </summary> /// </summary>
/// <param name="maxResultCount"></param> /// <param name="maxResultCount"></param>

37
aspnet-core/modules/task-management/LINGYUN.Abp.TaskManagement.EntityFrameworkCore/LINGYUN/Abp/TaskManagement/EntityFrameworkCore/EfCoreBackgroundJobInfoRepository.cs

@ -36,6 +36,43 @@ public class EfCoreBackgroundJobInfoRepository :
GetCancellationToken(cancellationToken)); GetCancellationToken(cancellationToken));
} }
public virtual async Task<JobInfo> 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<List<BackgroundJobInfo>> GetExpiredJobsAsync( public virtual async Task<List<BackgroundJobInfo>> GetExpiredJobsAsync(
int maxResultCount, int maxResultCount,
TimeSpan jobExpiratime, TimeSpan jobExpiratime,

2
gateways/Directory.Build.props

@ -2,7 +2,7 @@
<PropertyGroup> <PropertyGroup>
<VoloAbpPackageVersion>5.1.1</VoloAbpPackageVersion> <VoloAbpPackageVersion>5.1.1</VoloAbpPackageVersion>
<LINGYUNAbpPackageVersion>5.1.1</LINGYUNAbpPackageVersion> <LINGYUNAbpPackageVersion>5.1.1</LINGYUNAbpPackageVersion>
<DaprPackageVersion>1.5.0</DaprPackageVersion> <DaprPackageVersion>1.6.0</DaprPackageVersion>
<DotNetCoreCAPPackageVersion>5.2.0</DotNetCoreCAPPackageVersion> <DotNetCoreCAPPackageVersion>5.2.0</DotNetCoreCAPPackageVersion>
<AliyunSDKPackageVersion>1.5.10</AliyunSDKPackageVersion> <AliyunSDKPackageVersion>1.5.10</AliyunSDKPackageVersion>
<AliyunOSSSDKPackageVersion>2.13.0</AliyunOSSSDKPackageVersion> <AliyunOSSSDKPackageVersion>2.13.0</AliyunOSSSDKPackageVersion>

Loading…
Cancel
Save