コード例 #1
0
ファイル: Communicator.cs プロジェクト: litetex/SWAPS
        protected void ShutdownEvent()
        {
            if (Stopped.Task.IsCompletedSuccessfully)
            {
                return;
            }

            Stopped.SetResult(true);
            WebSocketShutdownMonitor.Close();
            Log.Info("Closed SM");
        }
コード例 #2
0
ファイル: Communicator.cs プロジェクト: litetex/SWAPS
        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");
        }