예제 #1
0
        public void ReceiveTimeout()
        {
            ConsoleEx.DebugLog("Subscribe is timeout.", ConsoleEx.RED);

            if (poller != null)
            {
                if (poller.IsStarted)
                {
                    poller.CancelAndJoin();
                }
                poller.Dispose();
            }

            if (subSocket != null)
            {
                if (warInfo.warMo == WarMode.InLanWar)
                {
                    subSocket.Disconnect(ConnAddres);
                }
                subSocket.Close();
                subSocket = null;
            }

            poller = new Poller();
            establish();
        }
예제 #2
0
        public void Stop()
        {
            _subscribeThreadCancellation.Cancel();
            _pingThreadCancellation.Cancel();

            _subscribeThread.Join();
            _pingThread.Join();

            _subscribeThreadCancellation.Dispose();
            _pingThreadCancellation.Dispose();

            lock (_publishSocketLocker)
            {
                _publishSocket?.Disconnect(_publishAddress);
            }
            _subscribeSocket?.Disconnect(_subscribeAddress);

            lock (_publishSocketLocker)
            {
                _publishSocket?.Dispose();
            }
            _subscribeSocket?.Dispose();

            _messageHost?.Stop();
        }
예제 #3
0
        internal void GivenInstrument_WithSubscriber_PublishesMessage()
        {
            // Arrange
            this.publisher.Start();
            Task.Delay(100).Wait(); // Allow publisher to start

            var instrument = StubInstrumentProvider.AUDUSD();

            var subscriber = new SubscriberSocket(TestAddress);

            subscriber.Connect(TestAddress);
            subscriber.Subscribe(nameof(Instrument) + ":" + instrument.Symbol.Value);
            Task.Delay(100).Wait();

            // Act
            this.publisher.Endpoint.SendAsync(instrument);

            var topic   = subscriber.ReceiveFrameBytes();
            var message = subscriber.ReceiveFrameBytes();

            // Assert
            Assert.Equal("Instrument:AUD/USD.FXCM", Encoding.UTF8.GetString(topic));
            Assert.Equal(instrument, this.instrumentSerializer.Deserialize(message));

            // Tear Down
            subscriber.Disconnect(TestAddress);
            subscriber.Dispose();
            this.publisher.Stop().Wait();
            this.publisher.Dispose();
        }
예제 #4
0
        internal void GivenTickMessage_WithSubscriber_PublishesMessage()
        {
            // Arrange
            var symbol = new Symbol("AUDUSD", new Venue("FXCM"));

            var subscriber = new SubscriberSocket(TestAddress);

            subscriber.Connect(TestAddress);
            subscriber.Subscribe($"Quote:{symbol.Value}");

            Task.Delay(100).Wait();  // Allow subscribers to connect

            var tick = StubQuoteTickProvider.Create(symbol);

            // Act
            this.publisher.Endpoint.SendAsync(tick).Wait();

            var topic   = subscriber.ReceiveFrameBytes();
            var message = subscriber.ReceiveFrameBytes();

            // Assert
            Assert.Equal(1, this.publisher.SentCount);
            Assert.Equal("Quote:AUDUSD.FXCM", Encoding.UTF8.GetString(topic));
            Assert.Equal(tick.ToSerializableString(), Encoding.UTF8.GetString(message));

            // Tear Down
            subscriber.Disconnect(TestAddress);
            subscriber.Dispose();
            this.publisher.Stop().Wait();
            this.publisher.Dispose();
        }
예제 #5
0
        private void Subscriber(CancellationToken token, IObserver <TMessage> observer, ManualResetEventSlim subscribedEvent)
        {
            try
            {
                using (var socket = new SubscriberSocket())
                {
                    socket.Connect(_address);
                    socket.Subscribe(_topic);
                    subscribedEvent.Set();

                    while (!token.IsCancellationRequested)
                    {
                        ReceiveMessage(observer, socket);
                    }

                    socket.Unsubscribe(_topic);
                    socket.Disconnect(_address);
                    socket.Close();
                }
            }
            finally
            {
                if (!subscribedEvent.IsSet)
                {
                    subscribedEvent.Set();
                }
            }
        }
