示例#1
0
        public void HandlersWorksAsUsual()
        {
            // Arrange
            var handled    = false;
            var resetEvent = new ManualResetEvent(false);

            DeclareQueue(QueueName);

            adapter.Handle <DummyMessage>(req =>
            {
                handled = true;
                resetEvent.Set();
            });

            // Act
            adapter.Bus.Send(new DummyMessage {
                Message = "hello there!"
            });

            if (!resetEvent.WaitOne(3.Seconds()))
            {
                Assert.Fail("Did not receive message within 3 seconds of waiting!");
            }

            // Assert
            Assert.IsTrue(handled);
        }
        public void WorksWhenMovingToErrorQueue()
        {
            using (var messageQueue = new MsmqMessageQueue("error"))
            {
                // make sure error queue is empty
                messageQueue.PurgeInputQueue();

                adapter.Handle <Request>(req =>
                {
                    throw new ApplicationException("oh crap");
                });

                var request = new Request();
                bus.AttachHeader(request, Headers.CorrelationId, "super-unique!!!!111");
                bus.SendLocal(request);

                // let it fail
                Thread.Sleep(2.Seconds());

                var receivedTransportMessage = messageQueue.ReceiveMessage(new NoTransaction());
                receivedTransportMessage.ShouldNotBe(null);

                var serializer = new JsonMessageSerializer();
                var message    = serializer.Deserialize(receivedTransportMessage);

                message.Headers.ShouldContainKeyAndValue(Headers.CorrelationId, "super-unique!!!!111");
            }
        }
        public void ItHasBeenFixed()
        {
            using (var adapter = new BuiltinContainerAdapter())
            {
                adapter.Handle<string>(s =>
                    {
                        throw new ApplicationException("Will trigger that the message gets moved to the error queue");
                    });

                Configure.With(adapter)
                         .Transport(t => t.UseRabbitMq(ConnectionString, "test.input", "test.error")
                                          .UseExchange("AlternativeExchange"))
                         .CreateBus()
                         .Start();

                adapter.Bus.SendLocal("hello there!!!");

                // wait until we're sure
                Thread.Sleep(2.Seconds());

                using (var errorQueue = new RabbitMqMessageQueue(ConnectionString, "test.error"))
                {
                    var serializer = new JsonMessageSerializer();
                    var receivedTransportMessage = errorQueue.ReceiveMessage(new NoTransaction());
                    receivedTransportMessage.ShouldNotBe(null);

                    var errorMessage = serializer.Deserialize(receivedTransportMessage);
                    errorMessage.Messages.Length.ShouldBe(1);
                    errorMessage.Messages[0].ShouldBeTypeOf<string>();
                    ((string)errorMessage.Messages[0]).ShouldBe("hello there!!!");
                }
            }
        }
示例#4
0
        public void DoesNotLeakChannels()
        {
            // let MSMQ bus "bridge" between MSMQ and Rabbit by publishing all received strings
            var receivedMessages = 0;
            var resetEvent       = new ManualResetEvent(false);

            msmqBus.Handle <string>(str =>
            {
                rabbitBus.Bus.Publish(str);

                receivedMessages++;

                if (receivedMessages == 100)
                {
                    resetEvent.Set();
                }
            });

            var counter = 1;

            100.Times(() => msmqBus.Bus.SendLocal(string.Format("This is message {0}", counter++)));

            var timeout = 20.Seconds();

            Assert.That(resetEvent.WaitOne(timeout), Is.Not.False, "Did not receive all the messages withing {0} timeout");

            Thread.Sleep(30.Seconds());
        }
