Ejemplo n.º 1
0
 private void ReceivedMessage(NetMQSocketEventArgs e)
 {
     try
     {
         var msg = e.Socket.ReceiveMultipartMessage();
         if (msg.First.ConvertToString() == Heartbeat.CoreHearbeatTopic)
         {
             return;
         }
         // Ignore messages that have less than 3 frames or no empty second frame.
         if (msg.FrameCount < 3)
         {
             return;
         }
         if (msg[1].MessageSize != 0)
         {
             return;
         }
         var data   = msg[2].ConvertToString();
         var nyxMsg = new NyxMessage().FromDefault(data);
         _messageSubject.OnNext(nyxMsg);
     }
     catch (Exception ex)
     {
         _logger.Fatal(ex, "Error receiving message on BorgShim.");
     }
 }
Ejemplo n.º 2
0
        public TestControlsViewModel(
            INyxBorg borg,
            IConfigManager config
            )
        {
            PingCommand = ReactiveCommand.Create <object, Unit>(_ =>
            {
                for (int i = 0; i < PingCount; i++)
                {
                    borg.SendMessage(NyxMessage.Create("nyx", BasicHubAction.Ping, borg.NodeId));
                }
                return(Unit.Default);
            });

            SendActionCommand = ReactiveCommand.Create <object, Unit>(_ =>
            {
                borg.SendMessage(NyxMessage.Create(ActionTarget, ActionText, string.IsNullOrWhiteSpace(ActionSource) ? borg.NodeId : ActionSource));
                return(Unit.Default);
            });

            ConnectCommand = ReactiveCommand.Create <object, Unit>(_ =>
            {
                borg.Connect(ConnectionIp);
                return(Unit.Default);
            });

            _connectionIp = config.Get("borg_hubIp", "127.0.0.1");

            config.WhenConfigChanges
            .Throttle(TimeSpan.FromMilliseconds(200), ThreadPoolScheduler.Instance)
            .Where(k => k.Keys.Contains("borg_hubIp"))
            .Select(k => k.Sender.Get("borg_hubIp", "127.0.0.1"))
            .DistinctUntilChanged()
            .ObserveOnDispatcher()
            .Subscribe(s => ConnectionIp = s);

            borg.ConnectionStatusStream
            .ObserveOnDispatcher()
            .Subscribe(c =>
            {
                IsConnected = c.HasFlag(ConnectionStatus.Connected);
            });

            ValidActions = PluginManager.Instance
                           .GetExtensions()
                           .OfType <INyxMessageActions>()
                           .SelectMany(_ => _.SupportedActions).ToList();
        }
Ejemplo n.º 3
0
 public void SubscribeUpdates()
 {
     if (_borg == null)
     {
         throw new NullReferenceException("This must run on a borg.");
     }
     NyxMessage.Create("nyx", NodesUpdateSubscribe, _borg.NodeId).SendMessage(_borg);
     _subscriptionDisposable.Disposable = _internalHubWatch
                                          .Where(o => o)
                                          .Throttle(TimeSpan.FromSeconds(10))
                                          .ObserveOnPool()
                                          .Subscribe(o =>
     {
         _logger.Debug("Subscribe update from hub after lost connection.");
         NyxMessage.Create("nyx", NodesUpdateSubscribe, _borg.NodeId).SendMessage(_borg);
     });
 }
Ejemplo n.º 4
0
        public IObservable <Unit> RequestInfo(bool observe = false, int timeout = 5)
        {
            if (_borg == null)
            {
                return(Observable.Return(Unit.Default));
            }
            Action act = async() =>
            {
                var update = WhenNodesChange
                             .Amb(Observable.Return(NodesChanges.Empty).Delay(TimeSpan.FromSeconds(timeout)));
                var msg = new NyxMessage("Nyx", NodesInfo, _borg.NodeId);
                await msg.SendMessage(_borg);

                await update;
            };

            if (observe)
            {
                return(Observable.Start(act));
            }
            new NyxMessage("Nyx", NodesInfo, _borg.NodeId).SendMessage(_borg);
            return(Observable.Return(Unit.Default));
        }
