Esempio n. 1
0
        private void Work()
        {
            using (var subscriberSocket = new SubscriberSocket())
            {
                subscriberSocket.Options.ReceiveHighWatermark = 1000;
                subscriberSocket.SubscribeToAnyTopic();
                subscriberSocket.Connect(_toPublisherEndpoint);


                using (var publisherSocket = new XPublisherSocket())
                {
                    publisherSocket.Options.XPubVerbose = true;
                    publisherSocket.Bind(_toSubscribersEndpoint);

                    using (_poller = new NetMQPoller {
                        new NetMQTimer(TimeSpan.FromMilliseconds(1)), subscriberSocket, publisherSocket
                    })
                    {
                        subscriberSocket.ReceiveReady += (s, e) =>
                        {
                            var message = e.Socket.ReceiveMultipartBytes();
                            var topic   = Encoding.UTF8.GetString(message[0]);
                            var payload = message[1];

                            _cache[topic] = payload;

                            publisherSocket.SendMultipartBytes(message);
                        };

                        publisherSocket.ReceiveReady += (s, e) =>
                        {
                            var message = e.Socket.ReceiveFrameBytes();
                            var isSub   = message[0] == 1;
                            var topic   = Encoding.UTF8.GetString(message.Skip(1).ToArray());

                            if (_cache.ContainsKey(topic))
                            {
                                publisherSocket.SendMoreFrame(Encoding.UTF8.GetBytes(topic)).SendFrame(_cache[topic]);
                            }
                        };

                        _poller.Run();
                    }
                }
            }
        }