private void InnerSubscribeTopic(string topic) { if (!watchers.Keys.Contains(topic)) { lock (watchersLocker) { if (!watchers.Keys.Contains(topic)) { var filePath = FileBasedPubSubUtils.GetFilePath(basePath, topic); var fileInfo = new FileInfo(filePath); FileSystemWatcher watcher = new FileSystemWatcher(); watcher.Path = fileInfo.DirectoryName; watcher.Filter = fileInfo.Name; watcher.NotifyFilter = NotifyFilters.LastWrite; watchers[topic] = watcher; var fileEventHandler = new FileSystemEventHandler((source, e) => { try { OnFileEvent(topic, source, e); } catch (Exception ex) { EventLogger.WriteError($"Error handling cache file event for file: {filePath}. Cache invalidation skipped."); EventLogger.WriteError(ex); } }); watcher.Changed += fileEventHandler; watcher.EnableRaisingEvents = true; } } } }
public void Dispose() { if (ClearFilesOnDispose) { subscriptions .SelectMany(sub => sub.GetSubscribedTopics()) .Select(topic => FileBasedPubSubUtils.GetFilePath(basePath, topic)) .Where(filePath => File.Exists(filePath)) .Apply(filePath => File.Delete(filePath)); } CancelAllSubscriptions(); subscriptions.Apply(sub => sub.Dispose()); }
public void Publish(string topic, string message) { var filePath = FileBasedPubSubUtils.GetFilePath(basePath, topic); var content = Guid.NewGuid().ToString() + Constants.NewLineCharacter + message; var fileInfo = new FileInfo(filePath); // Yes it's nasty, I know... Stopwatch s = new Stopwatch(); s.Start(); while (s.Elapsed < TimeSpan.FromMilliseconds(500)) { try { using (var writer = new StreamWriter(fileInfo.FullName)) { writer.Write(content); writer.Flush(); } break; } catch (IOException) { } } s.Stop(); }