示例#5
0
        static void Main()
        {
            using (var adapter = new BuiltinContainerAdapter())
            {
                adapter.Handle<string>(reply => Console.WriteLine("Got reply: {0}" + Environment.NewLine, reply));

                Configure.With(adapter)
                         .Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
                         .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
                         .MessageOwnership(o => o.FromRebusConfigurationSection())
                         .CreateBus()
                         .Start();

                var bus = adapter.Bus;

                Console.WriteLine("Type a greeting + ENTER to send to server" + Environment.NewLine);

                while (true)
                {
                    var text = Console.ReadLine();

                    if (string.IsNullOrWhiteSpace(text)) break;

                    var greeting = new SensitiveMessage(text);

                    bus.Send(greeting);
                }
            }
        }
        public void RunTest(bool useLowLatencyBackoffStrategy, int iterations)
        {
            var adapter = new BuiltinContainerAdapter();
            var messageHasBeenReceived = new ManualResetEvent(false);
            adapter.Handle<string>(s => messageHasBeenReceived.Set());

            ConfigureBus(adapter, useLowLatencyBackoffStrategy);

            var bus = adapter.Bus;

            var recordedLatencies = new List<TimeSpan>();

            iterations.Times(() =>
            {
                // let things calm down
                Console.Write("Calming down.... ");
                Thread.Sleep(30.Seconds());

                Console.Write("Sending! ");
                var sendTime = DateTime.UtcNow;
                bus.SendLocal("w0000tamafooook!!1");

                Console.Write("waiting... ");
                messageHasBeenReceived.WaitUntilSetOrDie(20.Seconds());

                var elapsedUntilNow = sendTime.ElapsedUntilNow();
                Console.WriteLine("got the message - recorded latency of {0}", elapsedUntilNow);
                recordedLatencies.Add(elapsedUntilNow);
                messageHasBeenReceived.Reset();
            });

            Console.WriteLine("AVERAGE RECORDED LATENCY: {0:0.00} s", recordedLatencies.Average(t => t.TotalSeconds));
        }
        public void RunTest(bool useLowLatencyBackoffStrategy, int iterations)
        {
            var adapter = new BuiltinContainerAdapter();
            var messageHasBeenReceived = new ManualResetEvent(false);

            adapter.Handle <string>(s => messageHasBeenReceived.Set());

            ConfigureBus(adapter, useLowLatencyBackoffStrategy);

            var bus = adapter.Bus;

            var recordedLatencies = new List <TimeSpan>();

            iterations.Times(() =>
            {
                // let things calm down
                Console.Write("Calming down.... ");
                Thread.Sleep(30.Seconds());

                Console.Write("Sending! ");
                var sendTime = DateTime.UtcNow;
                bus.SendLocal("w0000tamafooook!!1");

                Console.Write("waiting... ");
                messageHasBeenReceived.WaitUntilSetOrDie(20.Seconds());

                var elapsedUntilNow = sendTime.ElapsedUntilNow();
                Console.WriteLine("got the message - recorded latency of {0}", elapsedUntilNow);
                recordedLatencies.Add(elapsedUntilNow);
                messageHasBeenReceived.Reset();
            });

            Console.WriteLine("AVERAGE RECORDED LATENCY: {0:0.00} s", recordedLatencies.Average(t => t.TotalSeconds));
        }
示例#8
0
        public void CanBeConfiguredToHandleMessagesInsideTransactionScope()
        {
            using (var adapter = new BuiltinContainerAdapter())
            {
                var resetEvent = new ManualResetEvent(false);
                var transactionScopeDetected = false;

                adapter.Handle <string>(str =>
                {
                    transactionScopeDetected = Transaction.Current != null;
                    resetEvent.Set();
                });

                Configure.With(adapter)
                .Transport(t => t.UseMsmq(InputQueueName, ErrorQueueName))
                .Behavior(b => b.HandleMessagesInsideTransactionScope())
                .CreateBus()
                .Start();

                adapter.Bus.SendLocal("bla bla whatever");

                if (!resetEvent.WaitOne(2.Seconds()))
                {
                    Assert.Fail("Did not receive the message withing 2 second timeout!!");
                }

                transactionScopeDetected.ShouldBe(true);
            }
        }
        public void CanSendAndReceiveMessageWithThisManyKiloBytesOfOPayload(int sizeInKiloBytes)
        {
            // arrange
            var resetEvent = new ManualResetEvent(false);

            adapter.Handle <byte[]>(b => resetEvent.Set());

            var sizeInBytes = sizeInKiloBytes * 1024;
            var byteArray   = Enumerable.Repeat((byte)'*', sizeInBytes).ToArray();

            Console.WriteLine("Publishing byte[] with Length={0}", byteArray.Length);

            // act
            var stopwatch = Stopwatch.StartNew();

            bus.Publish(byteArray);

            Console.WriteLine("Publishing took {0:0.0} s", stopwatch.Elapsed.TotalSeconds);

            var timeout = 2.Seconds() + TimeSpan.FromMilliseconds(byteArray.Length / 10);

            if (!resetEvent.WaitOne(timeout))
            {
                Assert.Fail("Did not receive {0} bytes of messaging goodness within {1} timeout",
                            sizeInBytes, timeout);
            }

            // assert
        }
        public void ItWorks()
        {
            using (AppConfig.Change(AppConfigPath))
            using (var adapter = new BuiltinContainerAdapter())
            {
                var messageHandled = new ManualResetEvent(false);

                adapter.Handle<string>(s => messageHandled.Set());

                var bus = Configure.With(adapter)
                    .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
                    .CreateBus()
                    .Start();

                bus.SendLocal("hello there!");

                messageHandled.WaitUntilSetOrDie(5.Seconds());
            }

            var auditedMessages = MsmqTestHelper
                .GetMessagesFrom(AuditQueue)
                .ToList();

            Assert.That(auditedMessages.Count, Is.EqualTo(1), "Expected to find exactly one copy of the sent message in the audit queue");
            Assert.That(auditedMessages.Single().Messages[0], Is.EqualTo("hello there!"));
        }
示例#11
0
        IBus PullOneOutOfTheHat(string inputQueueName, Action <int> handler = null, bool oneExchangePerType = false, string inputExchange = null)
        {
            var adapter = new BuiltinContainerAdapter();

            if (handler != null)
            {
                adapter.Handle <SomeEvent>(e => handler(e.Number));
            }

            Configure.With(adapter)
            .Transport(t => {
                var obj = t.UseRabbitMq(ConnectionString, inputQueueName, "error").ManageSubscriptions();
                if (oneExchangePerType)
                {
                    obj.UseOneExchangePerMessageTypeRouting();
                }
                if (inputExchange != null)
                {
                    obj.UseExchangeAsInputAddress(inputExchange);
                }
            })
            .CreateBus().Start();

            TrackDisposable(adapter);

            return(adapter.Bus);
        }
