Beispiel #1
0
        private PublisherSocket GetNewPublisherSocket(string addressZeroMq)
        {
            PublisherSocket publisherSocket;

            {
                _loggerDelegate?.Invoke(string.Format("Publisher socket binding to: {0}\n", addressZeroMq));

                publisherSocket = new PublisherSocket();

                // Corner case: wait until publisher socket is ready (see code below that waits for
                // "_publisherReadySignal").
                NetMQMonitor monitor;
                {
                    // Must ensure that we have a unique monitor name for every instance of this class.
                    string endPoint = string.Format("inproc://#SubjectNetMQ#Publisher#{0}#{1}", addressZeroMq, Guid.NewGuid().ToString());
                    monitor = new NetMQMonitor(publisherSocket,
                                               endPoint,
                                               SocketEvents.Accepted | SocketEvents.Listening
                                               );
                    monitor.Accepted  += Publisher_Event_Accepted;
                    monitor.Listening += Publisher_Event_Listening;
                    monitor.StartAsync();
                }

                publisherSocket.Options.SendHighWatermark = this.HighwaterMark;
                try
                {
                    publisherSocket.Bind(addressZeroMq);
                }
                catch (NetMQException ex)
                {
                    // This is usually because the address is in use.
                    throw new Exception(string.Format("Error E56874. Cannot bind publisher to '{0}'. 95% probability that this is caused by trying to bind a publisher to a port already in use by another process. To fix, choose a unique publisher port for this process. For more on this error, see 'Readme.md' (or the GitHub homepage for NetMQ.ReactiveExtensions).", addressZeroMq), ex);
                }

                // Corner case: wait until publisher socket is ready (see code below that sets "_publisherReadySignal").
                {
                    Stopwatch sw = Stopwatch.StartNew();
                    _publisherReadySignal.WaitOne(TimeSpan.FromMilliseconds(3000));
                    _loggerDelegate?.Invoke(string.Format("Publisher: Waited {0} ms for binding.\n", sw.ElapsedMilliseconds));
                }
                {
                    monitor.Accepted  -= Publisher_Event_Accepted;
                    monitor.Listening -= Publisher_Event_Listening;
                    // Current issue with NegMQ: Cannot stop or dispose monitor, or else it stops the parent socket.
                    //monitor.Stop();
                    //monitor.Dispose();
                }
            }

            // Otherwise, the first item we publish may get missed by the subscriber. 500 milliseconds consistently works
            // locally, but occasionally fails on the AppVeyor build server. 650 milliseconds is optimal.
            using (EventWaitHandle wait = new ManualResetEvent(false))
            {
                // Cannot use Thread.Sleep() here, as this is incompatible with .NET Core 1.0, Windows 8.0, 8.1, and 10.
                wait.WaitOne(TimeSpan.FromMilliseconds(650));
            }

            return(publisherSocket);
        }
Beispiel #2
0
        public void MonitorDisposeProperlyWhenDisposedAfterMonitoredTcpSocket()
        {
            // The bug:
            // Given we monitor a netmq tcp socket
            // Given we disposed of the monitored socket first
            // When we dispose of the monitor
            // Then our monitor is Faulted with a EndpointNotFoundException
            // And monitor can't be stopped or disposed

            using (var context = NetMQContext.Create())
                using (var res = context.CreateResponseSocket())
                {
                    NetMQMonitor monitor;
                    using (var req = context.CreateRequestSocket())
                    {
                        monitor = new NetMQMonitor(context, req, "inproc://#monitor", SocketEvents.All);
                        Task.Factory.StartNew(monitor.Start);

                        // Bug only occurs when monitoring a tcp socket
                        var port = res.BindRandomPort("tcp://127.0.0.1");
                        req.Connect("tcp://127.0.0.1:" + port);

                        req.Send("question");
                        Assert.That(res.ReceiveFrameString(), Is.EqualTo("question"));
                        res.Send("response");
                        Assert.That(req.ReceiveFrameString(), Is.EqualTo("response"));
                    }
                    Thread.Sleep(100);
                    // Monitor.Dispose should complete
                    var completed = Task.Factory.StartNew(() => monitor.Dispose()).Wait(1000);
                    Assert.That(completed, Is.True);
                }
            // NOTE If this test fails, it will hang because context.Dispose will block
        }
Beispiel #3
0
        public void MonitorDisposeProperlyWhenDisposedAfterMonitoredTcpSocket()
        {
            // The bug:
            // Given we monitor a netmq tcp socket
            // Given we disposed of the monitored socket first
            // When we dispose of the monitor
            // Then our monitor is Faulted with a EndpointNotFoundException
            // And monitor can't be stopped or disposed

            using (var context = NetMQContext.Create())
            using (var res = context.CreateResponseSocket())
            {
                NetMQMonitor monitor;
                using (var req = context.CreateRequestSocket())
                {
                    monitor = new NetMQMonitor(context, req, "inproc://#monitor", SocketEvents.All);
                    Task.Factory.StartNew(monitor.Start);

                    // Bug only occurs when monitoring a tcp socket
                    var port = res.BindRandomPort("tcp://127.0.0.1");
                    req.Connect("tcp://127.0.0.1:" + port);

                    req.Send("question");
                    Assert.That(res.ReceiveFrameString(), Is.EqualTo("question"));
                    res.Send("response");
                    Assert.That(req.ReceiveFrameString(), Is.EqualTo("response"));
                }
                Thread.Sleep(100);
                // Monitor.Dispose should complete
                var completed = Task.Factory.StartNew(() => monitor.Dispose()).Wait(1000);
                Assert.That(completed, Is.True);
            }
            // NOTE If this test fails, it will hang because context.Dispose will block
        }
