internal static void Shutdown() { if (_instance == null) { _started = false; SnLog.WriteWarning("Repository shutdown has already completed."); return; } lock (_startStopSync) { if (_instance == null) { _started = false; SnLog.WriteWarning("Repository shutdown has already completed."); return; } SnTrace.Repository.Write("Sending a goodbye message."); _instance.ConsoleWriteLine(); _instance.ConsoleWriteLine("Sending a goodbye message..."); DistributedApplication.ClusterChannel.ClusterMemberInfo.NeedToRecover = false; var pingMessage = new PingMessage(); pingMessage.SendAsync(CancellationToken.None).GetAwaiter().GetResult(); foreach (var svc in _instance.serviceInstances) { SnTrace.Repository.Write("Shutting down {0}", svc.GetType().Name); svc.Shutdown(); } SnTrace.Repository.Write("Shutting down {0}", DistributedApplication.ClusterChannel.GetType().Name); DistributedApplication.ClusterChannel.ShutDownAsync(CancellationToken.None).GetAwaiter().GetResult(); SnTrace.Repository.Write("Shutting down Security."); SecurityHandler.ShutDownSecurity(); SnTrace.Repository.Write("Shutting down IndexingEngine."); IndexManager.ShutDown(); ContextHandler.Reset(); var t = DateTime.UtcNow - _instance._startupInfo.Starting; var msg = $"Repository has stopped. Running time: {t.Days}.{t.Hours:d2}:{t.Minutes:d2}:{t.Seconds:d2}"; SnTrace.Repository.Write(msg); SnTrace.Flush(); _instance.ConsoleWriteLine(msg); _instance.ConsoleWriteLine(); SnLog.WriteInformation(msg); _instance = null; _started = false; } }