示例#12
0
        public void CanCopySuccessfullyHandledMessageToAuditQueue()
        {
            // arrange
            var fakeTime = DateTime.UtcNow;
            TimeMachine.FixTo(fakeTime);
            var resetEvent = new ManualResetEvent(false);
            adapter.Handle<string>(str => resetEvent.Set());

            // act
            adapter.Bus.SendLocal("yo!");

            // assert
            var message = GetMessageFromAuditQueue();

            message.ShouldNotBe(null);

            var logicalMessages = message.Messages;
            var headers = message.Headers;

            logicalMessages.Length.ShouldBe(1);
            logicalMessages[0].ShouldBe("yo!");

            headers.ShouldContainKeyAndValue(Headers.AuditReason, Headers.AuditReasons.Handled);
            headers.ShouldContainKeyAndValue(Headers.AuditMessageCopyTime, fakeTime.ToString("u"));
            headers.ShouldContainKeyAndValue(Headers.AuditSourceQueue, InputQueueAddress);
        }
        public void DoesNotUseTransactionScopeByDefault()
        {
            using (var adapter = new BuiltinContainerAdapter())
            {
                var resetEvent = new ManualResetEvent(false);
                var transactionScopeDetected = false;

                adapter.Handle<string>(str =>
                    {
                        transactionScopeDetected = Transaction.Current != null;
                        resetEvent.Set();
                    });

                Configure.With(adapter)
                         .Transport(t => t.UseMsmq(InputQueueName, ErrorQueueName))
                         .CreateBus()
                         .Start();

                adapter.Bus.SendLocal("bla bla whatever");

                if (!resetEvent.WaitOne(2.Seconds()))
                {
                    Assert.Fail("Did not receive the message withing 2 second timeout!!");
                }

                transactionScopeDetected.ShouldBe(false);
            }
        }
示例#14
0
        static void Main()
        {
            using (var adapter = new BuiltinContainerAdapter())
            {
                adapter.Handle<Reply>(reply => Console.WriteLine("Got reply '{0}' (from OS process {1})", reply.KeyChar, reply.OsProcessId));

                Configure.With(adapter)
                    .Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
                    .Transport(t => t.UseSqlServer("server=.; database=rebus; trusted_connection=true", "producer.input", "error").EnsureTableIsCreated())
                    .MessageOwnership(o => o.FromRebusConfigurationSection())
                    .CreateBus()
                    .Start();

                Console.WriteLine("Press Q to quit or any other key to produce a job");
                while (true)
                {
                    var keyChar = char.ToLower(Console.ReadKey(true).KeyChar);

                    switch (keyChar)
                    {
                        case 'q':
                            goto quit;

                        default:
                            adapter.Bus.Send(new Job(keyChar));
                            break;
                    }
                }

            quit:
                Console.WriteLine("Quitting...");
            }
        }
        public void YeahItDoes()
        {
            var deliveryAttempts = 0;

            adapter.Handle <string>(str =>
            {
                Interlocked.Increment(ref deliveryAttempts);
                throw new ApplicationException(RecognizableErrorMessage);
            });

            adapter.Bus.SendLocal("HELLO MY FRIEND!!!!!2222");

            var timeout = 5.Seconds();

            Assert.That(resetEvent.WaitOne(timeout), Is.True, "Did not receive PoisonMessage event within {0} timeout", timeout);
            Assert.That(deliveryAttempts, Is.EqualTo(5), "Expected 5 failed delivery attempts to have been made");

            // be sure that message has moved and everything
            Thread.Sleep(1.Seconds());

            using (var errorQueueClient = new AzureServiceBusMessageQueue(ConnectionString, ErrorQueueName))
            {
                var receivedTransportMessage = errorQueueClient.ReceiveMessage(new NoTransaction());

                Assert.That(receivedTransportMessage, Is.Not.Null);
            }
        }
        public void ItHasBeenFixed()
        {
            using (var adapter = new BuiltinContainerAdapter())
            {
                adapter.Handle <string>(s =>
                {
                    throw new ApplicationException("Will trigger that the message gets moved to the error queue");
                });

                Configure.With(adapter)
                .Transport(t => t.UseRabbitMq(ConnectionString, "test.input", "test.error")
                           .UseExchange("AlternativeExchange"))
                .CreateBus()
                .Start();

                adapter.Bus.SendLocal("hello there!!!");

                // wait until we're sure
                Thread.Sleep(2.Seconds());

                using (var errorQueue = new RabbitMqMessageQueue(ConnectionString, "test.error"))
                {
                    var serializer = new JsonMessageSerializer();
                    var receivedTransportMessage = errorQueue.ReceiveMessage(new NoTransaction());
                    receivedTransportMessage.ShouldNotBe(null);

                    var errorMessage = serializer.Deserialize(receivedTransportMessage);
                    errorMessage.Messages.Length.ShouldBe(1);
                    errorMessage.Messages[0].ShouldBeOfType <string>();
                    ((string)errorMessage.Messages[0]).ShouldBe("hello there!!!");
                }
            }
        }