Beispiel #4
0
        public void ErrorCodeTest()
        {
            using (var req = new RequestSocket())
                using (var rep = new ResponseSocket())
                    using (var monitor = new NetMQMonitor(req, "inproc://rep.inproc", SocketEvents.ConnectDelayed))
                    {
                        var eventArrived = false;

                        monitor.ConnectDelayed += (s, a) => { eventArrived = true; };

                        monitor.Timeout = TimeSpan.FromMilliseconds(100);

                        var monitorTask = Task.Factory.StartNew(monitor.Start);

                        var port = rep.BindRandomPort("tcp://127.0.0.1");

                        req.Connect("tcp://127.0.0.1:" + port);

                        req.SendFrame("a");
                        rep.SkipFrame();

                        rep.SendFrame("b");
                        req.SkipFrame();

                        Thread.Sleep(200);

                        Assert.IsTrue(eventArrived);

                        monitor.Stop();

                        Thread.Sleep(200);

                        Assert.IsTrue(monitorTask.IsCompleted);
                    }
        }
Beispiel #5
0
        protected override void ProducerAction()
        {
            using (NetMQContext ctx = NetMQContext.Create())
            {
                using (SubscriberSocket socket = ctx.CreateSubscriberSocket())
                {
                    using (
                        var monitor = new NetMQMonitor(ctx, socket, "inproc://monitor.sub/" + Guid.NewGuid(),
                                                       SocketEvent.Connected | SocketEvent.Disconnected))
                    {
                        monitor.Connected    += monitor_Connected;
                        monitor.Disconnected += monitor_Disconnected;
                        monitor.Timeout       = TimeSpan.FromMilliseconds(100);
                        Task.Factory.StartNew(monitor.Start);

                        socket.Connect(Address);
                        socket.Subscribe(string.Empty);
                        while (true)
                        {
                            _commandProcessor.ExecuteAll(socket);
                            NetMQMessage message = socket.ReceiveMessage();
                            if (message != null && !IsEmpty)
                            {
                                Queue.Add(message);
                            }
                        }
                    }
                }
            }
        }
Beispiel #6
0
            protected override void _SocketBuilder()
            {
                if (info == null)
                {
                    info = GetAddress(name);
                    if (info == null)
                    {
                        Thread.Sleep(900);
                        return;
                    }
                }
                reportLog("Starting Dealer for ip " + info.Address + " and port " + info.Port, LogType.INFO, section);

                string path = "tcp://" + info.Address + ":" + info.Port;

                socket = new DealerSocket();

                socket.Options.TcpKeepalive         = true;
                socket.Options.TcpKeepaliveIdle     = TimeSpan.FromMilliseconds(100);
                socket.Options.TcpKeepaliveInterval = TimeSpan.FromMilliseconds(100);

                monitor = new NetMQMonitor(socket, "inproc://dealer" + Net2.GetAddressIndex(), SocketEvents.All);
                monitor.Disconnected += Monitor_Disconnected;
                monitor.Connected    += Monitor_Connected;
                monitor.Timeout       = TimeSpan.FromMilliseconds(100);
                task = Task.Factory.StartNew(monitor.Start);

                setState(Net2State.STARTED);
                start_time = GetTime().sec;

                socket.Connect(path);

                reportLog("Dealer is connected to " + path, LogType.INFO, section);
            }
Beispiel #7
0
        public void SubsriberCleanupOnUnbind(string address)
        {
            for (var i = 0; i < 10; i++)
            {
                using (var sub = new SubscriberSocket())
                {
                    sub.Bind(address);
                    using (var monitor = new NetMQMonitor(sub, String.Format("inproc://cleanup.test{0}", Guid.NewGuid()), SocketEvents.Closed))
                    {
                        var monitorTask = Task.Factory.StartNew(monitor.Start);

                        var closed = new ManualResetEventSlim();

                        monitor.Closed += (sender, args) => closed.Set();

                        var time = DateTime.Now;

                        sub.Unbind(address);

                        Assert.That(closed.Wait(1000), Is.True, "Unbind failed to report Closed event to the Monitor");
                        var duration = DateTime.Now - time;
                        Console.WriteLine("Run {0}: {1} ms", i, duration.TotalMilliseconds);

                        monitor.Stop();

                        monitorTask.Wait();
                    }
                }
            }
        }
Beispiel #8
0
 private void DisposeMonitor()
 {
     _monitor.Connected      -= Monitor_Connected;
     _monitor.Disconnected   -= Monitor_Disconnected;
     _monitor.ConnectRetried -= Monitor_ConnectRetried;
     _monitor.Dispose();
     _monitor = null;
 }
Beispiel #9
0
 private void DisposeMonitor()
 {
     _monitor.Connected -= Monitor_Connected;
     _monitor.Disconnected -= Monitor_Disconnected;
     _monitor.ConnectRetried -= Monitor_ConnectRetried;
     _monitor.Dispose();
     _monitor = null;
 }
        public void Monitoring()
        {
            ManualResetEvent listeningEvent = new ManualResetEvent(false);
            ManualResetEvent acceptedEvent  = new ManualResetEvent(false);
            ManualResetEvent connectedEvent = new ManualResetEvent(false);


            using (NetMQContext contex = NetMQContext.Create())
            {
                Poller poller = new Poller();

                using (var rep = contex.CreateResponseSocket())
                {
                    using (NetMQMonitor monitor = new NetMQMonitor(contex, rep, "inproc://rep.inproc", SocketEvent.Accepted | SocketEvent.Listening))
                    {
                        monitor.Accepted  += (s, a) => acceptedEvent.Set();
                        monitor.Listening += (s, a) => listeningEvent.Set();

                        monitor.AttachToPoller(poller);

                        rep.Bind("tcp://127.0.0.1:5002");

                        using (var req = contex.CreateRequestSocket())
                        {
                            using (NetMQMonitor reqMonitor = new NetMQMonitor(contex, req, "inproc://req.inproc", SocketEvent.Connected))
                            {
                                reqMonitor.Connected += (s, a) => connectedEvent.Set();

                                reqMonitor.AttachToPoller(poller);
                                try
                                {
                                    var pollerTask = Task.Factory.StartNew(poller.Start);

                                    req.Connect("tcp://127.0.0.1:5002");
                                    req.Send("a");

                                    bool more;

                                    string m = rep.ReceiveString(out more);

                                    rep.Send("b");

                                    string m2 = req.ReceiveString(out more);

                                    Assert.IsTrue(listeningEvent.WaitOne(300));
                                    Assert.IsTrue(connectedEvent.WaitOne(300));
                                    Assert.IsTrue(acceptedEvent.WaitOne(300));
                                }
                                finally
                                {
                                    poller.Stop();
                                }
                            }
                        }
                    }
                }
            }
        }
