Example #1
0
        public void Does_process_messages_sent_before_it_was_started()
        {
            var reverseCalled = 0;

            using (var mqServer = RabbitMqServerTests.CreateMqServer()) {
                void Action0(IModel channel)
                {
                    channel.PurgeQueue <Reverse>();
                    channel.PurgeQueue <ReverseResponse>();
                }

                RabbitMqConfig.UsingChannel(mqServer.ConnectionFactory, Action0);

                mqServer.RegisterHandler <Reverse>(x => {
                    Interlocked.Increment(ref reverseCalled);
                    return(new ReverseResponse {
                        Value = string.Join(",", x.GetBody().Value.Reverse())
                    });
                });

                using (var mqClient = mqServer.CreateMessageQueueClient()) {
                    RabbitMqServerTests.Publish_4_messages(mqClient);

                    mqServer.Start();

                    Thread.Sleep(2000);
                    Assert.That(mqServer.GetStats().TotalMessagesProcessed, Is.EqualTo(4));
                    Assert.That(reverseCalled, Is.EqualTo(4));
                }
            }
        }
Example #2
0
        public void Does_process_all_messages_and_Starts_Stops_correctly_with_multiple_threads_racing()
        {
            using (var mqServer = RabbitMqServerTests.CreateMqServer()) {
                void Action0(IModel channel)
                {
                    channel.PurgeQueue <Reverse>();
                    channel.PurgeQueue <NothingHere>();
                }

                RabbitMqConfig.UsingChannel(mqServer.ConnectionFactory, Action0);

                var reverseCalled     = 0;
                var nothingHereCalled = 0;

                mqServer.RegisterHandler <Reverse>(x => {
                    Console.WriteLine("Processing Reverse {0}...", Interlocked.Increment(ref reverseCalled));
                    return(new ReverseResponse {
                        Value = string.Join(",", x.GetBody().Value.Reverse())
                    });
                });
                mqServer.RegisterHandler <NothingHere>(x => {
                    Console.WriteLine("Processing NothingHere {0}...", Interlocked.Increment(ref nothingHereCalled));
                    return(new NothingHereResponse {
                        Value = x.GetBody().Value
                    });
                });

                using (var mqClient = mqServer.CreateMessageQueueClient()) {
                    mqClient.Publish(new Reverse {
                        Value = "Hello"
                    });
                    mqClient.Publish(new Reverse {
                        Value = "World"
                    });
                    mqClient.Publish(new NothingHere {
                        Value = "HelloWorld"
                    });

                    mqServer.Start();

                    Thread.Sleep(1500);
                    Assert.That(mqServer.GetStatus(), Is.EqualTo("Started"));
                    Assert.That(mqServer.GetStats().TotalMessagesProcessed, Is.EqualTo(3));

                    mqClient.Publish(new Reverse {
                        Value = "Foo"
                    });
                    mqClient.Publish(new NothingHere {
                        Value = "Bar"
                    });

                    ExecUtils.ExecMultiThreading(10, () => mqServer.Start());
                    Assert.That(mqServer.GetStatus(), Is.EqualTo("Started"));

                    ExecUtils.ExecMultiThreading(5, () => mqServer.Stop());
                    Assert.That(mqServer.GetStatus(), Is.EqualTo("Stopped"));

                    ExecUtils.ExecMultiThreading(10, () => mqServer.Start());
                    Assert.That(mqServer.GetStatus(), Is.EqualTo("Started"));

                    Console.WriteLine("\n" + mqServer.GetStats());

                    Assert.That(mqServer.GetStats().TotalMessagesProcessed, Is.GreaterThanOrEqualTo(5));
                    Assert.That(reverseCalled, Is.EqualTo(3));
                    Assert.That(nothingHereCalled, Is.EqualTo(2));
                }
            }
        }
Example #3
0
        public void Does_retry_messages_with_errors_by_RetryCount()
        {
            var retryCount = 1;
            // in total, inc. first try
            var totalRetries = 1 + retryCount;

            using (var mqServer = RabbitMqServerTests.CreateMqServer(retryCount)) {
                void Action0(IModel channel)
                {
                    channel.PurgeQueue <Reverse>();
                    channel.PurgeQueue <NothingHere>();
                    channel.PurgeQueue <AlwaysThrows>();
                }

                RabbitMqConfig.UsingChannel(mqServer.ConnectionFactory, Action0);

                var reverseCalled     = 0;
                var nothingHereCalled = 0;

                mqServer.RegisterHandler <Reverse>(x => {
                    Interlocked.Increment(ref reverseCalled);
                    return(new ReverseResponse {
                        Value = string.Join(",", x.GetBody().Value.Reverse())
                    });
                });
                mqServer.RegisterHandler <NothingHere>(x => {
                    Interlocked.Increment(ref nothingHereCalled);
                    return(new NothingHereResponse {
                        Value = x.GetBody().Value
                    });
                });
                mqServer.RegisterHandler <AlwaysThrows>(x => throw new Exception("Always Throwing! " + x.GetBody().Value));

                mqServer.Start();

                using (var mqClient = mqServer.CreateMessageQueueClient()) {
                    mqClient.Publish(new AlwaysThrows {
                        Value = "1st"
                    });
                    mqClient.Publish(new Reverse {
                        Value = "Hello"
                    });
                    mqClient.Publish(new Reverse {
                        Value = "World"
                    });
                    mqClient.Publish(new NothingHere {
                        Value = "TheOne"
                    });

                    Thread.Sleep(1000);

                    Assert.That(mqServer.GetStats().TotalMessagesFailed, Is.EqualTo(1 * totalRetries));
                    Assert.That(mqServer.GetStats().TotalMessagesProcessed, Is.EqualTo(2 + 1));

                    for (var i = 0; i < 5; i++)
                    {
                        mqClient.Publish(new AlwaysThrows {
                            Value = "#" + i
                        });
                    }

                    mqClient.Publish(new Reverse {
                        Value = "Hello"
                    });
                    mqClient.Publish(new Reverse {
                        Value = "World"
                    });
                    mqClient.Publish(new NothingHere {
                        Value = "TheOne"
                    });
                }

                Console.WriteLine(mqServer.GetStatsDescription());

                Thread.Sleep(1000);
                Assert.That(mqServer.GetStats().TotalMessagesFailed, Is.EqualTo((1 + 5) * totalRetries));
                Assert.That(mqServer.GetStats().TotalMessagesProcessed, Is.EqualTo(6));

                Assert.That(reverseCalled, Is.EqualTo(2 + 2));
                Assert.That(nothingHereCalled, Is.EqualTo(1 + 1));
            }
        }