Убрал все эти watchers. Написал свой простой как 3 копейки.
This commit is contained in:
@@ -3,6 +3,7 @@ using Microsoft.Extensions.DependencyInjection;
|
|||||||
using PARR.BLL;
|
using PARR.BLL;
|
||||||
using PARR.DAL;
|
using PARR.DAL;
|
||||||
using PARR.EsppTemplateSync.Services;
|
using PARR.EsppTemplateSync.Services;
|
||||||
|
using PARR.EsppTemplateSync.Settings;
|
||||||
|
|
||||||
namespace PARR.EsppTemplateSync
|
namespace PARR.EsppTemplateSync
|
||||||
{
|
{
|
||||||
@@ -13,6 +14,10 @@ namespace PARR.EsppTemplateSync
|
|||||||
services.InstallBllServices(configuration);
|
services.InstallBllServices(configuration);
|
||||||
services.InstallDalServices(configuration);
|
services.InstallDalServices(configuration);
|
||||||
|
|
||||||
|
var globalSettings = new GlobalSettings();
|
||||||
|
configuration.GetSection(nameof(GlobalSettings)).Bind(globalSettings);
|
||||||
|
services.AddSingleton(globalSettings);
|
||||||
|
|
||||||
services.AddTransient<ITemplateSyncer, TemplateSyncer>();
|
services.AddTransient<ITemplateSyncer, TemplateSyncer>();
|
||||||
services.AddTransient<IParserService, ParserService>();
|
services.AddTransient<IParserService, ParserService>();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
public interface ITemplateSyncer
|
public interface ITemplateSyncer
|
||||||
{
|
{
|
||||||
void StartWatching();
|
Task StartWatchingAsync();
|
||||||
void StopWatching();
|
void StopWatching();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
7
PARR.EsppTemplateSync/Settings/GlobalSettings.cs
Normal file
7
PARR.EsppTemplateSync/Settings/GlobalSettings.cs
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
namespace PARR.EsppTemplateSync.Settings
|
||||||
|
{
|
||||||
|
internal class GlobalSettings
|
||||||
|
{
|
||||||
|
public int CheckIntervalSeconds { get; set; } = 5;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -2,6 +2,7 @@
|
|||||||
using PARR.BLL.Services.Interfaces;
|
using PARR.BLL.Services.Interfaces;
|
||||||
using PARR.BLL.Settings;
|
using PARR.BLL.Settings;
|
||||||
using PARR.EsppTemplateSync.Services;
|
using PARR.EsppTemplateSync.Services;
|
||||||
|
using PARR.EsppTemplateSync.Settings;
|
||||||
|
|
||||||
namespace PARR.EsppTemplateSync
|
namespace PARR.EsppTemplateSync
|
||||||
{
|
{
|
||||||
@@ -10,22 +11,24 @@ namespace PARR.EsppTemplateSync
|
|||||||
private readonly ILogger<TemplateSyncer> logger;
|
private readonly ILogger<TemplateSyncer> logger;
|
||||||
private readonly IParserService parserService;
|
private readonly IParserService parserService;
|
||||||
private readonly IFileService fileService;
|
private readonly IFileService fileService;
|
||||||
|
private readonly GlobalSettings globalSettings;
|
||||||
private readonly string dirPath;
|
private readonly string dirPath;
|
||||||
private readonly string filterExtensions;
|
private readonly string filterExtensions;
|
||||||
|
|
||||||
private FileSystemWatcher? watcher;
|
//private FileSystemWatcher? watcher;
|
||||||
|
|
||||||
public TemplateSyncer(
|
public TemplateSyncer(
|
||||||
StorageSettings storageSettings,
|
StorageSettings storageSettings,
|
||||||
ILogger<TemplateSyncer> logger,
|
ILogger<TemplateSyncer> logger,
|
||||||
IParserService parserService,
|
IParserService parserService,
|
||||||
IFileService fileService
|
IFileService fileService,
|
||||||
|
GlobalSettings globalSettings
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
this.logger = logger;
|
this.logger = logger;
|
||||||
this.parserService = parserService;
|
this.parserService = parserService;
|
||||||
this.fileService = fileService;
|
this.fileService = fileService;
|
||||||
|
this.globalSettings = globalSettings;
|
||||||
if (storageSettings.EsppTemplates == null)
|
if (storageSettings.EsppTemplates == null)
|
||||||
{
|
{
|
||||||
logger.LogError("Нет секции настроек хранилища. StorageSettings, EsppTemplates");
|
logger.LogError("Нет секции настроек хранилища. StorageSettings, EsppTemplates");
|
||||||
@@ -38,7 +41,7 @@ namespace PARR.EsppTemplateSync
|
|||||||
filterExtensions = string.Join(",", storageSettings.EsppTemplates!.AllowedExtensions).Replace(".", "*.");
|
filterExtensions = string.Join(",", storageSettings.EsppTemplates!.AllowedExtensions).Replace(".", "*.");
|
||||||
}
|
}
|
||||||
|
|
||||||
public void StartWatching()
|
public async Task StartWatchingAsync()
|
||||||
{
|
{
|
||||||
//смотрим, доступна ли папка
|
//смотрим, доступна ли папка
|
||||||
if (!Directory.Exists(dirPath))
|
if (!Directory.Exists(dirPath))
|
||||||
@@ -47,49 +50,64 @@ namespace PARR.EsppTemplateSync
|
|||||||
throw new Exception($"Не найдена папка: {dirPath}.");
|
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
|
||||||
watcher.NotifyFilter = NotifyFilters.FileName;
|
////--- watcher
|
||||||
//watcher.Changed += OnChanged;
|
//watcher = new FileSystemWatcher(dirPath);
|
||||||
//todo: тут await???
|
//watcher.NotifyFilter = NotifyFilters.FileName;
|
||||||
watcher.Created += OnChanged;
|
////watcher.Changed += OnChanged;
|
||||||
|
////todo: тут await???
|
||||||
|
//watcher.Created += OnChanged;
|
||||||
|
|
||||||
watcher.Filter = filterExtensions;
|
//watcher.Filter = filterExtensions;
|
||||||
watcher.EnableRaisingEvents = true;
|
//watcher.EnableRaisingEvents = true;
|
||||||
|
//watcher.IncludeSubdirectories = false;
|
||||||
|
|
||||||
logger.LogInformation($"--- --- --- FileWatcher запущен --- --- ---");
|
////=== watcher
|
||||||
|
|
||||||
|
//logger.LogInformation($"--- --- --- FileWatcher запущен --- --- ---");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public void StopWatching()
|
public void StopWatching()
|
||||||
{
|
{
|
||||||
watcher?.Dispose();
|
//watcher?.Dispose();
|
||||||
logger.LogInformation($"=== === === FileWatcher остановлен === === ===");
|
logger.LogInformation($"=== === === FileWatcher остановлен === === ===");
|
||||||
}
|
}
|
||||||
|
|
||||||
private async void OnChanged(object sender, FileSystemEventArgs e)
|
//private async void OnChanged(object sender, FileSystemEventArgs e)
|
||||||
{
|
//{
|
||||||
var path = e.FullPath;
|
// var path = e.FullPath;
|
||||||
await ParseFileAsync(path);
|
// await ParseFileAsync(path);
|
||||||
}
|
//}
|
||||||
|
|
||||||
private async void GetExistingFilesAsync()
|
private async Task GetFilesAsync()
|
||||||
{
|
{
|
||||||
// при первом запуске воркера, обрабатываем существующие файлы
|
// обрабатываем существующие файлы
|
||||||
var files = Directory.GetFiles(this.dirPath, filterExtensions);
|
var files = Directory.GetFiles(this.dirPath, filterExtensions);
|
||||||
|
|
||||||
logger.LogInformation($"Запуск первоначальной загрузки файлов после старта сервиса. (До старта вотчера). Найдено файлов: {files.Length} шт.");
|
//logger.LogInformation($"Запуск первоначальной загрузки файлов после старта сервиса. (До старта вотчера). Найдено файлов: {files.Length} шт.");
|
||||||
|
logger.LogInformation($"Найдено файлов: {files.Length} шт.");
|
||||||
|
|
||||||
foreach (var file in files)
|
foreach (var file in files)
|
||||||
await ParseFileAsync(file);
|
await ParseFileAsync(file);
|
||||||
|
|
||||||
//если были файлы, запустим еще раз ручную обработку, вдруг за это время еще загрузили, а вотчер еще не был запущен
|
//если были файлы, запустим еще раз ручную обработку, вдруг за это время еще загрузили, а вотчер еще не был запущен
|
||||||
//запускаем до тех пор, пока не останется необработанных файлов
|
//запускаем до тех пор, пока не останется необработанных файлов
|
||||||
if (files.Any())
|
//if (files.Any())
|
||||||
GetExistingFilesAsync();
|
// await GetFilesAsync();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -23,8 +23,6 @@ FROM base AS final
|
|||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
COPY --from=publish /app/publish .
|
COPY --from=publish /app/publish .
|
||||||
|
|
||||||
ENV DOTNET_USE_POLLING_FILE_WATCHER=true
|
|
||||||
|
|
||||||
ENTRYPOINT ["dotnet", "PARR.EsppTemplateSyncWorker.dll"]
|
ENTRYPOINT ["dotnet", "PARR.EsppTemplateSyncWorker.dll"]
|
||||||
|
|
||||||
### EXAMPLE ###
|
### EXAMPLE ###
|
||||||
|
|||||||
@@ -15,13 +15,7 @@ namespace PARR.EsppTemplateSyncWorker
|
|||||||
|
|
||||||
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
|
||||||
{
|
{
|
||||||
//var task = new Task(() =>
|
await templateSyncer.StartWatchingAsync();
|
||||||
//{
|
|
||||||
// templateSyncer.StartWatching();
|
|
||||||
//});
|
|
||||||
//task.Start();
|
|
||||||
|
|
||||||
templateSyncer.StartWatching();
|
|
||||||
|
|
||||||
//while (!stoppingToken.IsCancellationRequested)
|
//while (!stoppingToken.IsCancellationRequested)
|
||||||
//{
|
//{
|
||||||
|
|||||||
@@ -7,5 +7,8 @@
|
|||||||
},
|
},
|
||||||
"StorageSettings": {
|
"StorageSettings": {
|
||||||
"StoragePath": "W:\\"
|
"StoragePath": "W:\\"
|
||||||
|
},
|
||||||
|
"GlobalSettings": {
|
||||||
|
"CheckIntervalSeconds": 5
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,5 +30,8 @@
|
|||||||
"AllowedExtensions": [ ".csv" ],
|
"AllowedExtensions": [ ".csv" ],
|
||||||
"MaxFileSizeMb": 100
|
"MaxFileSizeMb": 100
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"GlobalSettings": {
|
||||||
|
"CheckIntervalSeconds": 30
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user