Beispiel #11
0
        public void Monitoring()
        {
            bool listening = false;
            bool accepted  = false;

            using (NetMQContext contex = NetMQContext.Create())
            {
                using (var rep = contex.CreateResponseSocket())
                {
                    using (NetMQMonitor monitor = new NetMQMonitor(contex, rep, "inproc://rep.inproc", SocketEvent.Accepted | SocketEvent.Listening))
                    {
                        monitor.Accepted += (s, a) =>
                        {
                            accepted = true;
                            //Console.WriteLine(a.Socket.LocalEndPoint.ToString());
                        };
                        monitor.Listening += (s, a) =>
                        {
                            listening = true;
                            Console.WriteLine(a.Socket.LocalEndPoint.ToString());
                        };

                        monitor.Timeout = TimeSpan.FromMilliseconds(100);

                        var pollerTask = Task.Factory.StartNew(monitor.Start);

                        rep.Bind("tcp://127.0.0.1:5002");

                        using (var req = contex.CreateRequestSocket())
                        {
                            req.Connect("tcp://127.0.0.1:5002");
                            req.Send("a");

                            bool more;

                            string m = rep.ReceiveString(out more);

                            rep.Send("b");

                            string m2 = req.ReceiveString(out more);

                            Thread.Sleep(200);

                            Assert.IsTrue(listening);
                            Assert.IsTrue(accepted);

                            monitor.Stop();

                            Thread.Sleep(200);

                            Assert.IsTrue(pollerTask.IsCompleted);
                        }
                    }
                }
            }
        }
Beispiel #12
0
        public void Monitoring()
        {
            bool listening = false;
            bool accepted = false;

            using (NetMQContext contex = NetMQContext.Create())
            {
                using (var rep = contex.CreateResponseSocket())
                {
                    using (NetMQMonitor monitor = new NetMQMonitor(contex, rep, "inproc://rep.inproc", SocketEvent.Accepted | SocketEvent.Listening))
                    {
                        monitor.Accepted += (s, a) =>
                            {
                                accepted = true;
                                Console.WriteLine(a.Socket.RemoteEndPoint.ToString());
                            };
                        monitor.Listening += (s, a) =>
                            {
                                listening = true;
                                Console.WriteLine(a.Socket.LocalEndPoint.ToString());
                            };

                        monitor.Timeout = TimeSpan.FromMilliseconds(100);

                        var pollerTask = Task.Factory.StartNew(monitor.Start);

                        rep.Bind("tcp://127.0.0.1:5002");

                        using (var req = contex.CreateRequestSocket())
                        {
                            req.Connect("tcp://127.0.0.1:5002");
                            req.Send("a");

                            bool more;

                            string m = rep.ReceiveString(out more);

                            rep.Send("b");

                            string m2 = req.ReceiveString(out more);

                            Thread.Sleep(200);

                            Assert.IsTrue(listening);
                            Assert.IsTrue(accepted);

                            monitor.Stop();

                            Thread.Sleep(200);

                            Assert.IsTrue(pollerTask.IsCompleted);
                        }
                    }
                }
            }
        }
Beispiel #13
0
        public void AddSubscriber_BeforeRunning_DoesNotBindReceiver()
        {
            // Arrange
            var monitor = new NetMQMonitor(poller);

            // Act
            monitor.AddSubscriber(subscriber);

            // Assert
            mockSubscriber.Verify(m => m.InitializeConnection(), Times.Never);
        }
Beispiel #14
0
        public void AddSender_WithNullReceiver_DoesNotThrow()
        {
            // Arrange
            var monitor = new NetMQMonitor(poller);

            // Act
            TestDelegate add = () => monitor.AddSender(null);

            // Assert
            Assert.That(add, Throws.Nothing);
        }
Beispiel #15
0
        public void StartMonitoring_BeforeStarted_RunsPoller()
        {
            // Arrange
            var monitor = new NetMQMonitor(poller);

            // Act
            monitor.StartMonitoring();

            // Assert
            mockPoller.Verify(m => m.RunAsync(), Times.Once);
        }
Beispiel #16
0
        public void AddSubscriber_WithReceiver_AddsPollableSocketToPoller()
        {
            // Arrange
            var monitor = new NetMQMonitor(poller);

            // Act
            monitor.AddSubscriber(subscriber);

            // Assert
            mockPoller.Verify(m => m.Add(It.IsIn(pollableSocket)), Times.Once);
        }
Beispiel #17
0
 public void StartAsync()
 {          
     using (var rep = new ResponseSocket())
     using (var monitor = new NetMQMonitor(rep, "inproc://foo", SocketEvents.Closed))
     {
         var task = monitor.StartAsync();
         Thread.Sleep(200);
         Assert.AreEqual(TaskStatus.Running, task.Status);
         monitor.Stop();
         Assert.True(task.Wait(TimeSpan.FromMilliseconds(1000)));
     }
 }
Beispiel #18
0
 public void StartAsync()
 {
     using (var rep = new ResponseSocket())
         using (var monitor = new NetMQMonitor(rep, "inproc://foo", SocketEvents.Closed))
         {
             var task = monitor.StartAsync();
             Thread.Sleep(200);
             Assert.AreEqual(TaskStatus.Running, task.Status);
             monitor.Stop();
             Assert.True(task.Wait(TimeSpan.FromMilliseconds(1000)));
         }
 }
Beispiel #19
0
        public void StartMonitor_WithPublisherAdded_BindsReceiver()
        {
            // Arrange
            var monitor = new NetMQMonitor(poller);

            monitor.AddPublisher(publisher);

            // Act
            monitor.StartMonitoring();

            // Assert
            mockPublisher.Verify(m => m.InitializeConnection(), Times.Once);
        }