예제 #6
0
        /// <summary>
        /// Remote <see cref="IAddress"/> from the socket
        /// </summary>
        /// <param name="address"><see cref="IAddress"/> to be removed</param>
        public override void SocketRemove(IAddress address)
        {
            if (disposedValue)
            {
                throw new InvalidOperationException("NetMQSubscriber has been disposed");
            }

            socket.Disconnect(address.ToString());
        }
예제 #7
0
        public void Dispose()
        {
            _cancellationSource.Dispose();
            if (_poller.IsRunning)
            {
                _poller.Stop();
            }

            _responseSocket.Disconnect("tcp://127.0.0.1:3781");
            _poller.RemoveAndDispose(_responseSocket);
        }
예제 #8
0
        private static Task StartProcessor(string nodeAddr, string[] subscriptions, CancellationTokenSource cancellationTokenSource)
        {
            telemetryClient.TrackTrace($"Starting processor for {nodeAddr}", SeverityLevel.Information, new Dictionary <string, string>
            {
                { nameof(nodeAddr), nodeAddr },
            });
            return(Task.Factory.StartNew(async() =>
            {
                string index = "kv6";
                using (var socket = new SubscriberSocket())
                {
                    socket.Connect(nodeAddr);
                    try
                    {
                        subscriptions.All((s) =>
                        {
                            socket.Subscribe(s);
                            return true;
                        });

                        while (!cancellationTokenSource.IsCancellationRequested)
                        {
                            var messageList = socket.ReceiveMultipartBytes(2);
                            var subscription = Encoding.UTF8.GetString(messageList[0]);

                            string payload = null;
                            using (GZipStream stream = new GZipStream(new MemoryStream(messageList[1]), CompressionMode.Decompress))
                                using (var sr = new StreamReader(stream))
                                    payload = await sr.ReadToEndAsync();

#if DEBUG
                            Console.Write($"{subscription} - {payload.Length} chars...");
#endif

                            var xml = DeserializeMessage(payload);
                            telemetryClient.TrackTrace($"Received payload for {subscription}, size: {payload.Length} characters", SeverityLevel.Verbose, new Dictionary <string, string>
                            {
                                { nameof(subscription), subscription },
                                { nameof(payload), payload },
                            });
                            var jsonObjects = GetJsonRepresentation(xml.Timestamp, xml.KV6posinfo);
                            await StoreJsonObjects(index, jsonObjects);
                        }
                    }
                    finally
                    {
                        socket.Disconnect(nodeAddr);
                        socket.Close();
                        telemetryClient.TrackTrace("Stopped processor", SeverityLevel.Information);
                    }
                }
            }, cancellationTokenSource.Token));
        }
예제 #9
0
        /// <summary>
        /// This thread is needed to handle network disconnects.
        /// </summary>
        /// <remarks>
        /// If the PC the message host is running on disconnects from the
        /// network, the subscribe thread is never able to reconnect to it by
        /// itself. Therefore we periodically network ping the subscriber
        /// address to check if it responds. If it at one point does not
        /// respond we will need to reconnect to it again when it starts
        /// responding.
        /// </remarks>
        private void PingThread()
        {
            Uri  uri = new Uri(_subscribeAddress);
            bool needsReinitialization = false;

            while (!_pingThreadCancellation.IsCancellationRequested)
            {
                bool pingable;

                Ping pinger = new Ping();
                try
                {
                    PingReply reply = pinger.Send(uri.Host, 1000);
                    pingable = reply != null && (reply.Status == IPStatus.Success);
                }
                catch (PingException)
                {
                    pingable = false;
                }

                if (!pingable)
                {
                    needsReinitialization = true;
                }

                if (pingable && needsReinitialization)
                {
                    _subscribeThreadCancellation.Cancel();

                    _subscribeSocket.Disconnect(_subscribeAddress);
                    _subscribeSocket.Dispose();

                    _subscribeThread.Join();

                    _subscribeThreadCancellation = new CancellationTokenSource();
                    _subscribeThread             = new Thread(SubscribeThread)
                    {
                        IsBackground = true
                    };
                    _subscribeThread.Start();

                    while (!_subscribeThreadRunning)
                    {
                        Thread.Sleep(50);
                    }

                    needsReinitialization = false;
                }

                Thread.Sleep(5000);
            }
        }