示例#17
0
        public void ItWorks()
        {
            using (AppConfig.Change(AppConfigPath))
                using (var adapter = new BuiltinContainerAdapter())
                {
                    var messageHandled = new ManualResetEvent(false);

                    adapter.Handle <string>(s => messageHandled.Set());

                    var bus = Configure.With(adapter)
                              .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
                              .CreateBus()
                              .Start();

                    bus.SendLocal("hello there!");

                    messageHandled.WaitUntilSetOrDie(5.Seconds());
                }

            var auditedMessages = MsmqTestHelper
                                  .GetMessagesFrom(AuditQueue)
                                  .ToList();

            Assert.That(auditedMessages.Count, Is.EqualTo(1), "Expected to find exactly one copy of the sent message in the audit queue");
            Assert.That(auditedMessages.Single().Messages[0], Is.EqualTo("hello there!"));
        }
示例#18
0
        static void Main()
        {
            using (var adapter = new BuiltinContainerAdapter())
            {
                adapter.Handle <string>(reply => Console.WriteLine("Got reply: {0}" + Environment.NewLine, reply));

                Configure.With(adapter)
                .Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
                .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
                .MessageOwnership(o => o.FromRebusConfigurationSection())
                .CreateBus()
                .Start();

                var bus = adapter.Bus;

                Console.WriteLine("Type a greeting + ENTER to send to server" + Environment.NewLine);
                while (true)
                {
                    var text = Console.ReadLine();

                    if (string.IsNullOrWhiteSpace(text))
                    {
                        break;
                    }

                    var greeting = new GreetingMessage(text);

                    bus.Send(greeting);
                }
            }
        }
示例#19
0
        public void CanConfigureNumberOfRetriesForExceptionTypes()
        {
            using (var adapter = new BuiltinContainerAdapter())
                using (var errorQueue = GetMessageQueue(ErrorQueueName))
                {
                    errorQueue.Purge();

                    using (var inputQueue = GetMessageQueue(TestCustomRetryCountInput))
                    {
                        inputQueue.Purge();
                    }

                    var bimCount      = 0;
                    var bomCount      = 0;
                    var bommelomCount = 0;

                    adapter.Handle <string>(str =>
                    {
                        if (str == "bim")
                        {
                            bimCount++;
                            throw new InvalidOperationException("bim!");
                        }

                        if (str == "bom")
                        {
                            bomCount++;
                            throw new ArgumentException("bom!");
                        }

                        bommelomCount++;
                        throw new ExpectationViolationException("bommelom!");
                    });

                    var bus = (RebusBus)
                              Configure.With(adapter)
                              .Logging(l => l.None())
                              .Transport(t => t.UseMsmq(TestCustomRetryCountInput, ErrorQueueName))
                              .Behavior(b => b.SetMaxRetriesFor <InvalidOperationException>(9)
                                        .SetMaxRetriesFor <ArgumentException>(7))
                              .CreateBus();

                    bus.Start(1);

                    adapter.Bus.SendLocal("bim");
                    adapter.Bus.SendLocal("bom");
                    adapter.Bus.SendLocal("bommelom");

                    // dequeue three messages
                    var first  = errorQueue.Receive(TimeSpan.FromSeconds(10));
                    var second = errorQueue.Receive(TimeSpan.FromSeconds(1));
                    var third  = errorQueue.Receive(TimeSpan.FromSeconds(1));

                    bimCount.ShouldBe(9);
                    bomCount.ShouldBe(7);
                    bommelomCount.ShouldBe(5); //< default
                }
        }
示例#20
0
        public void CanConfigureNumberOfRetriesForExceptionTypes()
        {
            using (var adapter = new BuiltinContainerAdapter())
            using (var errorQueue = GetMessageQueue(ErrorQueueName))
            {
                errorQueue.Purge();

                using (var inputQueue = GetMessageQueue(TestCustomRetryCountInput))
                {
                    inputQueue.Purge();
                }

                var bimCount = 0;
                var bomCount = 0;
                var bommelomCount = 0;

                adapter.Handle<string>(str =>
                    {
                        if (str == "bim")
                        {
                            bimCount++;
                            throw new InvalidOperationException("bim!");
                        }

                        if (str == "bom")
                        {
                            bomCount++;
                            throw new ArgumentException("bom!");
                        }

                        bommelomCount++;
                        throw new ExpectationViolationException("bommelom!");
                    });

                var bus = (RebusBus)
                          Configure.With(adapter)
                                   .Logging(l => l.None())
                                   .Transport(t => t.UseMsmq(TestCustomRetryCountInput, ErrorQueueName))
                                   .Behavior(b => b.SetMaxRetriesFor<InvalidOperationException>(9)
                                                   .SetMaxRetriesFor<ArgumentException>(7))
                                   .CreateBus();

                bus.Start(1);

                adapter.Bus.SendLocal("bim");
                adapter.Bus.SendLocal("bom");
                adapter.Bus.SendLocal("bommelom");

                // dequeue three messages
                var first = errorQueue.Receive(TimeSpan.FromSeconds(10));
                var second = errorQueue.Receive(TimeSpan.FromSeconds(1));
                var third = errorQueue.Receive(TimeSpan.FromSeconds(1));

                bimCount.ShouldBe(9);
                bomCount.ShouldBe(7);
                bommelomCount.ShouldBe(5); //< default
            }
        }