Beispiel #20
0
        public void StartMonitor_WithSubscriberAdded_ConnectsReceiver()
        {
            // Arrange
            var monitor = new NetMQMonitor(poller);

            monitor.AddSubscriber(subscriber);

            // Act
            monitor.StartMonitoring();

            // Assert
            mockSubscriber.Verify(m => m.InitializeConnection(), Times.Once);
        }
Beispiel #21
0
        public void StopMonitoring_WhenRunning_StopsPoller()
        {
            // Arrange
            var monitor = new NetMQMonitor(poller);

            monitor.StartMonitoring();

            // Act
            monitor.StopMonitoring();

            // Assert
            mockPoller.Verify(m => m.StopAsync(), Times.Once);
        }
Beispiel #22
0
        private NetMQMonitor CreateMonitor(NetMQContext context, NetMQSocket socket, Poller poller)
        {
            var monitor = new NetMQMonitor(context, socket, $"inproc://{Guid.NewGuid()}.inproc",
                SocketEvents.Connected | SocketEvents.Disconnected | SocketEvents.ConnectRetried);

            monitor.Connected += Monitor_Connected;
            monitor.Disconnected += Monitor_Disconnected;
            monitor.ConnectRetried += Monitor_ConnectRetried;

            monitor.AttachToPoller(poller);

            return monitor;
        }
Beispiel #23
0
        private NetMQMonitor CreateMonitor(NetMQSocket socket, NetMQPoller poller)
        {
            var monitor = new NetMQMonitor(socket, $"inproc://{Guid.NewGuid()}.inproc",
                                           SocketEvents.Connected | SocketEvents.Disconnected | SocketEvents.ConnectRetried);

            monitor.Connected      += Monitor_Connected;
            monitor.Disconnected   += Monitor_Disconnected;
            monitor.ConnectRetried += Monitor_ConnectRetried;

            monitor.AttachToPoller(poller);

            return(monitor);
        }
Beispiel #24
0
        public void AddReceiver_AfterStarted_BindsReceiver()
        {
            // Arrange
            var monitor = new NetMQMonitor(poller);

            monitor.StartMonitoring();

            // Act
            monitor.AddReceiver(receiver);

            // Assert
            mockReceiver.Verify(m => m.InitializeConnection(), Times.Once);
        }
Beispiel #25
0
        public void StopMonitoring_WithSubscriberAdded_UnbindsReceiver()
        {
            // Arrange
            var monitor = new NetMQMonitor(poller);

            monitor.AddSubscriber(subscriber);
            monitor.StartMonitoring();

            // Act
            monitor.StopMonitoring();

            // Assert
            mockSubscriber.Verify(m => m.TerminateConnection(), Times.Once);
        }
Beispiel #26
0
        public void ErrorCodeTest()
        {
            bool eventArrived = false;

            using (NetMQContext contex = NetMQContext.Create())
            {
                using (var req = contex.CreateRequestSocket())
                {
                    using (var rep = contex.CreateResponseSocket())
                    {
                        using (NetMQMonitor monitor =
                                   new NetMQMonitor(contex, req, "inproc://rep.inproc", SocketEvent.ConnectDelayed))
                        {
                            monitor.ConnectDelayed += (s, a) =>
                            {
                                eventArrived = true;
                            };

                            monitor.Timeout = TimeSpan.FromMilliseconds(100);

                            var pollerTask = Task.Factory.StartNew(monitor.Start);

                            rep.Bind("tcp://127.0.0.1:5002");


                            req.Connect("tcp://127.0.0.1:5002");
                            req.Send("a");

                            bool more;

                            string m = rep.ReceiveString(out more);

                            rep.Send("b");

                            string m2 = req.ReceiveString(out more);

                            Thread.Sleep(200);

                            Assert.IsTrue(eventArrived);

                            monitor.Stop();

                            Thread.Sleep(200);

                            Assert.IsTrue(pollerTask.IsCompleted);
                        }
                    }
                }
            }
        }
Beispiel #27
0
        public void StopMonitoring_WithSenderAdded_DisconnectsSender()
        {
            // Arrange
            var monitor = new NetMQMonitor(poller);

            monitor.AddSender(sender);
            monitor.StartMonitoring();

            // Act
            monitor.StopMonitoring();

            // Assert
            mockSender.Verify(m => m.TerminateConnection(), Times.Once);
        }
Beispiel #28
0
        public void AddSubscriber_AfterStopped_DoesNotBindReceiver()
        {
            // Arrange
            var monitor = new NetMQMonitor(poller);

            monitor.StartMonitoring();
            monitor.StopMonitoring();

            // Act
            monitor.AddSubscriber(subscriber);

            // Assert
            mockSubscriber.Verify(m => m.InitializeConnection(), Times.Never);
        }
Beispiel #29
0
        private void InitializePublisherOnFirstUse()
        {
            if (m_initializePublisherDone == false)             // Double checked locking.
            {
                lock (m_initializePublisherLock)
                {
                    if (m_initializePublisherDone == false)
                    {
                        Console.WriteLine("Publisher socket binding to: {0}", ZeroMqAddress);
                        m_publisherSocket = new PublisherSocket();

                        // Corner case: wait until publisher socket is ready (see code below that waits for
                        // "_publisherReadySignal").
                        NetMQMonitor monitor;
                        {
                            // Must ensure that we have a unique monitor name for every instance of this class.
                            string endPoint = string.Format("inproc://#SubjectNetMQ#Publisher#{0}#{1}", this.QueueName, this.ZeroMqAddress);
                            monitor = new NetMQMonitor(m_publisherSocket, endPoint,
                                                       SocketEvents.Accepted | SocketEvents.Listening
                                                       );
                            monitor.Accepted  += Publisher_Event_Accepted;
                            monitor.Listening += Publisher_Event_Listening;
                            monitor.StartAsync();
                        }


                        m_publisherSocket.Options.SendHighWatermark = 2000 * 1000;

                        m_publisherSocket.Bind(this.ZeroMqAddress);

                        // Corner case: wait until publisher socket is ready (see code below that sets
                        // "_publisherReadySignal").
                        {
                            Stopwatch sw = Stopwatch.StartNew();
                            m_publisherReadySignal.WaitOne(TimeSpan.FromMilliseconds(3000));
                            Console.Write("Publisher: Waited {0} ms for binding.\n", sw.ElapsedMilliseconds);
                        }
                        {
                            monitor.Accepted  -= Publisher_Event_Accepted;
                            monitor.Listening -= Publisher_Event_Listening;
                            // Current issue with NegMQ: Cannot stop or dispose monitor, or else it stops the parent socket.
                            //monitor.Stop();
                            //monitor.Dispose();
                        }
                        m_initializePublisherDone = true;
                    }
                }                  // lock
                Thread.Sleep(500); // Otherwise, the first item we publish may get missed by the subscriber.
            }
        }