예제 #10
0
        public Task StopAsync(CancellationToken cancellationToken)
        {
            if (connected)
            {
                socket.Unsubscribe(_configuration["EventBus:Topic"]);
                socket.Disconnect(_configuration["NetMq:SubscribeConnection"]);

                poller.Stop();

                connected = false;
            }

            return(Task.CompletedTask);
        }
예제 #11
0
        static int Main(string[] args)
        {
            if (args.Length < 2)
            {
                Console.WriteLine("Arguments: <nodeAddr> <subscr...>");
                Console.WriteLine("Eg: tcp://node03.kv7.openov.nl:7817 /GOVI/KV8");
                return(-1);
            }

            var nodeAddr      = args[0];
            var subscriptions = args.Skip(1).ToArray();

            using (var socket = new SubscriberSocket())
            {
                int msgCount = 0;
                socket.Connect(nodeAddr);
                try
                {
                    subscriptions.All((s) =>
                    {
                        socket.Subscribe(s);
                        return(true);
                    });

                    // Download just 20 messages, it's just a test tool...
                    while (msgCount < 20)
                    {
                        var messageList = socket.ReceiveMultipartBytes(2);
                        msgCount++;
                        var msg1 = Encoding.UTF8.GetString(messageList[0]);
                        using (GZipStream stream = new GZipStream(new MemoryStream(messageList[1]), CompressionMode.Decompress))
                            using (var sr = new StreamReader(stream))
                            {
                                var msg2 = sr.ReadToEnd();
                                Console.Write($"{msg1} - {msg2.Length} chars...");
                                var filename = msg1.Substring(1).Replace('/', '-') + $"{msgCount}.xml";
                                File.WriteAllText(filename, msg2, Encoding.UTF8);
                                Console.WriteLine();
                            }
                    }
                }
                finally
                {
                    socket.Disconnect(nodeAddr);
                    socket.Close();
                }
            }

            return(0);
        }
예제 #12
0
 /// <summary>
 /// Cancels Subscription to the topic and closes connections.
 /// </summary>
 public void Stop()
 {
     if (Poller != null)
     {
         Poller.StopAsync();
         Poller.Dispose();
         Poller = null;
     }
     if (Subscriber != null)
     {
         Subscriber.ReceiveReady -= Subscriber_ReceiveReady;
         Subscriber.Unsubscribe(Topic);
         Subscriber.Disconnect("tcp://" + IP + ":" + Port.ToString());
         Subscriber = null;
     }
 }
예제 #13
0
        internal void Test_can_publish_events()
        {
            // Arrange
            const string testAddress = "tcp://127.0.0.1:56601";

            var publisher = new EventPublisher(
                this.container,
                new MsgPackEventSerializer(),
                new BypassCompressor(),
                EncryptionSettings.None(),
                new Label("test-publisher"),
                new Port(56601));

            publisher.Start().Wait();

            var subscriber = new SubscriberSocket(testAddress);

            subscriber.Connect(testAddress);
            subscriber.Subscribe("Event:Trade:TESTER-001");

            Task.Delay(100).Wait(); // Allow socket to subscribe

            var serializer = new MsgPackEventSerializer();
            var order      = new StubOrderBuilder().BuildMarketOrder();
            var rejected   = StubEventMessageProvider.OrderRejectedEvent(order);
            var tradeEvent = new TradeEvent(TraderId.FromString("TESTER-001"), rejected);

            // Act
            publisher.Endpoint.Send(tradeEvent);
            this.Output.WriteLine("Waiting for published events...");

            var topic   = subscriber.ReceiveFrameBytes();
            var message = subscriber.ReceiveFrameBytes();
            var @event  = serializer.Deserialize(message);

            // Assert
            Assert.Equal("Event:Trade:TESTER-001", Encoding.UTF8.GetString(topic));
            Assert.Equal(typeof(OrderRejected), @event.GetType());

            // Tear Down
            subscriber.Disconnect(testAddress);
            subscriber.Dispose();
            publisher.Stop().Wait();
            publisher.Dispose();
        }
