diff --git a/PARR.EsppTemplateSync/EsppTemplateSyncInstaller.cs b/PARR.EsppTemplateSync/EsppTemplateSyncInstaller.cs index 6dc8b6f2..6c5e8153 100644 --- a/PARR.EsppTemplateSync/EsppTemplateSyncInstaller.cs +++ b/PARR.EsppTemplateSync/EsppTemplateSyncInstaller.cs @@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection; using PARR.BLL; using PARR.DAL; using PARR.EsppTemplateSync.Services; +using PARR.EsppTemplateSync.Settings; namespace PARR.EsppTemplateSync { @@ -13,6 +14,10 @@ namespace PARR.EsppTemplateSync services.InstallBllServices(configuration); services.InstallDalServices(configuration); + var globalSettings = new GlobalSettings(); + configuration.GetSection(nameof(GlobalSettings)).Bind(globalSettings); + services.AddSingleton(globalSettings); + services.AddTransient(); services.AddTransient(); } diff --git a/PARR.EsppTemplateSync/ITemplateSyncer.cs b/PARR.EsppTemplateSync/ITemplateSyncer.cs index 3570eb51..0d548af4 100644 --- a/PARR.EsppTemplateSync/ITemplateSyncer.cs +++ b/PARR.EsppTemplateSync/ITemplateSyncer.cs @@ -2,7 +2,7 @@ { public interface ITemplateSyncer { - void StartWatching(); + Task StartWatchingAsync(); void StopWatching(); } } diff --git a/PARR.EsppTemplateSync/Settings/GlobalSettings.cs b/PARR.EsppTemplateSync/Settings/GlobalSettings.cs new file mode 100644 index 00000000..9a4c6317 --- /dev/null +++ b/PARR.EsppTemplateSync/Settings/GlobalSettings.cs @@ -0,0 +1,7 @@ +namespace PARR.EsppTemplateSync.Settings +{ + internal class GlobalSettings + { + public int CheckIntervalSeconds { get; set; } = 5; + } +} diff --git a/PARR.EsppTemplateSync/TemplateSyncer.cs b/PARR.EsppTemplateSync/TemplateSyncer.cs index 0844928b..a48f0f14 100644 --- a/PARR.EsppTemplateSync/TemplateSyncer.cs +++ b/PARR.EsppTemplateSync/TemplateSyncer.cs @@ -2,6 +2,7 @@ using PARR.BLL.Services.Interfaces; using PARR.BLL.Settings; using PARR.EsppTemplateSync.Services; +using PARR.EsppTemplateSync.Settings; namespace PARR.EsppTemplateSync { @@ -10,22 +11,24 @@ namespace PARR.EsppTemplateSync private readonly ILogger logger; private readonly IParserService parserService; private readonly IFileService fileService; + private readonly GlobalSettings globalSettings; private readonly string dirPath; private readonly string filterExtensions; - private FileSystemWatcher? watcher; + //private FileSystemWatcher? watcher; public TemplateSyncer( StorageSettings storageSettings, ILogger logger, IParserService parserService, - IFileService fileService + IFileService fileService, + GlobalSettings globalSettings ) { this.logger = logger; this.parserService = parserService; this.fileService = fileService; - + this.globalSettings = globalSettings; if (storageSettings.EsppTemplates == null) { logger.LogError("Нет секции настроек хранилища. StorageSettings, EsppTemplates"); @@ -38,7 +41,7 @@ namespace PARR.EsppTemplateSync filterExtensions = string.Join(",", storageSettings.EsppTemplates!.AllowedExtensions).Replace(".", "*."); } - public void StartWatching() + public async Task StartWatchingAsync() { //смотрим, доступна ли папка if (!Directory.Exists(dirPath)) @@ -47,49 +50,64 @@ namespace PARR.EsppTemplateSync throw new Exception($"Не найдена папка: {dirPath}."); } + logger.LogInformation($"Запущена проверка директории. Интервал: {globalSettings.CheckIntervalSeconds} секунд. Фильтр: {filterExtensions}"); + + while (true) + { + await GetFilesAsync(); + await Task.Delay(globalSettings.CheckIntervalSeconds * 1000); + } + // сначала обрабатываем существующие файлы, до тех пор пока все не обработаем // после обработки всех файлов, запускаем вотчер - GetExistingFilesAsync(); + //await GetFilesAsync(); - watcher = new FileSystemWatcher(dirPath); - watcher.NotifyFilter = NotifyFilters.FileName; - //watcher.Changed += OnChanged; - //todo: тут await??? - watcher.Created += OnChanged; + // код ниже, это то что надо использовать, но в доккере не работает watcher + ////--- watcher + //watcher = new FileSystemWatcher(dirPath); + //watcher.NotifyFilter = NotifyFilters.FileName; + ////watcher.Changed += OnChanged; + ////todo: тут await??? + //watcher.Created += OnChanged; - watcher.Filter = filterExtensions; - watcher.EnableRaisingEvents = true; + //watcher.Filter = filterExtensions; + //watcher.EnableRaisingEvents = true; + //watcher.IncludeSubdirectories = false; - logger.LogInformation($"--- --- --- FileWatcher запущен --- --- ---"); + ////=== watcher + + //logger.LogInformation($"--- --- --- FileWatcher запущен --- --- ---"); } + public void StopWatching() { - watcher?.Dispose(); + //watcher?.Dispose(); logger.LogInformation($"=== === === FileWatcher остановлен === === ==="); } - private async void OnChanged(object sender, FileSystemEventArgs e) - { - var path = e.FullPath; - await ParseFileAsync(path); - } + //private async void OnChanged(object sender, FileSystemEventArgs e) + //{ + // var path = e.FullPath; + // await ParseFileAsync(path); + //} - private async void GetExistingFilesAsync() + private async Task GetFilesAsync() { - // при первом запуске воркера, обрабатываем существующие файлы + // обрабатываем существующие файлы var files = Directory.GetFiles(this.dirPath, filterExtensions); - logger.LogInformation($"Запуск первоначальной загрузки файлов после старта сервиса. (До старта вотчера). Найдено файлов: {files.Length} шт."); + //logger.LogInformation($"Запуск первоначальной загрузки файлов после старта сервиса. (До старта вотчера). Найдено файлов: {files.Length} шт."); + logger.LogInformation($"Найдено файлов: {files.Length} шт."); foreach (var file in files) await ParseFileAsync(file); //если были файлы, запустим еще раз ручную обработку, вдруг за это время еще загрузили, а вотчер еще не был запущен //запускаем до тех пор, пока не останется необработанных файлов - if (files.Any()) - GetExistingFilesAsync(); + //if (files.Any()) + // await GetFilesAsync(); } diff --git a/PARR.EsppTemplateSyncWorker/Dockerfile b/PARR.EsppTemplateSyncWorker/Dockerfile index 43b37414..cde978df 100644 --- a/PARR.EsppTemplateSyncWorker/Dockerfile +++ b/PARR.EsppTemplateSyncWorker/Dockerfile @@ -23,8 +23,6 @@ FROM base AS final WORKDIR /app COPY --from=publish /app/publish . -ENV DOTNET_USE_POLLING_FILE_WATCHER=true - ENTRYPOINT ["dotnet", "PARR.EsppTemplateSyncWorker.dll"] ### EXAMPLE ### diff --git a/PARR.EsppTemplateSyncWorker/Worker.cs b/PARR.EsppTemplateSyncWorker/Worker.cs index 6bfa8ed4..f7f55b5a 100644 --- a/PARR.EsppTemplateSyncWorker/Worker.cs +++ b/PARR.EsppTemplateSyncWorker/Worker.cs @@ -15,13 +15,7 @@ namespace PARR.EsppTemplateSyncWorker protected override async Task ExecuteAsync(CancellationToken stoppingToken) { - //var task = new Task(() => - //{ - // templateSyncer.StartWatching(); - //}); - //task.Start(); - - templateSyncer.StartWatching(); + await templateSyncer.StartWatchingAsync(); //while (!stoppingToken.IsCancellationRequested) //{ diff --git a/PARR.EsppTemplateSyncWorker/appsettings.Development.json b/PARR.EsppTemplateSyncWorker/appsettings.Development.json index 58b8d3f6..f0b7b521 100644 --- a/PARR.EsppTemplateSyncWorker/appsettings.Development.json +++ b/PARR.EsppTemplateSyncWorker/appsettings.Development.json @@ -7,5 +7,8 @@ }, "StorageSettings": { "StoragePath": "W:\\" + }, + "GlobalSettings": { + "CheckIntervalSeconds": 5 } } diff --git a/PARR.EsppTemplateSyncWorker/appsettings.json b/PARR.EsppTemplateSyncWorker/appsettings.json index 7fa498f7..1c1e66aa 100644 --- a/PARR.EsppTemplateSyncWorker/appsettings.json +++ b/PARR.EsppTemplateSyncWorker/appsettings.json @@ -30,5 +30,8 @@ "AllowedExtensions": [ ".csv" ], "MaxFileSizeMb": 100 } + }, + "GlobalSettings": { + "CheckIntervalSeconds": 30 } }