Beispiel #30
0
        public void ErrorCodeTest()
        {
            bool eventArrived = false;

            using (NetMQContext contex = NetMQContext.Create())
            {
                using (var req = contex.CreateRequestSocket())
                {
                    using (var rep = contex.CreateResponseSocket())
                    {
                        using (NetMQMonitor monitor =
                            new NetMQMonitor(contex, req, "inproc://rep.inproc", SocketEvent.ConnectDelayed))
                        {
                            monitor.ConnectDelayed += (s, a) =>
                            {
                                eventArrived = true;
                            };

                            monitor.Timeout = TimeSpan.FromMilliseconds(100);

                            var pollerTask = Task.Factory.StartNew(monitor.Start);

                            rep.Bind("tcp://127.0.0.1:5002");

                            req.Connect("tcp://127.0.0.1:5002");
                            req.Send("a");

                            bool more;

                            string m = rep.ReceiveString(out more);

                            rep.Send("b");

                            string m2 = req.ReceiveString(out more);

                            Thread.Sleep(200);

                            Assert.IsTrue(eventArrived);

                            monitor.Stop();

                            Thread.Sleep(200);

                            Assert.IsTrue(pollerTask.IsCompleted);
                        }
                    }
                }
            }
        }
Beispiel #31
0
        private static async Task CreatePushSocket()
        {
            var poller = new NetMQPoller();

            push = new PushSocket();
            push.BindRandomPort("tcp://127.0.0.1");
            NetMQMonitor monitor = new NetMQMonitor(push, "inproc://req.inproc", SocketEvents.All);

            monitor.Connected     += Monitor_Connected;
            monitor.EventReceived += Monitor_EventReceived;
            //monitor.AttachToPoller(poller);
            queue.ReceiveReady += Queue_ReceiveReady;;
            push.Connect(address);
            poller.Add(push);
            poller.Add(queue);
            poller.RunAsync();
            await monitor.StartAsync();
        }
Beispiel #32
0
        public void Monitoring()
        {
            var listeningEvent = new ManualResetEvent(false);
            var acceptedEvent  = new ManualResetEvent(false);
            var connectedEvent = new ManualResetEvent(false);

            using (var context = NetMQContext.Create())
                using (var rep = context.CreateResponseSocket())
                    using (var req = context.CreateRequestSocket())
                        using (var poller = new Poller {
                            PollTimeout = TestPollTimeoutMillis
                        })
                            using (var repMonitor = new NetMQMonitor(context, rep, "inproc://rep.inproc", SocketEvent.Accepted | SocketEvent.Listening))
                                using (var reqMonitor = new NetMQMonitor(context, req, "inproc://req.inproc", SocketEvent.Connected))
                                {
                                    repMonitor.Accepted  += (s, e) => acceptedEvent.Set();
                                    repMonitor.Listening += (s, e) => listeningEvent.Set();

                                    repMonitor.AttachToPoller(poller);

                                    int port = rep.BindRandomPort("tcp://127.0.0.1");

                                    reqMonitor.Connected += (s, e) => connectedEvent.Set();

                                    reqMonitor.AttachToPoller(poller);

                                    poller.PollTillCancelledNonBlocking();

                                    req.Connect("tcp://127.0.0.1:" + port);
                                    req.Send("a");

                                    rep.SkipFrame();

                                    rep.Send("b");

                                    req.SkipFrame();

                                    Assert.IsTrue(listeningEvent.WaitOne(300));
                                    Assert.IsTrue(connectedEvent.WaitOne(300));
                                    Assert.IsTrue(acceptedEvent.WaitOne(300));

                                    poller.CancelAndJoin();
                                }
        }
Beispiel #33
0
        public void NoHangWhenMonitoringUnboundInprocAddress()
        {                        
            using (var monitor = new NetMQMonitor(new PairSocket(), "inproc://unbound-inproc-address", ownsSocket: true))
            {
                var task = Task.Factory.StartNew(monitor.Start);
                monitor.Stop();

                try
                {
                    task.Wait(TimeSpan.FromMilliseconds(1000));
                    Assert.Fail("Exception expected");
                }
                catch (AggregateException ex)
                {
                    Assert.AreEqual(1, ex.InnerExceptions.Count);
                    Assert.IsTrue(ex.InnerExceptions.Single() is EndpointNotFoundException);
                }
            }
        }
Beispiel #34
0
        public void NoHangWhenMonitoringUnboundInprocAddress()
        {
            using (var monitor = new NetMQMonitor(new PairSocket(), "inproc://unbound-inproc-address", ownsSocket: true))
            {
                var task = Task.Factory.StartNew(monitor.Start);
                monitor.Stop();

                try
                {
                    task.Wait(TimeSpan.FromMilliseconds(1000));
                    Assert.Fail("Exception expected");
                }
                catch (AggregateException ex)
                {
                    Assert.AreEqual(1, ex.InnerExceptions.Count);
                    Assert.IsTrue(ex.InnerExceptions.Single() is EndpointNotFoundException);
                }
            }
        }
