Example #1
0
        public void UnpackMessage_Test()
        {
            // TODO: requires nsqlookupd/nsqd to be running. consider refactoring for testability.
            // I'd like to test PackMessage and UnpackMessage in NSQProtocol in isolation.

            // Arrange

            const string expectedName = "ʕ◔ϖ◔ʔ";
            DateTime expectedHireDate = new DateTime(2006, 1, 2, 15, 4, 5);

            NSQMessageEventArgs nsqMessageEventArgs = null;

            var pub = new NSQPublisher("127.0.0.1", 4150);
            pub.Initialize();

            var sub = new NSQ("127.0.0.1", 4161);
            sub.Topics.Add("unit_test_topic");
            sub.MessageHandler = (s, e) =>
                                 {
                                     ((NSQSubscriber)s).Finish(e.Message.MessageId);
                                     nsqMessageEventArgs = e;
                                 };

            Thread t = new Thread(sub.Listen);
            t.IsBackground = true;
            t.Start();

            // Act

            var sendTime = DateTime.UtcNow;
            pub.Publish("unit_test_topic", new { Name = expectedName, HireDate = expectedHireDate });

            while (nsqMessageEventArgs == null)
            {
                Task.Delay(50).Wait();

                if (DateTime.UtcNow > sendTime + TimeSpan.FromSeconds(2))
                {
                    Assert.True(false, "Timeout waiting for message");
                }
            }

            t.Abort();

            // Assert

            Assert.NotNull(nsqMessageEventArgs);
            Assert.NotNull(nsqMessageEventArgs.Message);
            Assert.NotNull(nsqMessageEventArgs.Message.Body);
            Assert.NotNull(nsqMessageEventArgs.Message.TimeStamp);

            dynamic body = JsonConvert.DeserializeObject(nsqMessageEventArgs.Message.Body);

            Assert.Equal(expectedName, (string)body.Name);
            Assert.Equal(expectedHireDate, (DateTime)body.HireDate);
            Assert.InRange(nsqMessageEventArgs.Message.TimeStamp.Value, sendTime, sendTime + TimeSpan.FromSeconds(2));
        }
Example #2
0
        static void Main(string[] args)
        {
            var options = new Options();
            var valid = CommandLine.Parser.Default.ParseArguments(args, options);

            if (!valid)
            {
                System.Environment.Exit(1);
                return;
            }
            Console.WriteLine("NSQnet CLI 1.0");
            var line = new StringBuilder();
            for (int x = 0; x < Console.WindowWidth; x++)
            {
                line.Append("=");
            }
            Console.WriteLine(line.ToString());

            var nsq = new NSQ(options.Hostname, options.Port);

            nsq.MessageHandler = (sender, e) =>
            {
                var sub = sender as NSQSubscriber;

                if (e.Message.Body.Length != 84)
                {
                    throw new Exception("Bad Message!");
                }

                System.Threading.Interlocked.Increment(ref processed);

                sub.Finish(e.Message.MessageId);
                sub.ResetReadyCount();
            };

            nsq.DisconnectedHandler = (sender, e) =>
            {
                var sub = (sender as NSQSubscriber);
                var main_subscription = sub.Subscriptions.FirstOrDefault();

                lock(_consoleLock) {
                    Console.WriteLine(String.Format("{0}::{2}.{1} Disconnected", sub.Hostname, main_subscription.Channel, main_subscription.Topic));
                }
            };

            nsq.Topics.Add("load_test");

            new Task(() =>
            {
                while (true)
                {
                    var delta = processed - last_processed;
                    var time_delta = DateTime.Now - last_timestamp;
                    var rate = (float)delta / (float)(time_delta.TotalMilliseconds / 1000);

                    if (delta != 0)
                    {
                        lock(_consoleLock) {
                            Console.WriteLine(String.Format("Processed {0} Messages at a rate of {1} m/sec", processed, rate));
                        }
                        last_timestamp = DateTime.Now;
                        last_processed = processed;
                    }

                    Thread.Sleep(500);
                }
            }).Start();

            last_timestamp = DateTime.Now;
            nsq.Listen();
        }
