protected void ShutdownEvent() { if (Stopped.Task.IsCompletedSuccessfully) { return; } Stopped.SetResult(true); WebSocketShutdownMonitor.Close(); Log.Info("Closed SM"); }
protected async Task RunShutdownMonitorService() { Log.Info("Starting shutdown monitor (SM) service"); WebSocketShutdownMonitor = CreateWebSocket(ComServices.S_SHUTDOWN_ADMIN); WebSocketShutdownMonitor.OnOpen += (s, ev) => { Log.Debug($"SM: onOpen"); }; WebSocketShutdownMonitor.OnMessage += (s, ev) => { if (ComServices.SHUTDOWN_KEYWORD.Equals(ev.Data)) { Log.Info("SM: Received shutdown keyword"); ShutdownEvent(); return; } Log.Warn($"SM: Received unknown message on shutdown: '{ev.Data}'"); }; WebSocketShutdownMonitor.OnClose += (s, ev) => { if (Stopped.Task.IsCompleted) { return; } Log.Error($"SM: was closed! Code={ev.Code} Reason='{ev.Reason}' WasClean={ev.WasClean}"); ShutdownEvent(); }; WebSocketShutdownMonitor.OnError += (s, ev) => { if (Stopped.Task.IsCompleted) { return; } Log.Error($"SM: error", ev.Exception); ShutdownEvent(); }; using (var timeoutCancellationTokenSource = new CancellationTokenSource()) { var connectTask = Task.Run(() => { try { WebSocketShutdownMonitor.Connect(); } catch (Exception ex) { Log.Error("Connection error", ex); } }); if (await Task.WhenAny(Task.Delay(TimeSpan.FromSeconds(10), timeoutCancellationTokenSource.Token), connectTask) == connectTask) { timeoutCancellationTokenSource.Cancel(); await connectTask; } else { throw new TimeoutException("Failed to connect to shutdown in time"); } } Log.Info("SM started successfully"); }