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)); }
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(); }
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(); }