예제 #14
0
        //!
        //! client function, listening for messages in receiveMessageQueue from server (executed in separate thread)
        //!
        public void listener()
        {
            AsyncIO.ForceDotNet.Force();
            using (var receiver = new SubscriberSocket())
            {
                receiver.SubscribeToAnyTopic();

                //receiver.Subscribe("client");
                //receiver.Subscribe("ncam");
                //receiver.Subscribe("record");

                receiver.Connect("tcp://" + VPETSettings.Instance.serverIP + ":5556");

                lastReceiveTime = currentTimeTime;

                Debug.Log("Listener connected: " + "tcp://" + VPETSettings.Instance.serverIP + ":5556");
                byte[] input;
                while (isRunning)
                {
                    if (receiver.TryReceiveFrameBytes(out input))
                    {
                        //Thread.Sleep(100);
                        //this.receiveMessageQueue.Clear();
                        this.receiveMessageQueue.Add(input);

                        lastReceiveTime = currentTimeTime;
                    }
                    else
                    {
                        listenerRestartCount = Mathf.Min(int.MaxValue, listenerRestartCount + 1);
                        // VPETSettings.Instance.msg = string.Format("Exception in Listener: {0}", listenerRestartCount);
                        if (currentTimeTime - lastReceiveTime > receiveTimeout)
                        {
                            // break;
                        }
                    }
                }
                receiver.Disconnect("tcp://" + VPETSettings.Instance.serverIP + ":5556");
                receiver.Close();
                receiver.Dispose();
            }
            //NetMQConfig.Cleanup();
        }
예제 #15
0
 private void StopRealTimeDataSocket()
 {
     lock (realTimeDataSocketLock)
     {
         if (realTimeDataSocket != null)
         {
             try
             {
                 realTimeDataSocket.Disconnect(realTimeDataConnectionString);
             }
             finally
             {
                 realTimeDataSocket.ReceiveReady -= RealTimeDataSocketReceiveReady;
                 realTimeDataSocket.Close();
                 realTimeDataSocket = null;
             }
         }
     }
 }
예제 #16
0
 /// <summary>
 /// 关闭套接字
 /// </summary>
 private void CloseSocket()
 {
     lock (this)
     {
         if (_socket == null)
         {
             return;
         }
         try
         {
             _socket.Disconnect(Config.InnerAddress);
         }
         catch (Exception)
         {
             //LogRecorder.Exception(e);//一般是无法连接服务器而出错
         }
         _socket.Close();
         _socket = null;
     }
 }
예제 #17
0
        /// <summary>
        /// Shut down the service and clean up resources.
        /// </summary>
        public void Stop()
        {
            if (IsRunning)
            {
                try
                {
                    _poller.Stop();
                    _subscriberSocket.Disconnect(_publisherAddress);
                    _dealerSocket.Disconnect(_dealerAddress);

                    _poller.Dispose();
                    _subscriberSocket.Dispose();
                    _dealerSocket.Dispose();
                }
                finally
                {
                    IsRunning = false;
                    NetMQConfig.Cleanup();
                }
            }
        }
