Fix FileSystemWatcher (#733)

* Define EnhancedFileSystemWatcher in class

* d
This commit is contained in:
Stef Heyenrath
2022-03-01 19:45:39 +01:00
committed by GitHub
parent 344f5c8111
commit 6c68033739
3 changed files with 61 additions and 36 deletions

View File

@@ -586,6 +586,9 @@ namespace WireMock.Net.ConsoleApplication
System.Console.WriteLine("Press any key to quit"); System.Console.WriteLine("Press any key to quit");
System.Console.ReadKey(); System.Console.ReadKey();
server.Stop();
server.Dispose();
} }
} }
} }

View File

@@ -33,7 +33,7 @@ namespace WireMock.Server
/// </summary> /// </summary>
public partial class WireMockServer public partial class WireMockServer
{ {
private const int EnhancedFileSystemWatcherTimeoutMs = 10000; // Changed from 1000 to 10000 (#726) private const int EnhancedFileSystemWatcherTimeoutMs = 1000;
private const int AdminPriority = int.MinValue; private const int AdminPriority = int.MinValue;
private const int ProxyPriority = 1000; private const int ProxyPriority = 1000;
private const string ContentTypeJson = "application/json"; private const string ContentTypeJson = "application/json";
@@ -49,6 +49,8 @@ namespace WireMock.Server
private readonly RegexMatcher _adminMappingsGuidPathMatcher = new RegexMatcher(@"^\/__admin\/mappings\/([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$"); private readonly RegexMatcher _adminMappingsGuidPathMatcher = new RegexMatcher(@"^\/__admin\/mappings\/([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$");
private readonly RegexMatcher _adminRequestsGuidPathMatcher = new RegexMatcher(@"^\/__admin\/requests\/([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$"); private readonly RegexMatcher _adminRequestsGuidPathMatcher = new RegexMatcher(@"^\/__admin\/requests\/([0-9A-Fa-f]{8}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{4}[-][0-9A-Fa-f]{12})$");
private EnhancedFileSystemWatcher _enhancedFileSystemWatcher;
#region InitAdmin #region InitAdmin
private void InitAdmin() private void InitAdmin()
{ {
@@ -163,45 +165,17 @@ namespace WireMock.Server
_settings.Logger.Info($"Watching folder '{folder}'{includeSubdirectoriesText} for new, updated and deleted MappingFiles."); _settings.Logger.Info($"Watching folder '{folder}'{includeSubdirectoriesText} for new, updated and deleted MappingFiles.");
var watcher = new EnhancedFileSystemWatcher(folder, "*.json", EnhancedFileSystemWatcherTimeoutMs) DisposeEnhancedFileSystemWatcher();
_enhancedFileSystemWatcher = new EnhancedFileSystemWatcher(folder, "*.json", EnhancedFileSystemWatcherTimeoutMs)
{ {
IncludeSubdirectories = includeSubdirectories IncludeSubdirectories = includeSubdirectories
}; };
_enhancedFileSystemWatcher.Created += EnhancedFileSystemWatcherCreated;
watcher.Created += (sender, args) => _enhancedFileSystemWatcher.Changed += EnhancedFileSystemWatcherChanged;
{ _enhancedFileSystemWatcher.Deleted += EnhancedFileSystemWatcherDeleted;
_settings.Logger.Info("MappingFile created : '{0}', reading file.", args.FullPath); _enhancedFileSystemWatcher.EnableRaisingEvents = true;
if (!ReadStaticMappingAndAddOrUpdate(args.FullPath))
{
_settings.Logger.Error("Unable to read MappingFile '{0}'.", args.FullPath);
}
};
watcher.Changed += (sender, args) =>
{
_settings.Logger.Info("MappingFile updated : '{0}', reading file.", args.FullPath);
if (!ReadStaticMappingAndAddOrUpdate(args.FullPath))
{
_settings.Logger.Error("Unable to read MappingFile '{0}'.", args.FullPath);
}
};
watcher.Deleted += (sender, args) =>
{
_settings.Logger.Info("MappingFile deleted : '{0}'", args.FullPath);
string filenameWithoutExtension = Path.GetFileNameWithoutExtension(args.FullPath);
if (Guid.TryParse(filenameWithoutExtension, out Guid guidFromFilename))
{
DeleteMapping(guidFromFilename);
}
else
{
DeleteMapping(args.FullPath);
}
};
watcher.EnableRaisingEvents = true;
} }
/// <inheritdoc cref="IWireMockServer.WatchStaticMappings" /> /// <inheritdoc cref="IWireMockServer.WatchStaticMappings" />
[PublicAPI] [PublicAPI]
public bool ReadStaticMappingAndAddOrUpdate([NotNull] string path) public bool ReadStaticMappingAndAddOrUpdate([NotNull] string path)
@@ -940,5 +914,52 @@ namespace WireMock.Server
{ {
return DeserializeObjectToArray<T>(JsonUtils.DeserializeObject(value)); return DeserializeObjectToArray<T>(JsonUtils.DeserializeObject(value));
} }
private void DisposeEnhancedFileSystemWatcher()
{
if (_enhancedFileSystemWatcher != null)
{
_enhancedFileSystemWatcher.EnableRaisingEvents = false;
_enhancedFileSystemWatcher.Created -= EnhancedFileSystemWatcherCreated;
_enhancedFileSystemWatcher.Changed -= EnhancedFileSystemWatcherChanged;
_enhancedFileSystemWatcher.Deleted -= EnhancedFileSystemWatcherDeleted;
_enhancedFileSystemWatcher.Dispose();
}
}
private void EnhancedFileSystemWatcherCreated(object sender, FileSystemEventArgs args)
{
_settings.Logger.Info("MappingFile created : '{0}', reading file.", args.FullPath);
if (!ReadStaticMappingAndAddOrUpdate(args.FullPath))
{
_settings.Logger.Error("Unable to read MappingFile '{0}'.", args.FullPath);
}
}
private void EnhancedFileSystemWatcherChanged(object sender, FileSystemEventArgs args)
{
_settings.Logger.Info("MappingFile updated : '{0}', reading file.", args.FullPath);
if (!ReadStaticMappingAndAddOrUpdate(args.FullPath))
{
_settings.Logger.Error("Unable to read MappingFile '{0}'.", args.FullPath);
}
}
private void EnhancedFileSystemWatcherDeleted(object sender, FileSystemEventArgs args)
{
_settings.Logger.Info("MappingFile deleted : '{0}'", args.FullPath);
string filenameWithoutExtension = Path.GetFileNameWithoutExtension(args.FullPath);
if (Guid.TryParse(filenameWithoutExtension, out Guid guidFromFilename))
{
DeleteMapping(guidFromFilename);
}
else
{
DeleteMapping(args.FullPath);
}
}
} }
} }

View File

@@ -80,6 +80,7 @@ namespace WireMock.Server
/// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param> /// <param name="disposing"><c>true</c> to release both managed and unmanaged resources; <c>false</c> to release only unmanaged resources.</param>
protected virtual void Dispose(bool disposing) protected virtual void Dispose(bool disposing)
{ {
DisposeEnhancedFileSystemWatcher();
_httpServer?.StopAsync(); _httpServer?.StopAsync();
} }
#endregion #endregion