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!"));
        }
Example #2
0
        public void RequestReply()
        {
            var replyHandled = new ManualResetEvent(false);

            var bus = StartBus(1);

            adapter.HandleAsync<SomeMessage>(async message =>
            {
                var delay = message.Delay;
                await Task.Delay(delay);
                bus.Reply("yo!");
            });

            adapter.Handle<string>(str =>
            {
                if (str == "yo!")
                {
                    Console.WriteLine("Got reply!");
                    replyHandled.Set();
                }
            });

            bus.SendLocal(new SomeMessage { Delay = 1.Seconds() });

            Console.WriteLine("Waiting for reply...");
            replyHandled.WaitUntilSetOrDie(2.Seconds());

            Console.WriteLine("Bam!");
        }
        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 SequenceOfEventsIsRightAndMessageContextIsAvailableAsItShouldBe()
        {
            var done = new ManualResetEvent(false);

            builtinContainerAdapter.HandleAsync<string>(async str =>
            {
                WriteEvent(string.Format("context before doing anything: {0}, tx: {1}, current thread: {2}", MessageContext.HasCurrent, TransactionContext.Current, Thread.CurrentThread.Name));

                await Task.Delay(TimeSpan.FromSeconds(3));
                WriteEvent(string.Format("context after first await: {0}, tx: {1}, current thread: {2}", MessageContext.HasCurrent, TransactionContext.Current, Thread.CurrentThread.Name));

                await Task.Delay(TimeSpan.FromSeconds(3)).ConfigureAwait(false);
                WriteEvent(string.Format("context after ConfigureAwait(false): {0}, tx: {1}, current thread: {2}", MessageContext.HasCurrent, TransactionContext.Current, Thread.CurrentThread.Name));

                done.Set();
            });

            builtinContainerAdapter.Bus.SendLocal("hej med dig!");

            done.WaitUntilSetOrDie(TimeSpan.FromSeconds(10));

            Thread.Sleep(TimeSpan.FromSeconds(1));

            var eventsArray = events.ToArray();

            Console.WriteLine(@"
------------------------------------------------------------------
Got events:

{0}
------------------------------------------------------------------
", string.Join(Environment.NewLine, eventsArray));

            Assert.That(eventsArray, Is.EqualTo(new[]
            {
                "msg context established",

                "uow started",

                "context before doing anything: True, tx: handler tx on thread 'Rebus 1 worker 1', current thread: Rebus 1 worker 1",
                "context after first await: True, tx: handler tx on thread 'Rebus 1 worker 1', current thread: Rebus 1 worker 1",
                "context after ConfigureAwait(false): True, tx: handler tx on thread 'Rebus 1 worker 1', current thread: ",

                "uow commit",
                "uow dispose",

                "msg context disposed"
            }));
        }
        public void CanDoIt()
        {
            var resetEvent = new ManualResetEvent(false);
            var stringMessageWasReceived = false;
            var activator = new HandlerActivatorForTesting()
                .Handle<string>(str =>
                    {
                        stringMessageWasReceived = true;
                        resetEvent.Set();
                    });

            var bus = CreateBus(InputQueueName, activator).Start();
            bus.Advanced.Routing.Send(InputQueueName + "@" + Environment.MachineName, "wolla my friend!");

            resetEvent.WaitUntilSetOrDie(5.Seconds(), "Did not receive the message");

            stringMessageWasReceived.ShouldBe(true);
        }
        public void ContinuesOnAnyWorkerThreadWithContext()
        {
            var done = new ManualResetEvent(false);
            var result = "";
            Thread initial = null;
            Thread final = null;

            adapter.HandleAsync<SomeMessage>(async message =>
            {
                initial = Thread.CurrentThread;
                MessageContext.GetCurrent().Items["somecontext"] = "inital";

                Console.WriteLine("Started on thread " + initial.ManagedThreadId);

                do
                {
                    await Task.Delay(message.Delay);
                } while (Thread.CurrentThread.ManagedThreadId == initial.ManagedThreadId);

                final = Thread.CurrentThread;
                result = MessageContext.GetCurrent().Items["somecontext"] + "final";

                Console.WriteLine("Ended on thread " + final.ManagedThreadId);

                done.Set();
            });

            var bus = StartBus(10);

            bus.SendLocal(new SomeMessage { Delay = TimeSpan.FromSeconds(1) });

            // wait for a long time, just to be sure some other worker thread will pick it up
            done.WaitUntilSetOrDie(TimeSpan.FromMinutes(1));

            result.ShouldBe("initalfinal");
            initial.ShouldNotBe(final);
            initial.Name.ShouldContain("Rebus 1 worker");
            final.Name.ShouldContain("Rebus 1 worker");
        }
        public void PeekLockRenewalJustWorks()
        {
            var done = new ManualResetEvent(false);

            adapter.HandleAsync(async (string str) =>
            {
                LogEvent("entered!");
                
                await Task.Delay(TimeSpan.FromMinutes(1));

                LogEvent("waited one minute");

                await Task.Delay(TimeSpan.FromMinutes(1));

                LogEvent("waited two minutes");
                
                await Task.Delay(TimeSpan.FromMinutes(1));

                LogEvent("waited three minutes");

                LogEvent("done!");

                done.Set();
            });

            Console.WriteLine("Starting!");
            adapter.Bus.SendLocal("hej");

            done.WaitUntilSetOrDie(TimeSpan.FromMinutes(5));

            Console.WriteLine("Done!");
            Console.WriteLine();

            Console.WriteLine(@"LOG---------------------------------------------------------------------
{0}
------------------------------------------------------------------------", string.Join(Environment.NewLine, events));
        }
        public void WorksWithSomeNumberOfRetries(int numberOfRetries)
        {
            // arrange
            var messageMovedToErrorQueueEvent = new ManualResetEvent(false);
            var adapter = TrackDisposable(new BuiltinContainerAdapter());

            var deliveryCount = 0;
            adapter.Handle<string>(str =>
            {
                deliveryCount++;
                throw new FacilityException("wut?");
            });

            InitializeBus(numberOfRetries, adapter, messageMovedToErrorQueueEvent);

            var stopwatch = Stopwatch.StartNew();
            using (var infoTimer = new Timer(2000))
            {
                infoTimer.Elapsed += delegate
                {
                    Console.WriteLine("{0} delivery attempts - {1:0.0}s elapsed",
                        deliveryCount, stopwatch.Elapsed.TotalSeconds);
                };
                infoTimer.Start();

                // act
                adapter.Bus.SendLocal("ACT!!11");

                var timeout = (numberOfRetries*0.5).Seconds();
                messageMovedToErrorQueueEvent.WaitUntilSetOrDie(timeout, "Only managed to track {0} deliveries", deliveryCount);
                Thread.Sleep(1.Seconds());
            }

            // assert
            Assert.That(deliveryCount, Is.EqualTo(numberOfRetries));
        }
Example #9
0
        public void RestoresContext()
        {
            var done = new ManualResetEvent(false);
            var result = "";

            adapter.HandleAsync<SomeMessage>(async message =>
            {
                MessageContext.GetCurrent().Items["somecontext"] = "asger";

                await Task.Delay(message.Delay);
                MessageContext.GetCurrent().Items["somecontext"] += " heller";

                await Task.Delay(message.Delay);
                MessageContext.GetCurrent().Items["somecontext"] += " hallas";

                await Task.Delay(message.Delay);
                result = MessageContext.GetCurrent().Items["somecontext"] + " waits no more!";

                done.Set();
            });

            var bus = StartBus(1);

            bus.SendLocal(new SomeMessage { Delay = TimeSpan.FromSeconds(1) });

            done.WaitUntilSetOrDie(5.Seconds());

            result.ShouldBe("asger heller hallas waits no more!");
        }
Example #10
0
        public void ContinuesOnWorkerThread()
        {
            var done = new ManualResetEvent(false);

            adapter.HandleAsync<SomeMessage>(async message =>
            {
                Console.WriteLine("Intro");
                var thread = Thread.CurrentThread.ManagedThreadId;

                await Task.Delay(message.Delay);
                Console.WriteLine("First continuation");
                Thread.CurrentThread.ManagedThreadId.ShouldBe(thread);

                await Task.Delay(message.Delay);
                Console.WriteLine("Second continuation");
                Thread.CurrentThread.ManagedThreadId.ShouldBe(thread);

                await Task.Delay(message.Delay);
                Console.WriteLine("Third and final continuation");
                Thread.CurrentThread.ManagedThreadId.ShouldBe(thread);

                done.Set();
            });

            var bus = StartBus(1);

            bus.SendLocal(new SomeMessage { Delay = TimeSpan.FromSeconds(1) });

            done.WaitUntilSetOrDie(5.Seconds());
        }
Example #11
0
        public void SyncTaskRunWorks()
        {
            var done = new ManualResetEvent(false);

            adapter.Handle<SomeMessage>(message =>
            {
                Console.WriteLine("Handling");
                Task.Run(() => { }).Wait();
                done.Set();
            });

            var bus = StartBus(1);

            bus.SendLocal(new SomeMessage());

            done.WaitUntilSetOrDie(1.Seconds());
        }
Example #12
0
        public void MessageIsOnlyHandledOnce()
        {
            var done = new ManualResetEvent(false);

            var bus = StartBus(1);

            var i = 0;
            adapter.HandleAsync<SomeMessage>(async message =>
            {
                i++;
                await Task.Delay(5.Seconds());
                done.Set();
            });

            bus.SendLocal(new SomeMessage());

            done.WaitUntilSetOrDie(50.Seconds());

            i.ShouldBe(1);
        }