Exemple #1
0
        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));
                }
            }
        }
Exemple #2
0
        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));
            }
        }
Exemple #3
0
        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));
                }
            }
        }