diff --git a/projects/Infrastructure/Infrastructure.csproj b/projects/Infrastructure/Infrastructure.csproj index 6a6426e7..0ebd6148 100644 --- a/projects/Infrastructure/Infrastructure.csproj +++ b/projects/Infrastructure/Infrastructure.csproj @@ -10,7 +10,6 @@ - @@ -45,8 +44,6 @@ - - diff --git a/projects/Infrastructure/Web/BaseStartup.cs b/projects/Infrastructure/Web/BaseStartup.cs index da4bf2ff..0990f901 100644 --- a/projects/Infrastructure/Web/BaseStartup.cs +++ b/projects/Infrastructure/Web/BaseStartup.cs @@ -1,5 +1,3 @@ -using Hangfire; -using Hangfire.MemoryStorage; using Infrastructure.Application.Services.Settings; using Infrastructure.Data; using Infrastructure.Events; @@ -212,7 +210,6 @@ namespace Infrastructure.Web //}; }); } - this.UseScheduler(services); services.AddMemoryCache(); services.AddHttpContextAccessor(); @@ -237,11 +234,6 @@ namespace Infrastructure.Web } } - public virtual void UseScheduler(IServiceCollection services) - { - services.AddHangfire(x => x.UseMemoryStorage()); - } - public virtual void ConfigureOptions(IServiceCollection services) { services.ConfigureOptions(new FileConfigureOptions(this.Env)); @@ -363,7 +355,6 @@ namespace Infrastructure.Web app.UseSession(); this.UseAuthentication(app); this.UseSwagger(app); - this.UseScheduler(app); app.UseEndpoints(endpoints => { this.UseSignalR(endpoints); @@ -420,12 +411,6 @@ namespace Infrastructure.Web }); } - public virtual void UseScheduler(IApplicationBuilder app) - { - app.UseHangfireDashboard(pathMatch: "/job"); - app.UseHangfireServer(); - } - public virtual void UseSignalR(IEndpointRouteBuilder endpoints) { this.UseSignalR(endpoints); diff --git a/projects/IoTCenter/IoTCenter.csproj b/projects/IoTCenter/IoTCenter.csproj index a0e6871d..6bba8388 100644 --- a/projects/IoTCenter/IoTCenter.csproj +++ b/projects/IoTCenter/IoTCenter.csproj @@ -2,7 +2,7 @@ netcoreapp3.1 true - 1.0.0-beta.414.1 + 1.0.0-beta.414.2 diff --git a/projects/IoTCenter/Services/CacheEventHandler.cs b/projects/IoTCenter/Services/CacheEventHandler.cs new file mode 100644 index 00000000..b95d3502 --- /dev/null +++ b/projects/IoTCenter/Services/CacheEventHandler.cs @@ -0,0 +1,39 @@ +using Application.Domain.Entities; +using Infrastructure.Events; +using Microsoft.Extensions.Caching.Distributed; + +namespace IoTCenter.Services +{ + public class CacheEventHandler : + IEventHander>, + IEventHander>, + IEventHander> + { + private readonly IDistributedCache _cache; + + public CacheEventHandler(IDistributedCache cache) + { + this._cache = cache; + } + + public void Handle(EntityInsertedEvent message) + { + this.Remove(); + } + + public void Handle(EntityUpdatedEvent message) + { + this.Remove(); + } + + public void Handle(EntityDeletedEvent message) + { + this.Remove(); + } + + private void Remove() + { + this._cache.Remove(CacheKey.SceneTiggerKey); + } + } +} \ No newline at end of file diff --git a/projects/IoTCenter/Services/CacheKey.cs b/projects/IoTCenter/Services/CacheKey.cs new file mode 100644 index 00000000..48672e92 --- /dev/null +++ b/projects/IoTCenter/Services/CacheKey.cs @@ -0,0 +1,7 @@ +namespace IoTCenter.Services +{ + public class CacheKey + { + public static string SceneTiggerKey => nameof(SceneTiggerKey); + } +} \ No newline at end of file diff --git a/projects/IoTCenter/Services/CachedSceneTiggerService.cs b/projects/IoTCenter/Services/CachedSceneTiggerService.cs new file mode 100644 index 00000000..809c34cd --- /dev/null +++ b/projects/IoTCenter/Services/CachedSceneTiggerService.cs @@ -0,0 +1,30 @@ +using Application.Domain.Entities; +using Infrastructure.Extensions; +using Microsoft.Extensions.Caching.Distributed; +using System.Collections.Generic; + +namespace IoTCenter.Services +{ + public class CachedSceneTiggerService : ISceneTiggerService + { + private readonly IDistributedCache _cache; + private readonly SceneTiggerService _sceneTiggerService; + + public CachedSceneTiggerService(IDistributedCache cache, SceneTiggerService sceneTiggerService) + { + this._cache = cache; + this._sceneTiggerService = sceneTiggerService; + } + + public IList GetSceneTiggers() + { + var sceneTiggers = this._cache.Get>(CacheKey.SceneTiggerKey); + if (sceneTiggers == null) + { + sceneTiggers = this._sceneTiggerService.GetSceneTiggers(); + _cache.Set(CacheKey.SceneTiggerKey, sceneTiggers); + } + return sceneTiggers; + } + } +} \ No newline at end of file diff --git a/projects/IoTCenter/Services/ISceneTiggerService.cs b/projects/IoTCenter/Services/ISceneTiggerService.cs new file mode 100644 index 00000000..b44b041d --- /dev/null +++ b/projects/IoTCenter/Services/ISceneTiggerService.cs @@ -0,0 +1,10 @@ +using Application.Domain.Entities; +using System.Collections.Generic; + +namespace IoTCenter.Services +{ + public interface ISceneTiggerService + { + IList GetSceneTiggers(); + } +} \ No newline at end of file diff --git a/projects/IoTCenter/Services/IoTCenterEventHandler.cs b/projects/IoTCenter/Services/IoTCenterEventHandler.cs index f6cecbec..7679e169 100644 --- a/projects/IoTCenter/Services/IoTCenterEventHandler.cs +++ b/projects/IoTCenter/Services/IoTCenterEventHandler.cs @@ -25,9 +25,6 @@ namespace IoTCenter.Services IEventHander>, IEventHander>, IEventHander>, - IEventHander>, - IEventHander>, - IEventHander>, IEventHander>, IEventHander>, IEventHander>, @@ -47,12 +44,12 @@ namespace IoTCenter.Services IEventHander>, IEventHander> { - public static ConcurrentDictionary Tiggers = new ConcurrentDictionary(); private readonly IConfiguration _cfg; private readonly ILogger _logger; private readonly IRepository _sceneRepo; private readonly IRepository _deviceRepo; private readonly IRepository _sceneTiggerRepo; + private readonly ISceneTiggerService _sceneTiggerService; private readonly IHubContext _hub; private readonly IHttpClientFactory _httpClientFactory; @@ -61,6 +58,7 @@ namespace IoTCenter.Services IRepository sceneRepo, IRepository deviceRepo, IRepository sceneTiggerRepo, + ISceneTiggerService sceneTiggerService, IHubContext hub, IHttpClientFactory httpClientFactory) { @@ -69,6 +67,7 @@ namespace IoTCenter.Services this._sceneRepo = sceneRepo; this._deviceRepo = deviceRepo; this._sceneTiggerRepo = sceneTiggerRepo; + this._sceneTiggerService = sceneTiggerService; this._hub = hub; this._httpClientFactory = httpClientFactory; } @@ -119,39 +118,6 @@ namespace IoTCenter.Services #endregion timer - #region tigger - - public void Handle(EntityInsertedEvent message) - { - var tigger = message.Data; - if (_sceneRepo.ReadOnlyTable().Any(o => o.Id == tigger.SceneId && o.NodeId == null)) - { - Tiggers.TryRemove(message.Data.Id, out _); - Tiggers.TryAdd(tigger.Id, tigger); - } - } - - public void Handle(EntityUpdatedEvent message) - { - var tigger = message.Data; - if (_sceneRepo.ReadOnlyTable().Any(o => o.Id == tigger.SceneId && o.NodeId == null)) - { - Tiggers.TryRemove(message.Data.Id, out _); - Tiggers.TryAdd(tigger.Id, tigger); - } - } - - public void Handle(EntityDeletedEvent message) - { - var tigger = message.Data; - if (_sceneRepo.ReadOnlyTable().Any(o => o.Id == tigger.SceneId && o.NodeId == null)) - { - Tiggers.TryRemove(tigger.Id, out _); - } - } - - #endregion tigger - #region Product public void Handle(EntityInsertedEvent message) @@ -292,10 +258,9 @@ namespace IoTCenter.Services { try { - foreach (var item in Tiggers) + foreach (var tigger in this._sceneTiggerService.GetSceneTiggers()) { var data = message.Data; - var tigger = item.Value; if (tigger.DataId == data.Id) { var methodText = $"bool Valid(string name,string key,{data.Type.ToString().ToLower()} value,string description){{ return {tigger.Condition};}}"; diff --git a/projects/IoTCenter/Services/SceneTiggerService.cs b/projects/IoTCenter/Services/SceneTiggerService.cs new file mode 100644 index 00000000..46aac1d5 --- /dev/null +++ b/projects/IoTCenter/Services/SceneTiggerService.cs @@ -0,0 +1,22 @@ +using Application.Domain.Entities; +using Infrastructure.Data; +using System.Collections.Generic; +using System.Linq; + +namespace IoTCenter.Services +{ + public class SceneTiggerService : ISceneTiggerService + { + private readonly IRepository _sceneTiggerRepo; + + public SceneTiggerService(IRepository sceneTiggerRepo) + { + this._sceneTiggerRepo = sceneTiggerRepo; + } + + public IList GetSceneTiggers() + { + return this._sceneTiggerRepo.ReadOnlyTable().Where(o => o.Scene.NodeId == null && !o.Disabled).ToList(); + } + } +} \ No newline at end of file diff --git a/projects/IoTCenter/Startup.cs b/projects/IoTCenter/Startup.cs index 706d936e..35d00505 100644 --- a/projects/IoTCenter/Startup.cs +++ b/projects/IoTCenter/Startup.cs @@ -1,20 +1,15 @@ -using Application.Domain.Entities; -using Infrastructure.Data; +using Infrastructure.Data; using Infrastructure.Email; using Infrastructure.Sms; using Infrastructure.UI; using Infrastructure.Web; using IoT.Shared.Services; using IoTCenter.Services; -using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Routing; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Logging; using System.Collections.Generic; -using System.Linq; -using System.Threading.Tasks; namespace IoTCenter { @@ -26,6 +21,8 @@ namespace IoTCenter public override void ConfigureServices(IServiceCollection services) { + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -34,22 +31,6 @@ namespace IoTCenter base.ConfigureServices(services); } - public override void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) - { - base.Configure(app, env, loggerFactory); - // - Task.Run(() => - { - using var scope = app.ApplicationServices.CreateScope(); - var tiggerRepo = scope.ServiceProvider.GetService>(); - var tiggers = tiggerRepo.ReadOnlyTable().Where(o => o.Scene.NodeId == null).ToList(); - foreach (var tigger in tiggers) - { - IoTCenterEventHandler.Tiggers.TryAdd(tigger.Id, tigger); - } - }); - } - public override void ConfigureOptions(IServiceCollection services) { services.ConfigureOptions(new FileConfigureOptions(Env, new List { "IoT.Shared" })); diff --git a/projects/IoTNode/IoTNode.csproj b/projects/IoTNode/IoTNode.csproj index 884674e5..3b885e21 100644 --- a/projects/IoTNode/IoTNode.csproj +++ b/projects/IoTNode/IoTNode.csproj @@ -2,9 +2,12 @@ netcoreapp3.1 true - 1.0.0-beta.414 + 1.0.0-beta.414.3 + + + diff --git a/projects/IoTNode/Services/CacheEventHandler.cs b/projects/IoTNode/Services/CacheEventHandler.cs new file mode 100644 index 00000000..4e03b887 --- /dev/null +++ b/projects/IoTNode/Services/CacheEventHandler.cs @@ -0,0 +1,39 @@ +using Application.Domain.Entities; +using Infrastructure.Events; +using Microsoft.Extensions.Caching.Distributed; + +namespace IoTNode.Services +{ + public class CacheEventHandler : + IEventHander>, + IEventHander>, + IEventHander> + { + private readonly IDistributedCache _cache; + + public CacheEventHandler(IDistributedCache cache) + { + this._cache = cache; + } + + public void Handle(EntityInsertedEvent message) + { + this.Remove(); + } + + public void Handle(EntityUpdatedEvent message) + { + this.Remove(); + } + + public void Handle(EntityDeletedEvent message) + { + this.Remove(); + } + + private void Remove() + { + this._cache.Remove(CacheKey.SceneTiggerKey); + } + } +} \ No newline at end of file diff --git a/projects/IoTNode/Services/CacheKey.cs b/projects/IoTNode/Services/CacheKey.cs new file mode 100644 index 00000000..2ff8f325 --- /dev/null +++ b/projects/IoTNode/Services/CacheKey.cs @@ -0,0 +1,7 @@ +namespace IoTNode.Services +{ + public class CacheKey + { + public static string SceneTiggerKey => nameof(SceneTiggerKey); + } +} \ No newline at end of file diff --git a/projects/IoTNode/Services/CachedSceneTiggerService.cs b/projects/IoTNode/Services/CachedSceneTiggerService.cs new file mode 100644 index 00000000..9d8a98f8 --- /dev/null +++ b/projects/IoTNode/Services/CachedSceneTiggerService.cs @@ -0,0 +1,30 @@ +using Application.Domain.Entities; +using Infrastructure.Extensions; +using Microsoft.Extensions.Caching.Distributed; +using System.Collections.Generic; + +namespace IoTNode.Services +{ + public class CachedSceneTiggerService : ISceneTiggerService + { + private readonly IDistributedCache _cache; + private readonly SceneTiggerService _sceneTiggerService; + + public CachedSceneTiggerService(IDistributedCache cache, SceneTiggerService sceneTiggerService) + { + this._cache = cache; + this._sceneTiggerService = sceneTiggerService; + } + + public IList GetSceneTiggers() + { + var sceneTiggers = this._cache.Get>(CacheKey.SceneTiggerKey); + if (sceneTiggers == null) + { + sceneTiggers = this._sceneTiggerService.GetSceneTiggers(); + _cache.Set(CacheKey.SceneTiggerKey, sceneTiggers); + } + return sceneTiggers; + } + } +} \ No newline at end of file diff --git a/projects/IoTNode/Services/ISceneTiggerService.cs b/projects/IoTNode/Services/ISceneTiggerService.cs new file mode 100644 index 00000000..d5e43e5c --- /dev/null +++ b/projects/IoTNode/Services/ISceneTiggerService.cs @@ -0,0 +1,10 @@ +using Application.Domain.Entities; +using System.Collections.Generic; + +namespace IoTNode.Services +{ + public interface ISceneTiggerService + { + IList GetSceneTiggers(); + } +} \ No newline at end of file diff --git a/projects/IoTNode/Services/IoTNodeEventHandler.cs b/projects/IoTNode/Services/IoTNodeEventHandler.cs index 8c878301..0f78aca0 100644 --- a/projects/IoTNode/Services/IoTNodeEventHandler.cs +++ b/projects/IoTNode/Services/IoTNodeEventHandler.cs @@ -12,16 +12,14 @@ namespace IoTNode.Services IEventHander>, IEventHander>, IEventHander>, - IEventHander>, - IEventHander>, - IEventHander>, IEventHander> { - public static ConcurrentDictionary Tiggers = new ConcurrentDictionary(); + private readonly ISceneTiggerService _sceneTiggerService; private readonly IoTNodeJob _job; - public IoTNodeEventHandler(IoTNodeJob job) + public IoTNodeEventHandler(ISceneTiggerService sceneTiggerService, IoTNodeJob job) { + this._sceneTiggerService = sceneTiggerService; this._job = job; } @@ -40,28 +38,11 @@ namespace IoTNode.Services RecurringJob.RemoveIfExists(message.Data.Id.ToString()); } - public void Handle(EntityInsertedEvent message) - { - Tiggers.TryAdd(message.Data.Id, message.Data); - } - - public void Handle(EntityUpdatedEvent message) - { - Tiggers.TryRemove(message.Data.Id, out _); - Tiggers.TryAdd(message.Data.Id, message.Data); - } - - public void Handle(EntityDeletedEvent message) - { - Tiggers.TryRemove(message.Data.Id, out _); - } - public void Handle(EntityUpdatedEvent message) { var data = message.Data; - foreach (var item in Tiggers) + foreach (var tigger in this._sceneTiggerService.GetSceneTiggers()) { - var tigger = item.Value; if (tigger.DataId == data.Id) { var methodText = $"bool Valid(string name,string key,{data.Type.ToString().ToLower()} value,string description){{ return {tigger.Condition};}}"; diff --git a/projects/IoTNode/Services/IoTNodeJob.cs b/projects/IoTNode/Services/IoTNodeJob.cs index 42b95f10..3eb32e83 100644 --- a/projects/IoTNode/Services/IoTNodeJob.cs +++ b/projects/IoTNode/Services/IoTNodeJob.cs @@ -4,7 +4,6 @@ using IoT.Shared.Services; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using System; -using System.Diagnostics; using System.Linq; namespace IoTNode.Services diff --git a/projects/IoTNode/Services/SceneTiggerService.cs b/projects/IoTNode/Services/SceneTiggerService.cs new file mode 100644 index 00000000..74e29533 --- /dev/null +++ b/projects/IoTNode/Services/SceneTiggerService.cs @@ -0,0 +1,22 @@ +using Application.Domain.Entities; +using Infrastructure.Data; +using System.Collections.Generic; +using System.Linq; + +namespace IoTNode.Services +{ + public class SceneTiggerService : ISceneTiggerService + { + private readonly IRepository _sceneTiggerRepo; + + public SceneTiggerService(IRepository sceneTiggerRepo) + { + this._sceneTiggerRepo = sceneTiggerRepo; + } + + public IList GetSceneTiggers() + { + return this._sceneTiggerRepo.ReadOnlyTable().Where(o => !o.Disabled).ToList(); + } + } +} \ No newline at end of file diff --git a/projects/IoTNode/Startup.cs b/projects/IoTNode/Startup.cs index 30b16ec7..8e93b9d3 100644 --- a/projects/IoTNode/Startup.cs +++ b/projects/IoTNode/Startup.cs @@ -1,5 +1,5 @@ -using Application.Domain.Entities; -using Hangfire; +using Hangfire; +using Hangfire.LiteDB; using Infrastructure.Data; using Infrastructure.Email; using Infrastructure.Web; @@ -13,9 +13,6 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; -using System; -using System.Linq; -using System.Threading.Tasks; namespace IoTNode { @@ -27,6 +24,9 @@ namespace IoTNode public override void ConfigureServices(IServiceCollection services) { + services.AddHangfire(o => o.UseLiteDbStorage("job.db")); + services.AddTransient(); + services.AddTransient(); services.AddTransient(); services.AddTransient(); services.AddTransient(); @@ -47,22 +47,20 @@ namespace IoTNode public override void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) { base.Configure(app, env, loggerFactory); - Task.Run(() => - { - using var scope = app.ApplicationServices.CreateScope(); - var timerRepo = scope.ServiceProvider.GetService>(); - var timers = timerRepo.ReadOnlyTable().Where(o => o.Scene.NodeId != null).ToList(); - foreach (var timer in timers) - { - RecurringJob.AddOrUpdate(timer.Id.ToString(), o => o.TimerHanle(timer.Id), timer.Cron, TimeZoneInfo.Local); - } - var tiggerRepo = scope.ServiceProvider.GetService>(); - var tiggers = tiggerRepo.ReadOnlyTable().Where(o => o.Scene.NodeId != null).ToList(); - foreach (var tigger in tiggers) - { - IoTNodeEventHandler.Tiggers.TryAdd(tigger.Id, tigger); - } - }); + app.UseHangfireDashboard(pathMatch: "/job"); + + app.UseHangfireServer(); + + //Task.Run(() => + //{ + // using var scope = app.ApplicationServices.CreateScope(); + // var timerRepo = scope.ServiceProvider.GetService>(); + // var timers = timerRepo.ReadOnlyTable().Where(o => o.Scene.NodeId != null).ToList(); + // foreach (var timer in timers) + // { + // RecurringJob.AddOrUpdate(timer.Id.ToString(), o => o.TimerHanle(timer.Id), timer.Cron, TimeZoneInfo.Local); + // } + //}); } } } \ No newline at end of file