Beispiel #35
0
 private static void CreatePullSocket()
 {
     try
     {
         var          poller  = new NetMQPoller();
         NetMQMonitor monitor = new NetMQMonitor(pull, "inproc://req.inproc", SocketEvents.All);
         monitor.Accepted      += Monitor_Accepted;
         monitor.EventReceived += Monitor_EventReceived;
         pull.ReceiveReady     += Pull_ReceiveReady1;
         pull.Bind(address);
         //monitor.AttachToPoller(poller);
         poller.Add(pull);
         poller.RunAsync();
         monitor.StartAsync();
     }
     catch (Exception ex)
     {
     }
 }
Beispiel #36
0
        /// <summary>
        /// Unbind the socket from last endpoint and wait until the underlaying socket was unbound and disposed.
        /// It will also dispose the NetMQSocket
        /// </summary>
        /// <param name="sub"></param>
        public static void Unbind(this NetMQSocket sub)
        {
            using (var monitor = new NetMQMonitor(sub, $"inproc://unbind.wait.{Counter++}", SocketEvents.Closed))
            {
                var monitorTask = Task.Factory.StartNew(monitor.Start);

                var closed = new ManualResetEventSlim();

                monitor.Closed += (sender, args) => closed.Set();

                Assert.IsNotNull(sub.Options.LastEndpoint);

                sub.Unbind(sub.Options.LastEndpoint);
                closed.Wait(1000);

                monitor.Stop();

                monitorTask.Wait();
            }
        }
Beispiel #37
0
        public bool TryConnectAndMonitorSocket(NetMQSocket socket, string address, NetMQPoller poller = null, Action <IConnectionMonitor, bool> onConnectionStateChanged = null)
        {
            _onConnectionStateChanged = onConnectionStateChanged;

            _monitor               = new NetMQMonitor(socket, $"inproc://monitor.socket/{Guid.NewGuid()}", SocketEvents.Connected | SocketEvents.Disconnected);
            _monitor.Connected    += MonitorConnected;
            _monitor.Disconnected += MonitorDisconnected;

            if (poller == null)
            {
                _monitorTask = _monitor.StartAsync();
            }
            else
            {
                _monitor.AttachToPoller(poller);
            }

            socket.Connect(address);
            return(WaitForConnection());
        }
Beispiel #38
0
        /// <summary>
        /// Unbind the socket from last endpoint and wait until the underlaying socket was unbound and disposed.
        /// It will also dispose the NetMQSocket
        /// </summary>
        /// <param name="sub"></param>
        public static void Unbind(this NetMQSocket sub)
        {
            using (var monitor = new NetMQMonitor(sub, $"inproc://unbind.wait.{Counter++}", SocketEvents.Closed))
            {
                var monitorTask = Task.Factory.StartNew(monitor.Start);

                var closed = new ManualResetEventSlim();

                monitor.Closed += (sender, args) => closed.Set();

                Assert.IsNotNull(sub.Options.LastEndpoint);

                sub.Unbind(sub.Options.LastEndpoint);
                closed.Wait(1000);

                monitor.Stop();

                monitorTask.Wait();
            }
        }
Beispiel #39
0
        public void Monitoring()
        {
            var listeningEvent = new ManualResetEvent(false);
            var acceptedEvent = new ManualResetEvent(false);
            var connectedEvent = new ManualResetEvent(false);

            using (var rep = new ResponseSocket())
            using (var req = new RequestSocket())
            using (var poller = new NetMQPoller())
            using (var repMonitor = new NetMQMonitor(rep, "inproc://rep.inproc", SocketEvents.Accepted | SocketEvents.Listening))
            using (var reqMonitor = new NetMQMonitor(req, "inproc://req.inproc", SocketEvents.Connected))
            {
                repMonitor.Accepted += (s, e) => acceptedEvent.Set();
                repMonitor.Listening += (s, e) => listeningEvent.Set();

                repMonitor.AttachToPoller(poller);

                int port = rep.BindRandomPort("tcp://127.0.0.1");

                reqMonitor.Connected += (s, e) => connectedEvent.Set();

                reqMonitor.AttachToPoller(poller);

                poller.RunAsync();

                req.Connect("tcp://127.0.0.1:" + port);
                req.SendFrame("a");

                rep.SkipFrame();

                rep.SendFrame("b");

                req.SkipFrame();

                Assert.IsTrue(listeningEvent.WaitOne(300));
                Assert.IsTrue(connectedEvent.WaitOne(300));
                Assert.IsTrue(acceptedEvent.WaitOne(300));

                poller.Stop();
            }
        }
Beispiel #40
0
        public void Monitoring()
        {            
            using (var rep = new ResponseSocket())
            using (var req = new RequestSocket())
            using (var monitor = new NetMQMonitor(rep, $"inproc://rep.inproc", SocketEvents.Accepted | SocketEvents.Listening))
            {
                var listening = false;
                var accepted = false;

                monitor.Accepted += (s, a) => { accepted = true; };
                monitor.Listening += (s, a) => { listening = true; };

                monitor.Timeout = TimeSpan.FromMilliseconds(100);

                var monitorTask = Task.Factory.StartNew(monitor.Start);

                Thread.Sleep(10);

                var port = rep.BindRandomPort("tcp://127.0.0.1");

                req.Connect("tcp://127.0.0.1:" + port);

                req.SendFrame("a");
                rep.SkipFrame();

                rep.SendFrame("b");
                req.SkipFrame();

                Thread.Sleep(200);

                Assert.IsTrue(listening);
                Assert.IsTrue(accepted);

                monitor.Stop();

                Thread.Sleep(200);

                Assert.IsTrue(monitorTask.IsCompleted);                
            }            
        }
Beispiel #41
0
        public void ErrorCodeTest()
        {
            using (var context = NetMQContext.Create())
            using (var req = context.CreateRequestSocket())
            using (var rep = context.CreateResponseSocket())
            using (var monitor = new NetMQMonitor(context, req, "inproc://rep.inproc", SocketEvents.ConnectDelayed))
            {
                var eventArrived = false;

                monitor.ConnectDelayed += (s, a) => { eventArrived = true; };

                monitor.Timeout = TimeSpan.FromMilliseconds(100);

                var monitorTask = Task.Factory.StartNew(monitor.Start);

                var port = rep.BindRandomPort("tcp://127.0.0.1");

                req.Connect("tcp://127.0.0.1:" + port);

                req.Send("a");
                rep.SkipFrame();

                rep.Send("b");
                req.SkipFrame();

                Thread.Sleep(200);

                Assert.IsTrue(eventArrived);

                monitor.Stop();

                Thread.Sleep(200);

                Assert.IsTrue(monitorTask.IsCompleted);
            }
        }
