From b9835cd04bdadf914abe4091c4384dd47db625a6 Mon Sep 17 00:00:00 2001 From: cKey <35512826+colinin@users.noreply.github.com> Date: Tue, 23 Jun 2020 22:15:09 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=90=8E=E5=8F=B0=E6=B8=85?= =?UTF-8?q?=E7=90=86=E8=BF=87=E6=9C=9F=E9=80=9A=E7=9F=A5=E4=BB=BB=E5=8A=A1?= =?UTF-8?q?;=E4=BF=AE=E5=A4=8D=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF;?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../WeChatWeAppNotificationPublishProvider.cs | 14 ++++++- .../AbpNotificationCleanupOptions.cs | 21 ++++++++++ .../Notifications/AbpNotificationModule.cs | 16 ++++++++ .../NotificationCleanupBackgroundWorker.cs | 41 +++++++++++++++++++ ...essageService.Application.Contracts.csproj | 8 ++++ ...ssageServiceApplicationContractsModule.cs} | 4 +- ...GYUN.Abp.MessageService.Application.csproj | 8 ++++ .../AbpMessageServiceApplicationModule.cs | 2 +- .../Notifications/Notification.cs | 6 +++ .../Chat/EfCoreUserChatGroupRepository.cs | 2 + .../EfCoreNotificationRepository.cs | 7 +++- ...N.Abp.MessageService.HttpApi.Client.csproj | 23 +++++++++++ .../AbpMessageServiceHttpApiClientModule.cs | 20 +++++++++ .../AbpMessageServiceHttpApiModule.cs | 2 +- .../AbpMessageServiceHttpApiHostModule.cs | 14 +++---- .../PlatformHttpApiHostModule.cs | 2 +- 16 files changed, 175 insertions(+), 15 deletions(-) create mode 100644 aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/AbpNotificationCleanupOptions.cs create mode 100644 aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/Internal/NotificationCleanupBackgroundWorker.cs rename aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/{AbpMessageServiceApplicationContrantsModule.cs => AbpMessageServiceApplicationContractsModule.cs} (89%) rename aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/{ => LINGYUN/Abp/MessageService}/AbpMessageServiceApplicationModule.cs (77%) create mode 100644 aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi.Client/LINGYUN.Abp.MessageService.HttpApi.Client.csproj create mode 100644 aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi.Client/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiClientModule.cs diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.WeChat/LINGYUN/Abp/Notifications/WeChat/WeApp/WeChatWeAppNotificationPublishProvider.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.WeChat/LINGYUN/Abp/Notifications/WeChat/WeApp/WeChatWeAppNotificationPublishProvider.cs index 441086346..e6c21fac6 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications.WeChat/LINGYUN/Abp/Notifications/WeChat/WeApp/WeChatWeAppNotificationPublishProvider.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications.WeChat/LINGYUN/Abp/Notifications/WeChat/WeApp/WeChatWeAppNotificationPublishProvider.cs @@ -2,6 +2,7 @@ using Microsoft.Extensions.Options; using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; namespace LINGYUN.Abp.Notifications.WeChat.WeApp @@ -12,7 +13,8 @@ namespace LINGYUN.Abp.Notifications.WeChat.WeApp public class WeChatWeAppNotificationPublishProvider : NotificationPublishProvider { public override string Name => "WeChat.WeApp"; - + private INotificationSubscriptionManager _notificationSubscriptionManager; + protected INotificationSubscriptionManager NotificationSubscriptionManager => LazyGetRequiredService(ref _notificationSubscriptionManager); protected IWeChatWeAppNotificationSender NotificationSender { get; } protected AbpWeChatWeAppNotificationOptions Options { get; } public WeChatWeAppNotificationPublishProvider( @@ -32,6 +34,16 @@ namespace LINGYUN.Abp.Notifications.WeChat.WeApp // step2 调用微信消息推送接口 + // 微信不支持推送到所有用户,需要获取订阅列表再发送 + // 在小程序里用户订阅消息后通过 api/subscribes/subscribe 接口订阅对应模板消息 + if (identifiers == null) + { + var userSubscriptions = await NotificationSubscriptionManager + .GetSubscriptionsAsync(notification.TenantId, notification.Name); + identifiers = userSubscriptions + .Select(us => new UserIdentifier(us.UserId, us.UserName)); + + } foreach (var identifier in identifiers) { await SendWeChatTemplateMessagAsync(notification, identifier); diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/AbpNotificationCleanupOptions.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/AbpNotificationCleanupOptions.cs new file mode 100644 index 000000000..3c92996b2 --- /dev/null +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/AbpNotificationCleanupOptions.cs @@ -0,0 +1,21 @@ +namespace LINGYUN.Abp.Notifications +{ + public class AbpNotificationCleanupOptions + { + /// + /// 是否启用清理任务 + /// 默认:启用 + /// + public bool IsEnabled { get; set; } = true; + /// + /// 清理时间间隔 + /// 默认:300000ms + /// + public int CleanupPeriod { get; set; } = 300000; + /// + /// 清理批次 + /// 默认: 200 + /// + public int CleanupBatchSize { get; set; } = 200; + } +} diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/AbpNotificationModule.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/AbpNotificationModule.cs index 30bf9376b..f4eeb1ff5 100644 --- a/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/AbpNotificationModule.cs +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/AbpNotificationModule.cs @@ -1,9 +1,11 @@ using LINGYUN.Abp.Notifications.Internal; using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Options; using System; using System.Collections.Generic; using Volo.Abp; using Volo.Abp.BackgroundJobs; +using Volo.Abp.BackgroundWorkers; using Volo.Abp.Json; using Volo.Abp.Modularity; @@ -25,6 +27,20 @@ namespace LINGYUN.Abp.Notifications context.Services.AddTransient(); } + public override void OnApplicationInitialization(ApplicationInitializationContext context) + { + var options = context.ServiceProvider.GetRequiredService>().Value; + if (options.IsEnabled) + { + context.ServiceProvider + .GetRequiredService() + .Add( + context.ServiceProvider + .GetRequiredService() + ); + } + } + private static void AutoAddDefinitionProviders(IServiceCollection services) { var definitionProviders = new List(); diff --git a/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/Internal/NotificationCleanupBackgroundWorker.cs b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/Internal/NotificationCleanupBackgroundWorker.cs new file mode 100644 index 000000000..1dd7fb608 --- /dev/null +++ b/aspnet-core/modules/common/LINGYUN.Abp.Notifications/LINGYUN/Abp/Notifications/Internal/NotificationCleanupBackgroundWorker.cs @@ -0,0 +1,41 @@ +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System; +using System.Threading.Tasks; +using Volo.Abp.BackgroundWorkers; +using Volo.Abp.Threading; + +namespace LINGYUN.Abp.Notifications.Internal +{ + internal class NotificationCleanupBackgroundWorker : AsyncPeriodicBackgroundWorkerBase + { + protected AbpNotificationCleanupOptions Options { get; } + + public NotificationCleanupBackgroundWorker( + AbpTimer timer, + IServiceScopeFactory serviceScopeFactory, + IOptions options) + : base(timer, serviceScopeFactory) + { + Options = options.Value; + timer.Period = Options.CleanupPeriod; + } + + protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext) + { + try + { + var store = workerContext.ServiceProvider.GetRequiredService(); + Logger.LogDebug("Before cleanup exprition jobs..."); + await store.DeleteNotificationAsync(Options.CleanupBatchSize); + Logger.LogDebug("Exprition jobs cleanup job was successful..."); + } + catch (Exception ex) + { + Logger.LogWarning("Exprition jobs cleanup job was failed..."); + Logger.LogWarning("Error:{0}", ex.Message); + } + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN.Abp.MessageService.Application.Contracts.csproj b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN.Abp.MessageService.Application.Contracts.csproj index 99b0704d5..7dd324638 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN.Abp.MessageService.Application.Contracts.csproj +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN.Abp.MessageService.Application.Contracts.csproj @@ -3,8 +3,16 @@ netstandard2.0 + true + 2.9.0 + LINGYUN + + D:\LocalNuget + + + diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/AbpMessageServiceApplicationContrantsModule.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/AbpMessageServiceApplicationContractsModule.cs similarity index 89% rename from aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/AbpMessageServiceApplicationContrantsModule.cs rename to aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/AbpMessageServiceApplicationContractsModule.cs index 000532693..d2fc22278 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/AbpMessageServiceApplicationContrantsModule.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application.Contracts/LINGYUN/Abp/MessageService/AbpMessageServiceApplicationContractsModule.cs @@ -6,13 +6,13 @@ using Volo.Abp.VirtualFileSystem; namespace LINGYUN.Abp.MessageService { [DependsOn(typeof(AbpMessageServiceDomainSharedModule))] - public class AbpMessageServiceApplicationContrantsModule : AbpModule + public class AbpMessageServiceApplicationContractsModule : AbpModule { public override void ConfigureServices(ServiceConfigurationContext context) { Configure(options => { - options.FileSets.AddEmbedded(); + options.FileSets.AddEmbedded(); }); Configure(options => diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN.Abp.MessageService.Application.csproj b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN.Abp.MessageService.Application.csproj index a158701e2..4d65e3c0e 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN.Abp.MessageService.Application.csproj +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN.Abp.MessageService.Application.csproj @@ -3,8 +3,16 @@ netstandard2.0 + true + 2.9.0 + LINGYUN + + D:\LocalNuget + + + diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/AbpMessageServiceApplicationModule.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/AbpMessageServiceApplicationModule.cs similarity index 77% rename from aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/AbpMessageServiceApplicationModule.cs rename to aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/AbpMessageServiceApplicationModule.cs index 8351d0454..61620440f 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/AbpMessageServiceApplicationModule.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Application/LINGYUN/Abp/MessageService/AbpMessageServiceApplicationModule.cs @@ -3,7 +3,7 @@ namespace LINGYUN.Abp.MessageService { [DependsOn( - typeof(AbpMessageServiceApplicationContrantsModule), + typeof(AbpMessageServiceApplicationContractsModule), typeof(AbpMessageServiceDomainModule))] public class AbpMessageServiceApplicationModule : AbpModule { diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/Notification.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/Notification.cs index 75d49b423..947cc3d65 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/Notification.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.Domain/LINGYUN/Abp/MessageService/Notifications/Notification.cs @@ -19,6 +19,12 @@ namespace LINGYUN.Abp.MessageService.Notifications public virtual DateTime? ExpirationTime { get; set; } public virtual DateTime CreationTime { get; set; } protected Notification(){} + + public Notification(long id) + { + Id = id; + } + public Notification(long id, string category, string name, string dataType, string data, NotificationSeverity severity = NotificationSeverity.Info) { NotificationId = id; diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatGroupRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatGroupRepository.cs index d77b60a04..388afa740 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatGroupRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Chat/EfCoreUserChatGroupRepository.cs @@ -1,6 +1,8 @@ using LINGYUN.Abp.IM.Group; using LINGYUN.Abp.MessageService.EntityFrameworkCore; using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Internal; using System; using System.Collections.Generic; using System.Linq; diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Notifications/EfCoreNotificationRepository.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Notifications/EfCoreNotificationRepository.cs index f6fd96e39..c4f698b56 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Notifications/EfCoreNotificationRepository.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.EntityFrameworkCore/LINGYUN/Abp/MessageService/Notifications/EfCoreNotificationRepository.cs @@ -20,12 +20,15 @@ namespace LINGYUN.Abp.MessageService.Notifications public async Task DeleteExpritionAsync(int batchCount) { - var notifications = await DbSet + var batchDeleteNoticeWithIds = await DbSet .Where(x => x.ExpirationTime <= DateTime.Now) .Take(batchCount) + .Select(x => new Notification(x.Id)) + .AsNoTracking() .ToArrayAsync(); - DbSet.RemoveRange(notifications); + DbSet.AttachRange(batchDeleteNoticeWithIds); + DbSet.RemoveRange(batchDeleteNoticeWithIds); } public async Task GetByIdAsync(long notificationId) diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi.Client/LINGYUN.Abp.MessageService.HttpApi.Client.csproj b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi.Client/LINGYUN.Abp.MessageService.HttpApi.Client.csproj new file mode 100644 index 000000000..1ae461b35 --- /dev/null +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi.Client/LINGYUN.Abp.MessageService.HttpApi.Client.csproj @@ -0,0 +1,23 @@ + + + + netcoreapp3.1 + + true + 2.9.0 + LINGYUN + + + + D:\LocalNuget + + + + + + + + + + + diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi.Client/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiClientModule.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi.Client/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiClientModule.cs new file mode 100644 index 000000000..9ecf88a18 --- /dev/null +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi.Client/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiClientModule.cs @@ -0,0 +1,20 @@ +using Microsoft.Extensions.DependencyInjection; +using Volo.Abp.Http.Client; +using Volo.Abp.Modularity; + +namespace LINGYUN.Abp.MessageService +{ + [DependsOn( + typeof(AbpMessageServiceApplicationContractsModule), + typeof(AbpHttpClientModule))] + public class AbpMessageServiceHttpApiClientModule : AbpModule + { + public override void ConfigureServices(ServiceConfigurationContext context) + { + context.Services.AddHttpClientProxies( + typeof(AbpMessageServiceApplicationContractsModule).Assembly, + AbpMessageServiceConsts.RemoteServiceName + ); + } + } +} diff --git a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiModule.cs b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiModule.cs index d01c83ef2..32d2e9bf0 100644 --- a/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiModule.cs +++ b/aspnet-core/modules/message/LINGYUN.Abp.MessageService.HttpApi/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiModule.cs @@ -5,7 +5,7 @@ using Volo.Abp.Modularity; namespace LINGYUN.Abp.MessageService { [DependsOn( - typeof(AbpMessageServiceApplicationContrantsModule), + typeof(AbpMessageServiceApplicationContractsModule), typeof(AbpAspNetCoreMvcModule) )] public class AbpMessageServiceHttpApiModule : AbpModule diff --git a/aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiHostModule.cs b/aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiHostModule.cs index 4df950c71..e0abc20ae 100644 --- a/aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiHostModule.cs +++ b/aspnet-core/services/messages/LINGYUN.Abp.MessageService.HttpApi.Host/LINGYUN/Abp/MessageService/AbpMessageServiceHttpApiHostModule.cs @@ -156,13 +156,13 @@ namespace LINGYUN.Abp.MessageService } } - public override void OnPostApplicationInitialization(ApplicationInitializationContext context) - { - var backgroundJobManager = context.ServiceProvider.GetRequiredService(); - // 五分钟执行一次的定时任务 - AsyncHelper.RunSync(async () => await - backgroundJobManager.EnqueueAsync(CronGenerator.Minute(5), new NotificationCleanupExpritionJobArgs(200))); - } + //public override void OnPostApplicationInitialization(ApplicationInitializationContext context) + //{ + // var backgroundJobManager = context.ServiceProvider.GetRequiredService(); + // // 五分钟执行一次的定时任务 + // AsyncHelper.RunSync(async () => await + // backgroundJobManager.EnqueueAsync(CronGenerator.Minute(5), new NotificationCleanupExpritionJobArgs(200))); + //} public override void OnApplicationInitialization(ApplicationInitializationContext context) { diff --git a/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/PlatformHttpApiHostModule.cs b/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/PlatformHttpApiHostModule.cs index d4afc33c3..c026d3afc 100644 --- a/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/PlatformHttpApiHostModule.cs +++ b/aspnet-core/services/platform/LINGYUN.Platform.HttpApi.Host/PlatformHttpApiHostModule.cs @@ -54,7 +54,7 @@ namespace LINGYUN.Platform typeof(AbpPermissionManagementDomainIdentityModule), typeof(AbpPermissionManagementDomainIdentityServerModule), typeof(ApiGatewayApplicationContractsModule), - typeof(AbpMessageServiceApplicationContrantsModule), + typeof(AbpMessageServiceApplicationContractsModule), typeof(AbpIdentityHttpApiModule), typeof(AbpIdentityApplicationModule), typeof(Abp.Account.AbpAccountApplicationModule),