From 7a21f9655249a20d6ff97807946ef4fdc02c5024 Mon Sep 17 00:00:00 2001 From: sbwalker Date: Wed, 31 May 2023 09:36:32 -0400 Subject: [PATCH] added IEventSubscriber amd EventDistributorHostedService to optimize event processing --- .../CacheInvalidationEventSubscriber.cs | 24 ++++++ .../CacheInvalidationHostedService.cs | 45 ----------- .../EventDistributorHostedService .cs | 80 +++++++++++++++++++ .../Interfaces/IEventSubscriber.cs | 9 +++ Oqtane.Server/Oqtane.Server.csproj | 2 +- 5 files changed, 114 insertions(+), 46 deletions(-) create mode 100644 Oqtane.Server/Infrastructure/EventSubscribers/CacheInvalidationEventSubscriber.cs delete mode 100644 Oqtane.Server/Infrastructure/HostedServices/CacheInvalidationHostedService.cs create mode 100644 Oqtane.Server/Infrastructure/HostedServices/EventDistributorHostedService .cs create mode 100644 Oqtane.Server/Infrastructure/Interfaces/IEventSubscriber.cs diff --git a/Oqtane.Server/Infrastructure/EventSubscribers/CacheInvalidationEventSubscriber.cs b/Oqtane.Server/Infrastructure/EventSubscribers/CacheInvalidationEventSubscriber.cs new file mode 100644 index 00000000..e608546d --- /dev/null +++ b/Oqtane.Server/Infrastructure/EventSubscribers/CacheInvalidationEventSubscriber.cs @@ -0,0 +1,24 @@ +using Microsoft.Extensions.Caching.Memory; +using Oqtane.Models; +using Oqtane.Shared; + +namespace Oqtane.Infrastructure.EventSubscribers +{ + public class CacheInvalidationEventSubscriber : IEventSubscriber + { + private readonly IMemoryCache _cache; + + public CacheInvalidationEventSubscriber(IMemoryCache cache) + { + _cache = cache; + } + + public void EntityChanged(SyncEvent syncEvent) + { + if (syncEvent.EntityName == "Site" && syncEvent.Action == SyncEventActions.Refresh) + { + _cache.Remove($"site:{syncEvent.TenantId}:{syncEvent.EntityId}"); + } + } + } +} diff --git a/Oqtane.Server/Infrastructure/HostedServices/CacheInvalidationHostedService.cs b/Oqtane.Server/Infrastructure/HostedServices/CacheInvalidationHostedService.cs deleted file mode 100644 index 68eade75..00000000 --- a/Oqtane.Server/Infrastructure/HostedServices/CacheInvalidationHostedService.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System.Threading.Tasks; -using System.Threading; -using Microsoft.Extensions.Hosting; -using Oqtane.Models; -using Microsoft.Extensions.Caching.Memory; -using Oqtane.Shared; - -namespace Oqtane.Infrastructure -{ - public class CacheInvalidationHostedService : IHostedService - { - private readonly ISyncManager _syncManager; - private readonly IMemoryCache _cache; - - public CacheInvalidationHostedService(ISyncManager syncManager, IMemoryCache cache) - { - _syncManager = syncManager; - _cache = cache; - } - - void EntityChanged(object sender, SyncEvent e) - { - if (e.EntityName == "Site" && e.Action == SyncEventActions.Refresh) - { - _cache.Remove($"site:{e.TenantId}:{e.EntityId}"); - } - } - - public Task StartAsync(CancellationToken cancellationToken) - { - _syncManager.EntityChanged += EntityChanged; - - return Task.CompletedTask; - } - - public Task StopAsync(CancellationToken cancellationToken) - { - return Task.CompletedTask; - } - public void Dispose() - { - _syncManager.EntityChanged -= EntityChanged; - } - } -} diff --git a/Oqtane.Server/Infrastructure/HostedServices/EventDistributorHostedService .cs b/Oqtane.Server/Infrastructure/HostedServices/EventDistributorHostedService .cs new file mode 100644 index 00000000..5c0ffa1c --- /dev/null +++ b/Oqtane.Server/Infrastructure/HostedServices/EventDistributorHostedService .cs @@ -0,0 +1,80 @@ +using System.Threading.Tasks; +using System.Threading; +using Microsoft.Extensions.Hosting; +using Oqtane.Models; +using System; +using System.Reflection; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Caching.Memory; +using System.Collections.Generic; +using Microsoft.Extensions.Logging; +using Oqtane.Shared; + +namespace Oqtane.Infrastructure +{ + public class EventDistributorHostedService : IHostedService + { + private readonly IServiceProvider _serviceProvider; + private readonly ISyncManager _syncManager; + private readonly IMemoryCache _cache; + private readonly ILogger _filelogger; + + public EventDistributorHostedService(IServiceProvider serviceProvider, ISyncManager syncManager, IMemoryCache cache, ILogger filelogger) + { + _serviceProvider = serviceProvider; + _syncManager = syncManager; + _cache = cache; + _filelogger = filelogger; + } + + void EntityChanged(object sender, SyncEvent syncEvent) + { + List eventSubscribers = _cache.GetOrCreate($"eventsubscribers", entry => + { + eventSubscribers = new List(); + var assemblies = AppDomain.CurrentDomain.GetOqtaneAssemblies(); + foreach (Assembly assembly in assemblies) + { + foreach (var type in assembly.GetTypes(typeof(IEventSubscriber))) + { + eventSubscribers.Add(type); + } + } + entry.Priority = CacheItemPriority.NeverRemove; + return eventSubscribers; + }); + + foreach (var type in eventSubscribers) + { + try + { + var obj = ActivatorUtilities.CreateInstance(_serviceProvider, type) as IEventSubscriber; + if (obj != null) + { + obj.EntityChanged(syncEvent); + } + } + catch (Exception ex) + { + _filelogger.LogError(Utilities.LogMessage(this, $"Error In EventSubscriber {type.AssemblyQualifiedName} - {ex.Message}")); + } + } + } + + public Task StartAsync(CancellationToken cancellationToken) + { + _syncManager.EntityChanged += EntityChanged; + + return Task.CompletedTask; + } + + public Task StopAsync(CancellationToken cancellationToken) + { + return Task.CompletedTask; + } + public void Dispose() + { + _syncManager.EntityChanged -= EntityChanged; + } + } +} diff --git a/Oqtane.Server/Infrastructure/Interfaces/IEventSubscriber.cs b/Oqtane.Server/Infrastructure/Interfaces/IEventSubscriber.cs new file mode 100644 index 00000000..11d154bf --- /dev/null +++ b/Oqtane.Server/Infrastructure/Interfaces/IEventSubscriber.cs @@ -0,0 +1,9 @@ +using Oqtane.Models; + +namespace Oqtane.Infrastructure +{ + public interface IEventSubscriber + { + void EntityChanged(SyncEvent syncEvent); + } +} diff --git a/Oqtane.Server/Oqtane.Server.csproj b/Oqtane.Server/Oqtane.Server.csproj index 21142b27..612d59a2 100644 --- a/Oqtane.Server/Oqtane.Server.csproj +++ b/Oqtane.Server/Oqtane.Server.csproj @@ -61,6 +61,6 @@ - +