Beispiel #42
0
 public NetMQMonitorIntervalEventArgs(NetMQMonitor monitor, string address, int interval)
     : base(monitor, address)
 {
     Interval = interval;
 }
Beispiel #43
0
 public ConnectionMonitor(NetMQContext context, NetMQSocket monitoredSocket, Poller poller)
 {
     _monitor = CreateMonitor(context, monitoredSocket, poller);
 }
Beispiel #44
0
 /// <summary>
 /// Create a new NetMQMonitorSocketEventArgs that contains the given monitor, address, and socket.
 /// </summary>
 /// <param name="monitor">The <see cref="NetMQMonitor"/> that raised this event.</param>
 /// <param name="address">The address of the event.</param>
 /// <param name="socketEvent">The type of socket event that occurred.</param>
 /// <param name="socket">The socket upon which this event occurred.</param>
 public NetMQMonitorSocketEventArgs( NetMQMonitor monitor,  string address,  AsyncSocket socket, SocketEvents socketEvent)
     : base(monitor, address, socketEvent)
 {
     Socket = socket;
 }
Beispiel #45
0
 /// <summary>
 /// Create a new NetMQMonitorErrorEventArgs that contains the given monitor, address, and error-code.
 /// </summary>
 /// <param name="monitor">The <see cref="NetMQMonitor"/> that raised this event.</param>
 /// <param name="address">The address of the event.</param>
 /// <param name="socketEvent">The type of socket event that occurred.</param>
 /// <param name="errorCode">The error code associated with this event.</param>
 public NetMQMonitorErrorEventArgs( NetMQMonitor monitor,  string address, ErrorCode errorCode, SocketEvents socketEvent)
     : base(monitor, address, socketEvent)
 {
     ErrorCode = errorCode;
 }
Beispiel #46
0
        public void Monitoring()
        {
            ManualResetEvent listeningEvent = new ManualResetEvent(false);
            ManualResetEvent acceptedEvent = new ManualResetEvent(false);
            ManualResetEvent connectedEvent = new ManualResetEvent(false);

            using (NetMQContext contex = NetMQContext.Create())
            using (Poller poller = new Poller())
            {
                using (var rep = contex.CreateResponseSocket())
                {
                    using (NetMQMonitor monitor = new NetMQMonitor(contex, rep, "inproc://rep.inproc", SocketEvent.Accepted | SocketEvent.Listening))
                    {
                        monitor.Accepted += (s, a) => acceptedEvent.Set();
                        monitor.Listening += (s, a) => listeningEvent.Set();

                        monitor.AttachToPoller(poller);

                        rep.Bind("tcp://127.0.0.1:5002");

                        using (var req = contex.CreateRequestSocket())
                        {
                            using (NetMQMonitor reqMonitor = new NetMQMonitor(contex, req, "inproc://req.inproc", SocketEvent.Connected))
                            {
                                reqMonitor.Connected += (s, a) => connectedEvent.Set();

                                reqMonitor.AttachToPoller(poller);
                                try
                                {
                                    var pollerTask = Task.Factory.StartNew(poller.Start);

                                    req.Connect("tcp://127.0.0.1:5002");
                                    req.Send("a");

                                    bool more;

                                    string m = rep.ReceiveString(out more);

                                    rep.Send("b");

                                    string m2 = req.ReceiveString(out more);

                                    Assert.IsTrue(listeningEvent.WaitOne(300));
                                    Assert.IsTrue(connectedEvent.WaitOne(300));
                                    Assert.IsTrue(acceptedEvent.WaitOne(300));
                                }
                                finally
                                {
                                    poller.Stop();
                                }
                            }
                        }
                    }
                }
            }
        }
		private PublisherSocket GetNewPublisherSocket(string addressZeroMq)
		{
			PublisherSocket publisherSocket;
			{
				_loggerDelegate?.Invoke(string.Format("Publisher socket binding to: {0}\n", addressZeroMq));

				publisherSocket = new PublisherSocket();

				// Corner case: wait until publisher socket is ready (see code below that waits for
				// "_publisherReadySignal").
				NetMQMonitor monitor;
				{
					// Must ensure that we have a unique monitor name for every instance of this class.
					string endPoint = string.Format("inproc://#SubjectNetMQ#Publisher#{0}#{1}", addressZeroMq, Guid.NewGuid().ToString());
					monitor = new NetMQMonitor(publisherSocket,
						endPoint,
						SocketEvents.Accepted | SocketEvents.Listening
						);
					monitor.Accepted += Publisher_Event_Accepted;                    
                    monitor.Listening += Publisher_Event_Listening;
					monitor.StartAsync();
				}

				publisherSocket.Options.SendHighWatermark = this.HighwaterMark;
				try
				{
					publisherSocket.Bind(addressZeroMq);
				}
				catch (NetMQException ex)
				{
					// This is usually because the address is in use.
					throw new Exception(string.Format("Error E56874. Cannot bind publisher to '{0}'. 95% probability that this is caused by trying to bind a publisher to a port already in use by another process. To fix, choose a unique publisher port for this process. For more on this error, see 'Readme.md' (or the GitHub homepage for NetMQ.ReactiveExtensions).", addressZeroMq), ex);
				}
				
				// Corner case: wait until publisher socket is ready (see code below that sets "_publisherReadySignal").
				{
					Stopwatch sw = Stopwatch.StartNew();
					_publisherReadySignal.WaitOne(TimeSpan.FromMilliseconds(3000));
					_loggerDelegate?.Invoke(string.Format("Publisher: Waited {0} ms for binding.\n", sw.ElapsedMilliseconds));
				}
				{
					monitor.Accepted -= Publisher_Event_Accepted;
					monitor.Listening -= Publisher_Event_Listening;
					// Current issue with NegMQ: Cannot stop or dispose monitor, or else it stops the parent socket.
					//monitor.Stop();
					//monitor.Dispose();
				}
			}

            // Otherwise, the first item we publish may get missed by the subscriber. 500 milliseconds consistently works 
            // locally, but occasionally fails on the AppVeyor build server. 650 milliseconds is optimal.
            using (EventWaitHandle wait = new ManualResetEvent(false))
            {
                // Cannot use Thread.Sleep() here, as this is incompatible with .NET Core 1.0, Windows 8.0, 8.1, and 10.
                wait.WaitOne(TimeSpan.FromMilliseconds(650));
            }

            return publisherSocket;
		}