示例#21
0
        public void DoesNotReceiveTheSameMessageTwice()
        {
            var counts = new ConcurrentDictionary <string, int>();

            bus1.Handle <string>(str =>
            {
                counts.AddOrUpdate(str, key => 1, (key, value) => value + 1);
                Thread.Sleep(100);
            });

            const string message = "bam!!";

            bus1.Bus.SendLocal(message);

            Thread.Sleep(2.Seconds());

            counts.ShouldContainKeyAndValue(message, 1);
        }
示例#22
0
        public void AzureServiceBusIsJustEmulatingItsThingByActuallyUsingMsmqUnderneath()
        {
            var resetEvent = new ManualResetEvent(false);

            azureAdapter.Handle <string>(message => msmqAdapter.Bus.Reply(string.Format("I got your message: {0}", message)));
            msmqAdapter.Handle <string>(reply =>
            {
                if (reply == "I got your message: H3LL0!!")
                {
                    resetEvent.Set();
                }
            });

            msmqAdapter.Bus.Advanced.Routing.Send(AzureReceiverInputQueueName, "H3LL0!!");

            var timeout = 2.Seconds();

            Assert.That(resetEvent.WaitOne(timeout), Is.True, "Did not receive reply within {0} timeout", timeout);
        }
示例#23
0
        public void BasicThingWorks()
        {
            adapter.Handle <SomeRequest>(req => bus.Reply(new SomeReply {
                Message = "Thank you sir!"
            }));

            var resetEvent = new ManualResetEvent(false);

            adapter.Bus.Send(new SomeRequest {
                Message = "hello there!"
            },
                             (SomeReply reply) =>
            {
                Console.WriteLine("Got reply in callback: {0} - YAY!", reply.Message);
                resetEvent.Set();
            });

            if (!resetEvent.WaitOne(2.Seconds()))
            {
                Assert.Fail("Did not receive reply within 2 seconds of waiting!");
            }
        }
示例#24
0
        void StartWorkerBus(string queueName, ConcurrentQueue <WorkDone> workDone)
        {
            var adapter = new BuiltinContainerAdapter();

            adapter.Handle <Work>(w => workDone.Enqueue(new WorkDone
            {
                MessageId       = w.MessageId,
                WorkerQueueName = queueName
            }));

            Configure.With(TrackDisposable(adapter))
            .Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
            .Transport(t => t.UseMsmq(queueName, "error"))
            .CreateBus()
            .Start();
        }
示例#25
0
        static void Main(string[] args)
        {
            // we have the container in a variable, but you would probably stash it in a static field somewhere
            using (var adapter = new BuiltinContainerAdapter())
            {
                Configure.With(adapter)
                .Logging(t => t.None())
                .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
                .MessageOwnership(d => d.FromRebusConfigurationSection())
                .CreateBus().Start();

                adapter.Handle <DateTime>(currentDateTime => Console.WriteLine("The time is {0}", currentDateTime));

                Console.WriteLine("Press enter to quit");
                Console.ReadLine();
            } //< always dispose bus when your app quits - here done via the container adapter
        }
        IBus PullOneOutOfTheHat(string inputQueueName, Action <int> handler = null)
        {
            var adapter = new BuiltinContainerAdapter();

            if (handler != null)
            {
                adapter.Handle <SomeEvent>(e => handler(e.Number));
            }

            Configure.With(adapter)
            .Transport(t => t.UseRabbitMq(ConnectionString, inputQueueName, "error").ManageSubscriptions())
            .CreateBus().Start();

            TrackDisposable(adapter);

            return(adapter.Bus);
        }
示例#27
0
        public void YesItWorks()
        {
            var resetEvent = new ManualResetEvent(false);

            recipientAdapter.Handle <string>(str =>
            {
                if (str == "hullo!")
                {
                    resetEvent.Set();
                }
            });

            senderAdapter.Bus.Advanced.Routing.Send(RecipientInputQueueName, "hullo!");

            var timeout = 5.Seconds();

            Assert.That(resetEvent.WaitOne(timeout), Is.True,
                        "Does not look like we received the message withing {0} timeout", timeout);
        }
        public void SeeIfItWorks(int workers, int iterations)
        {
            var receivedStrings = new List <string>();

            using (var adapter1 = new BuiltinContainerAdapter())
                using (var adapter2 = new BuiltinContainerAdapter())
                {
                    adapter1.Handle <ThisIsJustSomeRandomTestMessage>(msg => receivedStrings.Add(msg.WithSomethingInside));

                    var bus1 =
                        (RebusBus)Configure.With(adapter1)
                        .Transport(x => x.UseRabbitMq(ConnectionString, InputQueueName1, ErrorQueueName)
                                   .ManageSubscriptions())
                        .CreateBus();

                    bus1.Start(workers);
                    bus1.Subscribe <ThisIsJustSomeRandomTestMessage>();

                    var bus2 =
                        (RebusBus)Configure.With(adapter2)
                        .Transport(x => x.UseRabbitMq(ConnectionString, InputQueueName2, ErrorQueueName)
                                   .ManageSubscriptions())
                        .CreateBus();

                    bus2.Start(1);

                    var messageCounter = 1;
                    iterations.Times(() =>
                    {
                        Thread.Sleep(TimeSpan.FromSeconds(2));

                        bus2.Publish(new ThisIsJustSomeRandomTestMessage {
                            WithSomethingInside = string.Format("Message number {0}", messageCounter++)
                        });
                    });

                    Thread.Sleep(TimeSpan.FromSeconds(5));
                }

            receivedStrings.ShouldBe(Enumerable.Range(1, iterations)
                                     .Select(i => string.Format("Message number {0}", i))
                                     .ToList());
        }