예제 #18
0
 private void reconnect()
 {
     DCLogger.LogError("Connection broked.");
     try
     {
         //if (clientR != null)
         //    clientR.Dispose();
         //createRSocket();
         string[] addrs = cfg.ServerS.Split(',');
         foreach (string addr in addrs)
         {
             clientR.Disconnect(addr);
             clientR.Connect(addr);
         }
         DCLogger.LogInfo("Connection reonlined.");
     }
     catch (Exception ex)
     {
         DCLogger.LogError("Exception when establish reconnect:{0}", ex.Message);
     }
 }
예제 #19
0
        internal void GivenMessageToPublish_WhenMessageValid_PublishesToSubscriber()
        {
            // Arrange
            var publisher = new MockDataPublisher(
                this.container,
                DataBusFactory.Create(this.container),
                EncryptionSettings.None(),
                ZmqNetworkAddress.LocalHost(new Port(55555)));

            publisher.Start().Wait();

            const string testAddress = "tcp://localhost:55555";
            var          subscriber  = new SubscriberSocket(testAddress);

            subscriber.Connect(testAddress);
            subscriber.Subscribe(TestTopic);

            Task.Delay(100).Wait(); // Allow sockets to subscribe

            // Act
            const string toSend = "1234,1234";

            publisher.Endpoint.SendAsync((TestTopic, toSend));

            var topic   = subscriber.ReceiveFrameBytes();
            var message = subscriber.ReceiveFrameBytes();

            // Assert
            Assert.Equal(TestTopic, Encoding.UTF8.GetString(topic));
            Assert.Equal(toSend, Encoding.UTF8.GetString(message));
            Assert.Equal(ComponentState.Running, publisher.ComponentState);
            Assert.Equal(1, publisher.SentCount);

            // Tear Down
            subscriber.Disconnect(testAddress);
            subscriber.Dispose();
            publisher.Stop().Wait();
            publisher.Dispose();
        }
        static void Main(string[] args)
        {
            var addr = "tcp://127.0.0.1:3004";

            NetMQPoller poller = new NetMQPoller();

            using (var subSocket = new SubscriberSocket())
            {
                subSocket.ReceiveReady += OnReceiveReady;
                subSocket.Options.ReceiveHighWatermark = 10;
                subSocket.Connect(addr);
                subSocket.Subscribe("NQ");

                poller.Add(subSocket);
                Task.Factory.StartNew(() => { poller.Run(); });

                for (int i = 0; i < 20; i++)
                {
                    Thread.Sleep(1000);
                }

                subSocket.Disconnect(addr);
            }
        }
        private void receiveMessagesAsync(object sender, DoWorkEventArgs e)
        {
            Debug.Log("ZMQReceiver starting async worker");

            // need to create ZMQ socket in thread that is going to use it
            if (m_socket == null)
            {
                AsyncIO.ForceDotNet.Force();
                m_socket = new SubscriberSocket();
                m_socket.Connect(m_address);
                Debug.Log("ZMQReceiver socket init ok");
            }

            const int messagePartsCount = 2;

            while (!m_workerThread.CancellationPending)
            {
                while (m_pendingReceivePackets.Count > 0)
                {
                    ReceivePacket recv = null;
                    if (m_pendingReceivePackets.TryDequeue(out recv))
                    {
                        if (recv == null)
                        {
                            continue;
                        }

                        if (recv.messageCallback == null)
                        {
                            Debug.LogError("ZMQReceiver: Object '" + recv.objectName + "' registered null Action<> callback. Ignoring this subscription.");
                            continue;
                        }

                        //recv.objectName;
                        m_socket.Subscribe(recv.subscriptionName);
                        m_receivePackets.Add(recv);
                    }
                }

                NetMQMessage multipartMessage = new NetMQMessage(messagePartsCount);
                var          hasMessage       = m_socket.TryReceiveMultipartMessage(TimeSpan.FromMilliseconds(100), ref multipartMessage, messagePartsCount);

                if (multipartMessage.IsEmpty)
                {
                    log("ZMQReceiver: failed to receive message");
                    continue;
                }

                string address = multipartMessage[0].ConvertToString();
                string message = multipartMessage[1].ConvertToString();

                m_receivedValues.AddOrUpdate(address, message, (key, oldValue) => message);
                log("ZMQReceiver: " + address + " / " + message);
            }

            m_socket.Disconnect(m_address);
            m_socket.Dispose();
            m_socket = null;

            e.Cancel = true;
            Debug.Log("ZMQReceiver: async thread finished");
        }
