diff --git a/OneSTools.EventLog.Exporter.Core/ClickHouse/ClickHouseStorage.cs b/OneSTools.EventLog.Exporter.Core/ClickHouse/ClickHouseStorage.cs index 9116d87..98b8068 100644 --- a/OneSTools.EventLog.Exporter.Core/ClickHouse/ClickHouseStorage.cs +++ b/OneSTools.EventLog.Exporter.Core/ClickHouse/ClickHouseStorage.cs @@ -92,16 +92,18 @@ public async Task WriteEventLogDataAsync(List entities, item.Session }).AsEnumerable(); - try - { - await copy.WriteToServerAsync(data, cancellationToken); - } - catch (Exception ex) - { - _logger?.LogError(ex, $"Failed to write data to {_databaseName}"); - throw; + while(true){ + try + { + await copy.WriteToServerAsync(data, cancellationToken); + break; + } + catch (Exception ex) + { + _logger?.LogWarning(ex, $"Failed to write data to {_databaseName}." + System.Environment.NewLine + ex.Message); + await Task.Delay(1000); + } } - _logger?.LogDebug($"{entities.Count} items were being written to {_databaseName}"); } diff --git a/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs b/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs index 8bd6deb..1d0e9b5 100644 --- a/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs +++ b/OneSTools.EventLog.Exporter.Manager/ClstWatcher.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text.RegularExpressions; using OneSTools.BracketsFile; +using System.Threading.Tasks; namespace OneSTools.EventLog.Exporter.Manager { @@ -27,8 +28,7 @@ public ClstWatcher(string folder, List templates) _path = Path.Combine(_folder, "1CV8Clst.lst"); if (!File.Exists(_path)) throw new Exception("Couldn't find LST \"1CV8Clst.lst\" file"); - - _infoBases = ReadInfoBases(); + InitializeWatcher(); } @@ -43,11 +43,30 @@ public void Dispose() public event InfoBaseAddedHandler InfoBasesAdded; public event InfoBaseDeletedHandler InfoBasesDeleted; - private Dictionary ReadInfoBases() + private async Task> ReadInfoBases() { var items = new Dictionary(); - var fileData = File.ReadAllText(_path); + String fileData = null; + int tryCount = 10; + while (fileData == null) + { + try + { + using StreamReader stream = new StreamReader(new FileStream(_path, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)); + { + fileData = stream.ReadToEnd(); + } + } + catch (Exception e) + { + tryCount--; + if (tryCount == 0) + throw new Exception("Ошибка чтения файла списка баз", e); + await Task.Delay(1000); + } + } + var parsedData = BracketsParser.ParseBlock(fileData); var infoBasesNode = parsedData[2]; @@ -74,9 +93,9 @@ public void Dispose() return items; } - private void ReadInfoBasesAndRaiseEvents() + private async void ReadInfoBasesAndRaiseEvents() { - var newInfoBases = ReadInfoBases(); + var newInfoBases = await ReadInfoBases(); var added = newInfoBases.Except(_infoBases); foreach (var (key, (item1, item2)) in added) @@ -89,8 +108,9 @@ private void ReadInfoBasesAndRaiseEvents() _infoBases = newInfoBases; } - private void InitializeWatcher() + private async void InitializeWatcher() { + _infoBases = await ReadInfoBases(); _clstWatcher = new FileSystemWatcher(_folder, "1CV8Clst.lst") { NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite diff --git a/OneSTools.EventLog/EventLogReader.cs b/OneSTools.EventLog/EventLogReader.cs index 2799b43..be27eec 100644 --- a/OneSTools.EventLog/EventLogReader.cs +++ b/OneSTools.EventLog/EventLogReader.cs @@ -3,6 +3,7 @@ using System.IO; using System.Linq; using System.Threading; +using Timers = System.Timers; namespace OneSTools.EventLog { @@ -14,8 +15,8 @@ public class EventLogReader : IDisposable private readonly EventLogReaderSettings _settings; private bool _disposedValue; private LgfReader _lgfReader; - private ManualResetEvent _lgpChangedCreated; - private FileSystemWatcher _lgpFilesWatcher; + private ManualResetEvent _lgpChangedCreated; + private Timers.Timer _Timer; private LgpReader _lgpReader; public EventLogReader(EventLogReaderSettings settings) @@ -57,8 +58,8 @@ public EventLogItem ReadNextEventLogItem(CancellationToken cancellationToken = d if (_lgpReader == null) SetNextLgpReader(); - if (_settings.LiveMode && _lgpFilesWatcher == null) - StartLgpFilesWatcher(); + if (_settings.LiveMode && _Timer == null) + StartTimer(); EventLogItem item = null; @@ -114,12 +115,12 @@ public EventLogItem ReadNextEventLogItem(CancellationToken cancellationToken = d private bool SetNextLgpReader() { - var currentReaderLastWriteDateTime = DateTime.MinValue; + string currentFileName = "19000101000000"; if (_lgpReader != null) - currentReaderLastWriteDateTime = new FileInfo(_lgpReader.LgpPath).LastWriteTime; + currentFileName = new FileInfo(_lgpReader.LgpPath).Name; - var filesDateTime = new List<(string, DateTime)>(); + var filesDateTime = new List<(string, string)>(); var files = Directory.GetFiles(_settings.LogFolder, "*.lgp"); @@ -127,16 +128,15 @@ private bool SetNextLgpReader() if (_lgpReader != null) { if (_lgpReader.LgpPath != file) - filesDateTime.Add((file, new FileInfo(file).LastWriteTime)); + filesDateTime.Add((file, new FileInfo(file).Name)); } else { - filesDateTime.Add((file, new FileInfo(file).LastWriteTime)); + filesDateTime.Add((file, new FileInfo(file).Name)); } - - var orderedFiles = filesDateTime.OrderBy(c => c.Item2).ToList(); - - var (item1, _) = orderedFiles.FirstOrDefault(c => c.Item2 > currentReaderLastWriteDateTime); + + filesDateTime.Sort((x, y) => string.Compare(y.Item2, x.Item2)); + var (item1, _) = filesDateTime.FirstOrDefault(c => string.Compare(c.Item2, currentFileName) > 0); if (string.IsNullOrEmpty(item1)) { @@ -151,31 +151,28 @@ private bool SetNextLgpReader() return true; } - private void StartLgpFilesWatcher() + private void StartTimer() { _lgpChangedCreated = new ManualResetEvent(false); - _lgpFilesWatcher = new FileSystemWatcher(_settings.LogFolder, "*.lgp") - { - NotifyFilter = NotifyFilters.CreationTime | NotifyFilters.LastWrite | NotifyFilters.Size - }; - _lgpFilesWatcher.Changed += LgpFilesWatcher_Event; - _lgpFilesWatcher.Created += LgpFilesWatcher_Event; - _lgpFilesWatcher.EnableRaisingEvents = true; + _Timer = new Timers.Timer(_settings.ReadingTimeout); + _Timer.Elapsed += OnTimedEvent; + _Timer.AutoReset = true; + _Timer.Enabled = true; } - private void LgpFilesWatcher_Event(object sender, FileSystemEventArgs e) + private void OnTimedEvent(Object source, Timers.ElapsedEventArgs e) { - if (e.ChangeType == WatcherChangeTypes.Created || e.ChangeType == WatcherChangeTypes.Changed) - _lgpChangedCreated.Set(); + _lgpChangedCreated.Set(); } protected virtual void Dispose(bool disposing) { if (!_disposedValue) { - _lgpFilesWatcher?.Dispose(); - _lgpFilesWatcher = null; + _Timer?.Stop(); + _Timer?.Dispose(); + _Timer = null; _lgpChangedCreated?.Dispose(); _lgpChangedCreated = null; _lgfReader?.Dispose();