示例#29
0
        static void Main()
        {
            using (var adapter = new BuiltinContainerAdapter())
            {
                adapter.Handle<Job>(job =>
                {
                    adapter.Bus.Reply(new Reply(job.KeyChar, Process.GetCurrentProcess().Id));
                });

                Configure.With(adapter)
                    .Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
                    .Transport(t => t.UseSqlServer("server=.; database=rebus; trusted_connection=true", "consumer.input", "error").EnsureTableIsCreated())
                    .CreateBus()
                    .Start();

                Console.WriteLine("Press ENTER to quit");
                Console.ReadLine();
            }
        }
示例#30
0
        static void Main()
        {
            using (var adapter = new BuiltinContainerAdapter())
            {
                adapter.Handle <Job>(job =>
                {
                    Console.WriteLine("Processing job {0}", job.JobNumber);
                    Thread.Sleep(200);
                });

                Configure.With(adapter)
                .Logging(l => l.ColoredConsole(LogLevel.Warn))
                .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
                .CreateBus()
                .Start();

                Console.WriteLine("Consumer 1 listening - press ENTER to quit");
                Console.ReadLine();
            }
        }
示例#31
0
        static void Main()
        {
            using (var adapter = new BuiltinContainerAdapter())
            {
                adapter.Handle<Job>(job =>
                {
                    Console.WriteLine("Processing job {0}", job.JobNumber);
                    Thread.Sleep(200);
                });

                Configure.With(adapter)
                    .Logging(l => l.ColoredConsole(LogLevel.Warn))
                    .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
                    .CreateBus()
                    .Start();

                Console.WriteLine("Consumer 1 listening - press ENTER to quit");
                Console.ReadLine();
            }
        }
        public void SeeIfItWorks(int workers, int iterations)
        {
            var receivedStrings = new List<string>();

            using (var adapter1 = new BuiltinContainerAdapter())
            using (var adapter2 = new BuiltinContainerAdapter())
            {
                adapter1.Handle<ThisIsJustSomeRandomTestMessage>(msg => receivedStrings.Add(msg.WithSomethingInside));

                var bus1 =
                    (RebusBus) Configure.With(adapter1)
                                        .Transport(x => x.UseRabbitMq(ConnectionString, InputQueueName1, ErrorQueueName)
                                                         .ManageSubscriptions())
                                        .CreateBus();

                bus1.Start(workers);
                bus1.Subscribe<ThisIsJustSomeRandomTestMessage>();

                var bus2 =
                    (RebusBus) Configure.With(adapter2)
                                        .Transport(x => x.UseRabbitMq(ConnectionString, InputQueueName2, ErrorQueueName)
                                                         .ManageSubscriptions())
                                        .CreateBus();

                bus2.Start(1);

                var messageCounter = 1;
                iterations.Times(() =>
                    {
                        Thread.Sleep(TimeSpan.FromSeconds(2));

                        bus2.Publish(new ThisIsJustSomeRandomTestMessage{WithSomethingInside=string.Format("Message number {0}", messageCounter++)});
                    });

                Thread.Sleep(TimeSpan.FromSeconds(5));
            }

            receivedStrings.ShouldBe(Enumerable.Range(1, iterations)
                                               .Select(i => string.Format("Message number {0}", i))
                                               .ToList());
        }
示例#33
0
        static void Main()
        {
            using (var adapter = new BuiltinContainerAdapter())
            {
                adapter.Handle<Job>(job =>
                {
                    Console.WriteLine("Processing job {0}", job.JobNumber);
                    Thread.Sleep(200);
                });

                Configure.With(adapter)
                    .Logging(l => l.ColoredConsole(LogLevel.Warn))
                    .Transport(t => t.UseSqlServer("server=.;initial catalog=rebus_test;integrated security=true", "consumer", "error")
                                     .EnsureTableIsCreated())
                    .CreateBus()
                    .Start(20);

                Console.WriteLine("Consumer listening - press ENTER to quit");
                Console.ReadLine();
            }
        }
示例#34
0
        IBus Create(string inputQueueName, Action <SomeEvent> eventHandler = null)
        {
            RabbitMqFixtureBase.DeleteQueue(inputQueueName);

            var adapter = new BuiltinContainerAdapter();

            if (eventHandler != null)
            {
                adapter.Handle(eventHandler);
            }

            Configure.With(adapter)
            .Transport(t => t.UseRabbitMq(RabbitMqFixtureBase.ConnectionString,
                                          inputQueueName,
                                          "test.resilience.error")
                       .ManageSubscriptions())
            .CreateBus()
            .Start();

            TrackDisposable(adapter);

            return(adapter.Bus);
        }