Ejemplo n.º 5
0
        void IShimHandler.Run(PairSocket shim)
        {
            _poller = new NetMQPoller();

            // Listen to actor dispose
            _ = Observable.FromEventPattern <NetMQSocketEventArgs>(e => shim.ReceiveReady += e, e => shim.ReceiveReady -= e)
                .Select(e => e.EventArgs)
                .ObserveOn(Scheduler.CurrentThread)
                .Subscribe(OnShimReady);

            _poller.Add(shim);

            _publisherSocket = new PublisherSocket();
            _responseSocket  = new RouterSocket();
#if MONITOR
            var monitor1 = new NetMQMonitor(_publisherSocket, "inproc://#monitor1", SocketEvents.All);
            _ = Observable.FromEventPattern <NetMQMonitorSocketEventArgs>(monitor1, "Connected")
                .Select(e => new { Event = "Connected", e })
                .Merge(Observable.FromEventPattern <NetMQMonitorSocketEventArgs>(monitor1, nameof(monitor1.Listening)).Select(e => new { Event = "Listening", e }))
                .Merge(Observable.FromEventPattern <NetMQMonitorSocketEventArgs>(monitor1, nameof(monitor1.Accepted)).Select(e => new { Event = "Accepted", e }))
                .Merge(Observable.FromEventPattern <NetMQMonitorSocketEventArgs>(monitor1, nameof(monitor1.Closed)).Select(e => new { Event = "Closed", e }))
                .Merge(Observable.FromEventPattern <NetMQMonitorSocketEventArgs>(monitor1, nameof(monitor1.Disconnected)).Select(e => new { Event = "Disconnected", e }))
                .Do(e => _logger.Info("Monitor socket: {0}, {1}", e.Event, e.e.EventArgs.Address))
                .Subscribe();
            _ = Observable.FromEventPattern <NetMQMonitorErrorEventArgs>(monitor1, nameof(monitor1.AcceptFailed))
                .Merge(Observable.FromEventPattern <NetMQMonitorErrorEventArgs>(monitor1, nameof(monitor1.ConnectDelayed)))
                .Merge(Observable.FromEventPattern <NetMQMonitorErrorEventArgs>(monitor1, nameof(monitor1.CloseFailed)))
                .Merge(Observable.FromEventPattern <NetMQMonitorErrorEventArgs>(monitor1, nameof(monitor1.BindFailed)))
                .Do(e => _logger.Error("Monitor error socket: {0}, {1}", e.EventArgs.ErrorCode, e.EventArgs.Address))
                .Subscribe();
            _ = Observable.FromEventPattern <NetMQMonitorIntervalEventArgs>(monitor1, nameof(monitor1.ConnectRetried))
                .Do(e => _logger.Info("Monitor retry socket: {0}, {1}", e.EventArgs.Interval, e.EventArgs.Address))
                .Subscribe();
            monitor1.AttachToPoller(_poller);

            var monitor2 = new NetMQMonitor(_responseSocket, "inproc://#monitor2", SocketEvents.All);
            _ = Observable.FromEventPattern <NetMQMonitorSocketEventArgs>(monitor2, "Connected")
                .Select(e => new { Event = "Connected", e })
                .Merge(Observable.FromEventPattern <NetMQMonitorSocketEventArgs>(monitor2, nameof(monitor2.Listening)).Select(e => new { Event = "Listening", e }))
                .Merge(Observable.FromEventPattern <NetMQMonitorSocketEventArgs>(monitor2, nameof(monitor2.Accepted)).Select(e => new { Event = "Accepted", e }))
                .Merge(Observable.FromEventPattern <NetMQMonitorSocketEventArgs>(monitor2, nameof(monitor2.Closed)).Select(e => new { Event = "Closed", e }))
                .Merge(Observable.FromEventPattern <NetMQMonitorSocketEventArgs>(monitor2, nameof(monitor2.Disconnected)).Select(e => new { Event = "Disconnected", e }))
                .Do(e => _logger.Info("Monitor socket: {0}, {1}", e.Event, e.e.EventArgs.Address))
                .Subscribe();
            _ = Observable.FromEventPattern <NetMQMonitorErrorEventArgs>(monitor2, nameof(monitor2.AcceptFailed))
                .Merge(Observable.FromEventPattern <NetMQMonitorErrorEventArgs>(monitor2, nameof(monitor2.ConnectDelayed)))
                .Merge(Observable.FromEventPattern <NetMQMonitorErrorEventArgs>(monitor2, nameof(monitor2.CloseFailed)))
                .Merge(Observable.FromEventPattern <NetMQMonitorErrorEventArgs>(monitor2, nameof(monitor2.BindFailed)))
                .Do(e => _logger.Error("Monitor error socket: {0}, {1}", e.EventArgs.ErrorCode, e.EventArgs.Address))
                .Subscribe();
            _ = Observable.FromEventPattern <NetMQMonitorIntervalEventArgs>(monitor2, nameof(monitor2.ConnectRetried))
                .Do(e => _logger.Info("Monitor retry socket: {0}, {1}", e.EventArgs.Interval, e.EventArgs.Address))
                .Subscribe();
            monitor2.AttachToPoller(_poller);
#endif

            // To avoid crashes if the queue builds up too fast.
            _publisherSocket.Options.SendHighWatermark    = 1000;
            _publisherSocket.Options.TcpKeepalive         = true;
            _publisherSocket.Options.TcpKeepaliveIdle     = TimeSpan.FromSeconds(5);
            _publisherSocket.Options.TcpKeepaliveInterval = TimeSpan.FromSeconds(1);
            // Number of network hops to jump, default is 1, which means local network.
            //_publisherSocket.Options.MulticastHops = 100;
            _publisherSocket.Bind($"tcp://*:{_port + 1}");
            _poller.Add(_publisherSocket);

            _responseSocket.Bind($"tcp://*:{_port}");
            _ = Observable.FromEventPattern <NetMQSocketEventArgs>(
                e => _responseSocket.ReceiveReady += e, e => _responseSocket.ReceiveReady -= e)
                .Select(e => e.EventArgs)
                .ObserveOn(Scheduler.CurrentThread)
                .Subscribe(e =>
            {
                try
                {
                    var msg = e.Socket.ReceiveMultipartMessage();
                    // Ignore messages that have less than 3 frames or no empty second frame.
                    var address = msg.First();
                    var data    = msg.Last().ConvertToString();
                    var nyxMsg  = new NyxMessage().FromDefault(data);
                    _messageSubject.OnNext(new Tuple <byte[], INyxMessage>(address.ToByteArray(), nyxMsg));
                }
                catch (Exception ex)
                {
                    _messageSubject.OnError(ex);
                }
            });

            _poller.Add(_responseSocket);

            var heartbeatTimer = new NetMQTimer(TimeSpan.FromSeconds(2));
            _ = Observable.FromEventPattern <NetMQTimerEventArgs>(e => heartbeatTimer.Elapsed += e, e => heartbeatTimer.Elapsed -= e)
                .Select(e => e.EventArgs)
                .Subscribe(OnTimeoutElapsed);
            _poller.Add(heartbeatTimer);

            heartbeatTimer.Reset();
            shim.SignalOK();

            _poller.Run();

#if MONITOR
            if (monitor1 != null)
            {
                monitor1.DetachFromPoller();
                monitor2.DetachFromPoller();
            }
#endif
            _poller.Remove(_responseSocket);
            _poller.Remove(_publisherSocket);
            _poller.Remove(heartbeatTimer);
            _poller.Remove(shim);
            _poller.Dispose();
        }