public void Does_process_messages_sent_before_it_was_started() { var reverseCalled = 0; using (var mqServer = RabbitMqServerTests.CreateMqServer()) { using (var conn = mqServer.ConnectionFactory.CreateConnection()) using (var channel = conn.CreateModel()) { channel.PurgeQueue <Reverse>(); } mqServer.RegisterHandler <Reverse>(x => { Interlocked.Increment(ref reverseCalled); return(x.GetBody().Value.Reverse()); }); using (var mqClient = mqServer.CreateMessageQueueClient()) { RabbitMqServerTests.Publish_4_messages(mqClient); mqServer.Start(); ExecUtils.RetryOnException(() => { Assert.That(mqServer.GetStats().TotalMessagesProcessed, Is.EqualTo(4)); Assert.That(reverseCalled, Is.EqualTo(4)); Thread.Sleep(100); }, TimeSpan.FromSeconds(5)); } } }
private static void RunHandlerOnMultipleThreads(int noOfThreads, int msgs) { using var mqHost = CreateMqServer(); var timesCalled = 0; mqHost.RegisterHandler <Wait>(m => { Interlocked.Increment(ref timesCalled); Thread.Sleep(m.GetBody().ForMs); return(null); }, noOfThreads); mqHost.Start(); using var mqClient = mqHost.CreateMessageQueueClient(); var dto = new Wait { ForMs = 100 }; msgs.Times(i => mqClient.Publish(dto)); ExecUtils.RetryOnException(() => { Thread.Sleep(300); Assert.That(timesCalled, Is.EqualTo(msgs)); }, TimeSpan.FromSeconds(5)); }
public void Only_allows_1_BgThread_to_run_at_a_time() { using (var mqHost = CreateMqServer()) { mqHost.RegisterHandler <Reverse>(x => x.GetBody().Value.Reverse()); mqHost.RegisterHandler <Rot13>(x => x.GetBody().Value.ToRot13()); 5.Times(x => ThreadPool.QueueUserWorkItem(y => mqHost.Start())); ExecUtils.RetryOnException(() => { Assert.That(mqHost.GetStatus(), Is.EqualTo("Started")); Assert.That(mqHost.BgThreadCount, Is.EqualTo(1)); Thread.Sleep(100); }, TimeSpan.FromSeconds(5)); 10.Times(x => ThreadPool.QueueUserWorkItem(y => mqHost.Stop())); ExecUtils.RetryOnException(() => { Assert.That(mqHost.GetStatus(), Is.EqualTo("Stopped")); Thread.Sleep(100); }, TimeSpan.FromSeconds(5)); ThreadPool.QueueUserWorkItem(y => mqHost.Start()); ExecUtils.RetryOnException(() => { Assert.That(mqHost.GetStatus(), Is.EqualTo("Started")); Assert.That(mqHost.BgThreadCount, Is.EqualTo(2)); Thread.Sleep(100); }, TimeSpan.FromSeconds(5)); //Debug.WriteLine(mqHost.GetStats()); } }
public void Can_receive_and_process_same_reply_responses() { var called = 0; var mqHost = CreateMqServer(); using (var conn = mqHost.ConnectionFactory.CreateConnection()) using (var channel = conn.CreateModel()) { channel.PurgeQueue <Incr>(); } mqHost.RegisterHandler <Incr>(m => { Debug.WriteLine("In Incr #" + m.GetBody().Value); Interlocked.Increment(ref called); return(m.GetBody().Value > 0 ? new Incr { Value = m.GetBody().Value - 1 } : null); }); mqHost.Start(); var mqClient = mqHost.CreateMessageQueueClient(); var incr = new Incr { Value = 5 }; mqClient.Publish(incr); ExecUtils.RetryOnException(() => { Assert.That(called, Is.EqualTo(1 + incr.Value)); Thread.Sleep(100); }, TimeSpan.FromSeconds(5)); }
public static string AssertDirectory(string dirPath, int timeoutMs = 1000) { if (string.IsNullOrEmpty(dirPath)) { return(null); } ExecUtils.RetryOnException(() => { if (!Directory.Exists(dirPath)) { Directory.CreateDirectory(dirPath); } }, TimeSpan.FromMilliseconds(timeoutMs)); return(dirPath); }
public void Can_receive_and_process_standard_request_reply_combo() { using (var mqHost = CreateMqServer()) { using (var conn = mqHost.ConnectionFactory.CreateConnection()) using (var channel = conn.CreateModel()) { channel.PurgeQueue <Hello>(); channel.PurgeQueue <HelloResponse>(); } string messageReceived = null; mqHost.RegisterHandler <Hello>(m => new HelloResponse { Result = "Hello, " + m.GetBody().Name }); mqHost.RegisterHandler <HelloResponse>(m => { messageReceived = m.GetBody().Result; return(null); }); mqHost.Start(); using (var mqClient = mqHost.CreateMessageQueueClient()) { var dto = new Hello { Name = "ServiceStack" }; mqClient.Publish(dto); ExecUtils.RetryOnException(() => { Thread.Sleep(300); Assert.That(messageReceived, Is.EqualTo("Hello, ServiceStack")); }, TimeSpan.FromSeconds(5)); } } }
public void Does_retry_messages_with_errors_by_RetryCount() { var retryCount = 1; var totalRetries = 1 + retryCount; //in total, inc. first try using (var mqHost = RabbitMqServerTests.CreateMqServer(retryCount)) { using (var conn = mqHost.ConnectionFactory.CreateConnection()) using (var channel = conn.CreateModel()) { channel.PurgeQueue <Reverse>(); channel.PurgeQueue <Rot13>(); channel.PurgeQueue <AlwaysThrows>(); } var reverseCalled = 0; var rot13Called = 0; mqHost.RegisterHandler <Reverse>(x => { Interlocked.Increment(ref reverseCalled); return(x.GetBody().Value.Reverse()); }); mqHost.RegisterHandler <Rot13>(x => { Interlocked.Increment(ref rot13Called); return(x.GetBody().Value.ToRot13()); }); mqHost.RegisterHandler <AlwaysThrows>(x => { throw new Exception("Always Throwing! " + x.GetBody().Value); }); mqHost.Start(); using (var mqClient = mqHost.CreateMessageQueueClient()) { mqClient.Publish(new AlwaysThrows { Value = "1st" }); mqClient.Publish(new Reverse { Value = "Hello" }); mqClient.Publish(new Reverse { Value = "World" }); mqClient.Publish(new Rot13 { Value = "ServiceStack" }); ExecUtils.RetryOnException(() => { Assert.That(mqHost.GetStats().TotalMessagesFailed, Is.EqualTo(1 * totalRetries)); Assert.That(mqHost.GetStats().TotalMessagesProcessed, Is.EqualTo(2 + 1)); Thread.Sleep(100); }, TimeSpan.FromSeconds(5)); 5.Times(x => mqClient.Publish(new AlwaysThrows { Value = "#" + x })); mqClient.Publish(new Reverse { Value = "Hello" }); mqClient.Publish(new Reverse { Value = "World" }); mqClient.Publish(new Rot13 { Value = "ServiceStack" }); } //Debug.WriteLine(mqHost.GetStatsDescription()); ExecUtils.RetryOnException(() => { Assert.That(mqHost.GetStats().TotalMessagesFailed, Is.EqualTo((1 + 5) * totalRetries)); Assert.That(mqHost.GetStats().TotalMessagesProcessed, Is.EqualTo(6)); Assert.That(reverseCalled, Is.EqualTo(2 + 2)); Assert.That(rot13Called, Is.EqualTo(1 + 1)); Thread.Sleep(100); }, TimeSpan.FromSeconds(5)); } }
public void Does_process_all_messages_and_Starts_Stops_correctly_with_multiple_threads_racing() { using (var mqHost = RabbitMqServerTests.CreateMqServer()) { using (var conn = mqHost.ConnectionFactory.CreateConnection()) using (var channel = conn.CreateModel()) { channel.PurgeQueue <Reverse>(); channel.PurgeQueue <Rot13>(); } var reverseCalled = 0; var rot13Called = 0; mqHost.RegisterHandler <Reverse>(x => { "Processing Reverse {0}...".Print(Interlocked.Increment(ref reverseCalled)); return(x.GetBody().Value.Reverse()); }); mqHost.RegisterHandler <Rot13>(x => { "Processing Rot13 {0}...".Print(Interlocked.Increment(ref rot13Called)); return(x.GetBody().Value.ToRot13()); }); using (var mqClient = mqHost.CreateMessageQueueClient()) { mqClient.Publish(new Reverse { Value = "Hello" }); mqClient.Publish(new Reverse { Value = "World" }); mqClient.Publish(new Rot13 { Value = "ServiceStack" }); mqHost.Start(); ExecUtils.RetryOnException(() => { Assert.That(mqHost.GetStatus(), Is.EqualTo("Started")); Assert.That(mqHost.GetStats().TotalMessagesProcessed, Is.EqualTo(3)); Thread.Sleep(100); }, TimeSpan.FromSeconds(5)); mqClient.Publish(new Reverse { Value = "Foo" }); mqClient.Publish(new Rot13 { Value = "Bar" }); 10.Times(x => ThreadPool.QueueUserWorkItem(y => mqHost.Start())); Assert.That(mqHost.GetStatus(), Is.EqualTo("Started")); 5.Times(x => ThreadPool.QueueUserWorkItem(y => mqHost.Stop())); ExecUtils.RetryOnException(() => { Assert.That(mqHost.GetStatus(), Is.EqualTo("Stopped")); Thread.Sleep(100); }, TimeSpan.FromSeconds(5)); 10.Times(x => ThreadPool.QueueUserWorkItem(y => mqHost.Start())); ExecUtils.RetryOnException(() => { Assert.That(mqHost.GetStatus(), Is.EqualTo("Started")); Thread.Sleep(100); }, TimeSpan.FromSeconds(5)); Debug.WriteLine("\n" + mqHost.GetStats()); Assert.That(mqHost.GetStats().TotalMessagesProcessed, Is.GreaterThanOrEqualTo(5)); Assert.That(reverseCalled, Is.EqualTo(3)); Assert.That(rot13Called, Is.EqualTo(2)); } } }