示例#35
0
        static void Main()
        {
            using (var adapter = new BuiltinContainerAdapter())
            {
                adapter.Handle<Job>(job =>
                {
                    Console.WriteLine("Processing job {0}", job.JobNumber);
                    Thread.Sleep(200);
                });

                Configure.With(adapter)
                    .Logging(l => l.ColoredConsole(LogLevel.Warn))
                    .Transport(t => t.UseRabbitMq("amqp://localhost", "consumer", "error")
                        .ManageSubscriptions()
                        .SetPrefetchCount(65535))
                    .CreateBus()
                    .Start(20);

                adapter.Bus.Subscribe<Job>();

                Console.WriteLine("Consumer listening - press ENTER to quit");
                Console.ReadLine();
            }
        }
        public void StatementOfSomethingThatMustHold(int numberOfWorkers)
        {
            var resetEvent = new ManualResetEvent(false);

            adapter.Handle <string>(str =>
            {
                if (str == "w00t!")
                {
                    resetEvent.Set();
                }
            });


            var bus = startableBus.Start(numberOfWorkers);

            Thread.Sleep(0.5.Seconds());
            bus.Subscribe <string>();


            bus.Publish("w00t!");
            var timeout = 3.Seconds();

            Assert.That(resetEvent.WaitOne(timeout), Is.True, "Did not receive expected event within {0} timeout", timeout);
        }
示例#37
0
        IBus PullOneOutOfTheHat(string inputQueueName, Action<int> handler = null, bool oneExchangePerType = false, string inputExchange = null)
        {
            var adapter = new BuiltinContainerAdapter();

            if (handler != null) adapter.Handle<SomeEvent>(e => handler(e.Number));

            Configure.With(adapter)
                .Transport(t => {
                    var obj = t.UseRabbitMq(ConnectionString, inputQueueName, "error").ManageSubscriptions();
                    if (oneExchangePerType) obj.UseOneExchangePerMessageTypeRouting();
                    if (inputExchange != null) obj.UseExchangeAsInputAddress(inputExchange);
                })
                .CreateBus().Start();

            TrackDisposable(adapter);

            return adapter.Bus;
        }
示例#38
0
        IBus Create(string inputQueueName, Action<SomeEvent> eventHandler = null)
        {
            RabbitMqFixtureBase.DeleteQueue(inputQueueName);

            var adapter = new BuiltinContainerAdapter();
            if (eventHandler != null) adapter.Handle(eventHandler);

            Configure.With(adapter)
                .Transport(t => t.UseRabbitMq(RabbitMqFixtureBase.ConnectionString,
                                              inputQueueName,
                                              "test.resilience.error")
                                    .ManageSubscriptions())
                .CreateBus()
                .Start();

            disposables.Add(adapter);

            return adapter.Bus;
        }
        public void CanSendAndReceiveManyMessagesReliably(int numberOfMessages)
        {
            using (var statusTimer = new Timer())
            {
                var messages = Enumerable.Range(1, numberOfMessages)
                               .Select(n => new SomeNumberedMessage
                {
                    Id   = Guid.NewGuid(),
                    Text = string.Format("Message # {0}", n)
                })
                               .ToList();

                var receivedMessages = new ConcurrentList <SomeNumberedMessage>();
                var resetEvent       = new ManualResetEvent(false);
                var sentMessageIds   = new ConcurrentList <Guid>();

                statusTimer.Elapsed += (sender, args) => Console.WriteLine("Sent {0} messages, received {1} messages",
                                                                           sentMessageIds.Count, receivedMessages.Count);
                statusTimer.Interval = 2000;
                statusTimer.Start();

                adapter2.Handle <SomeNumberedMessage>(msg =>
                {
                    receivedMessages.Add(msg);

                    if (receivedMessages.Count >= numberOfMessages)
                    {
                        Console.WriteLine("Setting the reset event!");
                        resetEvent.Set();
                    }
                });

                var rebusRouting = adapter1.Bus.Advanced.Routing;
                var stopwatch    = Stopwatch.StartNew();

                // send first half as batch
                var batchSize = messages.Count / 2;

                var firstBatch = messages.Take(batchSize)
                                 .ToList();

                var theRest = messages.Skip(batchSize)
                              .ToList();

                Console.WriteLine("Sending the first {0} messages in batches", firstBatch.Count);

                foreach (var msgBatch in firstBatch.Partition(100))
                {
                    Console.WriteLine("Sending batch of {0} messages", msgBatch.Count);

                    var complete = false;
                    var attempts = 0;

                    do
                    {
                        try
                        {
                            using (var scope = new TransactionScope())
                            {
                                foreach (var msg in msgBatch)
                                {
                                    rebusRouting.Send(QueueName2, msg);

                                    sentMessageIds.Add(msg.Id);
                                }

                                scope.Complete();
                            }

                            complete = true;
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("An error occurred while sending batch of {0} msgs: {1}",
                                              msgBatch.Count, e);

                            attempts++;

                            if (attempts >= 5)
                            {
                                throw;
                            }

                            Thread.Sleep(1.Seconds());
                        }
                    } while (!complete);
                }

                Console.WriteLine("Sending the next {0} messages one at a time", theRest.Count);

                foreach (var msg in theRest)
                {
                    var attempts = 0;
                    var complete = false;

                    do
                    {
                        try
                        {
                            rebusRouting.Send(QueueName2, msg);
                            sentMessageIds.Add(msg.Id);
                            complete = true;
                        }
                        catch (Exception e)
                        {
                            Console.WriteLine("An error occurred while attempting to send single message: {0}", e);

                            attempts++;

                            if (attempts >= 5)
                            {
                                throw;
                            }

                            Thread.Sleep(1.Seconds());
                        }
                    } while (!complete);
                }

                var totalSeconds = stopwatch.Elapsed.TotalSeconds;
                Console.WriteLine("Sending {0} messages took {1:0.0} s - that's {2:0} msg/s",
                                  numberOfMessages, totalSeconds, numberOfMessages / totalSeconds);

                var timeout = TimeSpan.FromSeconds(15 + numberOfMessages / 10.0);
                Console.WriteLine("Waiting with {0} timeout", timeout);

                if (!resetEvent.WaitOne(timeout))
                {
                    Assert.Fail(@"Did not receive all {0} messages within {1} timeout

{2}",
                                numberOfMessages, timeout, FormatReport(sentMessageIds, receivedMessages));
                }

                Console.WriteLine("Waiting some extra time for possible duplicates to arrive");

                // wait and see if we have duplicates
                Thread.Sleep(2.Seconds());

                Console.WriteLine("Checking stuff");

                receivedMessages.Count.ShouldBe(numberOfMessages);

                Console.WriteLine("Checking {0} messages", sentMessageIds.Count);

                var formattedReport = FormatReport(sentMessageIds, receivedMessages);

                foreach (var id in sentMessageIds)
                {
                    var messagesWithThatId = receivedMessages.Count(m => m.Id == id);

                    Assert.That(messagesWithThatId, Is.EqualTo(1),
                                @"Expected exactly 1 message with ID {0}, but there was {1}!!

{2}",
                                id, messagesWithThatId, formattedReport);
                }

                Console.WriteLine("All done!");
            }

            Console.WriteLine("Disposed!!");
        }