Beispiel #48
0
        public void Monitoring()
        {
            var listeningEvent = new ManualResetEvent(false);
            var acceptedEvent = new ManualResetEvent(false);
            var connectedEvent = new ManualResetEvent(false);

            using (var context = NetMQContext.Create())
            using (var rep = context.CreateResponseSocket())
            using (var req = context.CreateRequestSocket())
            using (var poller = new Poller { PollTimeout = TestPollTimeoutMillis })
            using (var repMonitor = new NetMQMonitor(context, rep, "inproc://rep.inproc", SocketEvents.Accepted | SocketEvents.Listening))
            using (var reqMonitor = new NetMQMonitor(context, req, "inproc://req.inproc", SocketEvents.Connected))
            {
                repMonitor.Accepted += (s, e) => acceptedEvent.Set();
                repMonitor.Listening += (s, e) => listeningEvent.Set();

                repMonitor.AttachToPoller(poller);

                int port = rep.BindRandomPort("tcp://127.0.0.1");

                reqMonitor.Connected += (s, e) => connectedEvent.Set();

                reqMonitor.AttachToPoller(poller);

                poller.PollTillCancelledNonBlocking();

                req.Connect("tcp://127.0.0.1:" + port);
                req.SendFrame("a");

                rep.SkipFrame();

                rep.SendFrame("b");

                req.SkipFrame();

                Assert.IsTrue(listeningEvent.WaitOne(300));
                Assert.IsTrue(connectedEvent.WaitOne(300));
                Assert.IsTrue(acceptedEvent.WaitOne(300));

                poller.CancelAndJoin();
            }
        }
Beispiel #49
0
 public NetMQMonitorErrorEventArgs(NetMQMonitor monitor, string address, ErrorCode errorCode)
     : base(monitor, address)
 {
     ErrorCode = errorCode;
 }
Beispiel #50
0
        public void SubsriberCleanupOnUnbind(string address)
        {
            for (var i = 0; i < 10; i++)
            {
                using (var sub = new SubscriberSocket())
                {
                    sub.Bind(address);
                    using (var monitor = new NetMQMonitor(sub, String.Format("inproc://cleanup.test{0}", Guid.NewGuid()), SocketEvents.Closed))
                    {
                        var monitorTask = Task.Factory.StartNew(monitor.Start);

                        var closed = new ManualResetEventSlim();

                        monitor.Closed += (sender, args) => closed.Set();

                        var time = DateTime.Now;

                        sub.Unbind(address);

                        Assert.That(closed.Wait(1000), Is.True, "Unbind failed to report Closed event to the Monitor");
                        var duration = DateTime.Now - time;

                        monitor.Stop();

                        monitorTask.Wait();
                    }
                }
            }
        }
        public void Monitoring()
        {
            using (var context = NetMQContext.Create())
            using (var rep = context.CreateResponseSocket())
            using (var req = context.CreateRequestSocket())
            using (var monitor = new NetMQMonitor(context, rep, "inproc://rep.inproc", SocketEvent.Accepted | SocketEvent.Listening))
            {
                bool listening = false;
                bool accepted = false;

                monitor.Accepted += (s, a) => { accepted = true; };
                monitor.Listening += (s, a) => { listening = true; };

                monitor.Timeout = TimeSpan.FromMilliseconds(100);

                var pollerTask = Task.Factory.StartNew(monitor.Start);

                var port = rep.BindRandomPort("tcp://127.0.0.1");

                req.Connect("tcp://127.0.0.1:" + port);
                req.Send("a");

                rep.ReceiveString();

                rep.Send("b");

                req.ReceiveString();

                Thread.Sleep(200);

                Assert.IsTrue(listening);
                Assert.IsTrue(accepted);

                monitor.Stop();

                Thread.Sleep(200);

                Assert.IsTrue(pollerTask.IsCompleted);
            }
        }
Beispiel #52
0
 public NetMQMonitorEventArgs(NetMQMonitor monitor, string address)
 {
     Monitor = monitor;
     Address = address;
 }
Beispiel #53
0
 /// <summary>
 /// Create a new NetMQMonitorIntervalEventArgs containing the given NetMQMonitor, address, and interval.
 /// </summary>
 /// <param name="monitor">the NetMQMonitor</param>
 /// <param name="address">The a string denoting the address</param>
 /// <param name="interval">The interval, in milliseconds.</param>
 /// <param name="socketEvent">The type of socket event that occurred.</param>
 public NetMQMonitorIntervalEventArgs( NetMQMonitor monitor,  string address, int interval, SocketEvents socketEvent)
     : base(monitor, address, socketEvent)
 {
     Interval = interval;
 }
Beispiel #54
0
 public NetMQMonitorSocketEventArgs(NetMQMonitor monitor, string address, Socket socket)
     : base(monitor, address)
 {
     Socket = socket;
 }
Beispiel #55
0
 /// <summary>
 /// Create a new NetMQMonitorEventArgs that contains the given monitor and address.
 /// </summary>
 /// <param name="monitor">The <see cref="NetMQMonitor"/> that raised this event.</param>
 /// <param name="address">The address of the event.</param>
 /// <param name="socketEvent">The type of socket event that occurred.</param>
 protected NetMQMonitorEventArgs( NetMQMonitor monitor,  string address, SocketEvents socketEvent)
 {
     Monitor = monitor;
     Address = address;
     SocketEvent = socketEvent;
 }