예제 #22
0
        /// <summary>
        /// Disconnects from the server.
        ///  </summary>
        public void Disconnect(bool cancelStreams = true)
        {
            //start by canceling all active real time streams
            if (cancelStreams)
            {
                while (RealTimeDataStreams.Count > 0)
                {
                    CancelRealTimeData(RealTimeDataStreams.First().Instrument);
                }
            }

            _running = false;
            if (_poller != null && _poller.IsStarted)
            {
                _poller.Stop(true);
            }

            if (_heartBeatTimer != null)
            {
                _heartBeatTimer.Stop();
            }

            if (_dealerLoopThread != null && _dealerLoopThread.ThreadState == ThreadState.Running)
            {
                _dealerLoopThread.Join(10);
            }

            if (_reqSocket != null)
            {
                try
                {
                    _reqSocket.Disconnect(string.Format("tcp://{0}:{1}", _host, _realTimeRequestPort));
                }
                catch
                {
                    _reqSocket.Dispose();
                    _reqSocket = null;
                }
            }

            if (_subSocket != null)
            {
                try
                {
                    _subSocket.Disconnect(string.Format("tcp://{0}:{1}", _host, _realTimePublishPort));
                }
                catch
                {
                    _subSocket.Dispose();
                    _subSocket = null;
                }
            }

            if (_dealerSocket != null)
            {
                try
                {
                    _dealerSocket.Disconnect(string.Format("tcp://{0}:{1}", _host, _historicalDataPort));
                }
                catch
                {
                    _dealerSocket.Dispose();
                    _dealerSocket = null;
                }
            }
        }
예제 #23
0
 protected override void OnStop(SubscriberSocket socket)
 {
     socket.Disconnect(_address);
 }
예제 #24
0
        /// <summary>
        ///     Disconnects from the server.
        /// </summary>
        public void Disconnect(bool cancelStreams = true)
        {
            if (!PollerRunning)
            {
                return;
            }
            // Start by canceling all active real time streams
            if (cancelStreams)
            {
                while (RealTimeDataStreams.Count > 0)
                {
                    CancelRealTimeData(RealTimeDataStreams.First().Instrument);
                }
            }

            _poller?.Stop();
            _poller?.Dispose();

            lock (_realTimeRequestSocketLock)
            {
                if (_realTimeRequestSocket != null)
                {
                    try
                    {
                        _realTimeRequestSocket.Disconnect(_realTimeRequestConnectionString);
                    }
                    finally
                    {
                        _realTimeRequestSocket.ReceiveReady -= RealTimeRequestSocketReceiveReady;
                        _realTimeRequestSocket.Close();
                        _realTimeRequestSocket = null;
                    }
                }
            }

            lock (_realTimeDataSocketLock)
            {
                if (_realTimeDataSocket != null)
                {
                    try
                    {
                        _realTimeDataSocket.Disconnect(_realTimeDataConnectionString);
                    }
                    finally
                    {
                        _realTimeDataSocket.ReceiveReady -= RealTimeDataSocketReceiveReady;
                        _realTimeDataSocket.Close();
                        _realTimeDataSocket = null;
                    }
                }
            }

            lock (_historicalDataSocket)
            {
                if (_historicalDataSocket != null)
                {
                    try
                    {
                        _historicalDataSocket.Disconnect(_historicalDataConnectionString);
                    }
                    finally
                    {
                        _historicalDataSocket.ReceiveReady -= HistoricalDataSocketReceiveReady;
                        _historicalDataSocket.Close();
                        _historicalDataSocket = null;
                    }
                }
            }

            _poller = null;
        }