示例#40
0
        public void Run()
        {
            var endpointName = Assembly.GetEntryAssembly().GetName().Name;
            var directory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "RebusSamples", "MessageBus");
            var subscriptionsFilePath = Path.Combine(directory, "subscriptions.xml");

            using (var adapter = new BuiltinContainerAdapter())
            {
                adapter.Handle<string>(str => Console.WriteLine("Got message: {0}", str));

                Console.WriteLine("Starting {0} bus - using subscription storage in {1}...", endpointName, subscriptionsFilePath);

                Configure.With(adapter)
                    .Logging(l => l.ColoredConsole(minLevel: LogLevel.Warn))
                    .Transport(t => t.UseMsmqAndGetInputQueueNameFromAppConfig())
                    .MessageOwnership(o => o.FromRebusConfigurationSection())
                    .Subscriptions(s => s.StoreInXmlFile(subscriptionsFilePath))
                    .CreateBus()
                    .Start();

                Console.WriteLine(@"-------------------------------
            A) Subscribe to System.String
            B) Unsubscribe to System.String
            C) Publish System.String
            Q) Quit
            -------------------------------
            ");

                var keepRunning = true;

                while (keepRunning)
                {
                    var key = Console.ReadKey(true);

                    switch (char.ToLower(key.KeyChar))
                    {
                        case 'a':
                            Console.WriteLine("Subscribing!");
                            adapter.Bus.Subscribe<string>();
                            break;

                        case 'b':
                            Console.WriteLine("Unsubscribing!");
                            adapter.Bus.Unsubscribe<string>();
                            break;

                        case 'c':
                            Console.WriteLine("Publishing!");
                            adapter.Bus.Publish(string.Format("Greetings to subscribers from {0}", endpointName));
                            break;

                        case 'q':
                            Console.WriteLine("Quitting!");
                            keepRunning = false;
                            break;
                    }
                }

                Console.WriteLine("Stopping the bus....");
            }
        }
示例#41
0
        IBus PullOneOutOfTheHat(string inputQueueName, Action<int> handler = null)
        {
            var adapter = new BuiltinContainerAdapter();

            if (handler != null) adapter.Handle<SomeEvent>(e => handler(e.Number));

            Configure.With(adapter)
                .Transport(t => t.UseRabbitMq(ConnectionString, inputQueueName, "error").ManageSubscriptions())
                .CreateBus().Start();

            disposables.Add(adapter);

            return adapter.Bus;
        }
示例#42
0
        void StartWorkerBus(string queueName, ConcurrentQueue<WorkDone> workDone)
        {
            var adapter = new BuiltinContainerAdapter();

            adapter.Handle<Work>(w => workDone.Enqueue(new WorkDone
            {
                MessageId = w.MessageId,
                WorkerQueueName = queueName
            }));

            Configure.With(TrackDisposable(adapter))
                .Logging(l => l.ColoredConsole(minLevel:LogLevel.Warn))
                .Transport(t => t.UseMsmq(queueName, "error"))
                .CreateBus()
                .Start();
        }