Example #3
0
        static void Main(string[] args)
        {
            var options = new Options();
            var valid   = CommandLine.Parser.Default.ParseArguments(args, options);

            if (!valid)
            {
                System.Environment.Exit(1);
                return;
            }
            Console.WriteLine("NSQnet CLI 1.0");
            var line = new StringBuilder();

            for (int x = 0; x < Console.WindowWidth; x++)
            {
                line.Append("=");
            }
            Console.WriteLine(line.ToString());

            var nsq = new NSQ(options.Hostname, options.Port);

            nsq.MessageHandler = (sender, e) =>
            {
                var sub = sender as NSQSubscriber;

                if (e.Message.Body.Length != 84)
                {
                    throw new Exception("Bad Message!");
                }

                System.Threading.Interlocked.Increment(ref processed);

                sub.Finish(e.Message.MessageId);
                sub.ResetReadyCount();
            };

            nsq.DisconnectedHandler = (sender, e) =>
            {
                var sub = (sender as NSQSubscriber);
                var main_subscription = sub.Subscriptions.FirstOrDefault();

                lock (_consoleLock) {
                    Console.WriteLine(String.Format("{0}::{2}.{1} Disconnected", sub.Hostname, main_subscription.Channel, main_subscription.Topic));
                }
            };

            nsq.Topics.Add("load_test");

            new Task(() =>
            {
                while (true)
                {
                    var delta      = processed - last_processed;
                    var time_delta = DateTime.Now - last_timestamp;
                    var rate       = (float)delta / (float)(time_delta.TotalMilliseconds / 1000);

                    if (delta != 0)
                    {
                        lock (_consoleLock) {
                            Console.WriteLine(String.Format("Processed {0} Messages at a rate of {1} m/sec", processed, rate));
                        }
                        last_timestamp = DateTime.Now;
                        last_processed = processed;
                    }

                    Thread.Sleep(500);
                }
            }).Start();

            last_timestamp = DateTime.Now;
            nsq.Listen();
        }
Example #4
0
        public void UnpackMessage_Test()
        {
            // TODO: requires nsqlookupd/nsqd to be running. consider refactoring for testability.
            // I'd like to test PackMessage and UnpackMessage in NSQProtocol in isolation.

            // Arrange

            const string expectedName     = "ʕ◔ϖ◔ʔ";
            DateTime     expectedHireDate = new DateTime(2006, 1, 2, 15, 4, 5);

            NSQMessageEventArgs nsqMessageEventArgs = null;

            var pub = new NSQPublisher("127.0.0.1", 4150);

            pub.Initialize();

            var sub = new NSQ("127.0.0.1", 4161);

            sub.Topics.Add("unit_test_topic");
            sub.MessageHandler = (s, e) =>
            {
                ((NSQSubscriber)s).Finish(e.Message.MessageId);
                nsqMessageEventArgs = e;
            };

            Thread t = new Thread(sub.Listen);

            t.IsBackground = true;
            t.Start();

            // Act

            var sendTime = DateTime.UtcNow;

            pub.Publish("unit_test_topic", new { Name = expectedName, HireDate = expectedHireDate });

            while (nsqMessageEventArgs == null)
            {
                Task.Delay(50).Wait();

                if (DateTime.UtcNow > sendTime + TimeSpan.FromSeconds(2))
                {
                    Assert.True(false, "Timeout waiting for message");
                }
            }

            t.Abort();

            // Assert

            Assert.NotNull(nsqMessageEventArgs);
            Assert.NotNull(nsqMessageEventArgs.Message);
            Assert.NotNull(nsqMessageEventArgs.Message.Body);
            Assert.NotNull(nsqMessageEventArgs.Message.TimeStamp);

            dynamic body = JsonConvert.DeserializeObject(nsqMessageEventArgs.Message.Body);

            Assert.Equal(expectedName, (string)body.Name);
            Assert.Equal(expectedHireDate, (DateTime)body.HireDate);
            Assert.InRange(nsqMessageEventArgs.Message.TimeStamp.Value, sendTime, sendTime + TimeSpan.FromSeconds(2));
        }