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;
}
}