Exemplo n.º 1
0
        public async Task PublishSubscribe_ShouldDeliverMessagesInsideScopeOnly()
        {
            // given
            var scope1Name          = Guid.NewGuid().ToString();
            var scope1SentValue     = "[scope1value]";
            var scope1ReceivedValue = string.Empty;

            var scope2Name          = Guid.NewGuid().ToString();
            var scope2SentValue     = "[scope2value]";
            var scope2ReceivedValue = string.Empty;

            var delivered = new CountdownEvent(4);

            _sut.Subscribe <TestMessage>(m =>
            {
                scope1ReceivedValue = $"{scope1ReceivedValue}{m.Value}";
                delivered.Signal();
            }, SubscribeOptions.NonExclusive(opt => opt.Scope = scope1Name));

            _sut.Subscribe <TestMessage>(m =>
            {
                scope2ReceivedValue = $"{scope2ReceivedValue}{m.Value}";
                delivered.Signal();
            }, SubscribeOptions.NonExclusive(opt => opt.Scope = scope2Name));

            await _sut.StartAsync();

            // when
            var publish1_1 = _sut.PublishAsync(new TestMessage {
                Value = scope1SentValue
            }, new PublishOptions {
                Scope = scope1Name
            });
            var publish1_2 = _sut.PublishAsync(new TestMessage {
                Value = scope1SentValue
            }, new PublishOptions {
                Scope = scope1Name
            });

            var publish2_1 = _sut.PublishAsync(new TestMessage {
                Value = scope2SentValue
            }, new PublishOptions {
                Scope = scope2Name
            });
            var publish2_2 = _sut.PublishAsync(new TestMessage {
                Value = scope2SentValue
            }, new PublishOptions {
                Scope = scope2Name
            });

            Task.WaitAll(publish1_1, publish1_2, publish2_1, publish2_2);

            // then
            delivered.Wait(TimeSpan.FromSeconds(2));

            Assert.That(scope1ReceivedValue, Is.EqualTo($"{scope1SentValue}{scope1SentValue}"));
            Assert.That(scope2ReceivedValue, Is.EqualTo($"{scope2SentValue}{scope2SentValue}"));
        }
Exemplo n.º 2
0
        public async Task PublishSubscribe_WhenHandlerReturnTask_ShouldWaitTillHandlerEnd()
        {
            // given
            var delivery = new CountdownEvent(2);

            var mockClass = Substitute.For <MockClass>();

            var startValue = "start";
            var endValue   = "end";

            _sut.Subscribe <TestMessage>(async m =>
            {
                mockClass.Test(startValue);
                await Task.Delay(TimeSpan.FromMilliseconds(500));
                mockClass.Test(endValue);
                delivery.Signal();
            }, SubscribeOptions.NonExclusive());

            await _sut.StartAsync();

            // when
            await _sut.PublishAsync(new TestMessage());

            await _sut.PublishAsync(new TestMessage());

            delivery.Wait(TimeSpan.FromSeconds(15));

            // then
            Received.InOrder(() =>
            {
                // Проверяем, что перед началом обработки следующего сообщения заканчивается обработка первого
                mockClass.Test(startValue);
                mockClass.Test(endValue);

                mockClass.Test(startValue);
                mockClass.Test(endValue);
            });
        }
Exemplo n.º 3
0
        public async Task PublishSubscribe_ShouldLimitSimultaneouslyRunningHandlersToSpecifiedValue_IfMaxConcurrentHandlersSpecified()
        {
            // given
            var delivery = new CountdownEvent(10);

            _sut = CreateCaraBus(new CaraBusBaseOptions
            {
                MaxDegreeOfParallelism = 5
            });

            _sut.Subscribe <TestMessage>(m =>
            {
                Thread.Sleep(TimeSpan.FromMilliseconds(800));
                delivery.Signal();
            }, SubscribeOptions.NonExclusive());

            await _sut.StartAsync();

            // when
            var sw = new Stopwatch();

            sw.Start();

            for (var i = 0; i < 10; i++)
            {
                await _sut.PublishAsync(new TestMessage());
            }

            delivery.Wait(TimeSpan.FromSeconds(15));

            sw.Stop();
            var executioTime = sw.Elapsed;

            // then
            Assert.That(executioTime.Seconds, Is.GreaterThanOrEqualTo(1));
            Assert.That(executioTime.Seconds, Is.LessThanOrEqualTo(2)); // 10 messages, 5 max parallel degree, 10/5 = 2 messages per moment, 800ms * 2 = ~1600
        }
Exemplo n.º 4
0
        private static async Task Scopes()
        {
            Console.Clear();
            Console.WriteLine("Scopes");
            Console.WriteLine("There are two scopes declared for this sample: 'one' and 'two'");
            Console.WriteLine("Enter '[scope]<space>message text' to send or empty string to exit:");

            using (var caraBus = new RabbitMQCaraBus(new RabbitMQCaraBusOptions()))
            {
                caraBus.Subscribe <Message>(m =>
                {
                    Console.WriteLine($"[scope 'one'], default group subscriber 1: received message: {m.Text}");
                }, SubscribeOptions.Exclusive(opt => opt.Scope = "one"));

                caraBus.Subscribe <Message>(m =>
                {
                    Console.WriteLine($"[scope 'one'], default group subscriber 2: received message: {m.Text}");
                }, SubscribeOptions.Exclusive(opt => opt.Scope = "one"));

                caraBus.Subscribe <Message>(m =>
                {
                    Console.WriteLine($"[scope 'one'], custom some group, subscriber 1: received message: {m.Text}");
                }, SubscribeOptions.Exclusive("some group", opt => opt.Scope = "one"));

                caraBus.Subscribe <Message>(m =>
                {
                    Console.WriteLine($"[scope 'one'] custom some group, subscriber 2: received message: {m.Text}");
                }, SubscribeOptions.Exclusive("some group", opt => opt.Scope = "one"));

                caraBus.Subscribe <Message>(m =>
                {
                    Console.WriteLine($"[scope 'two'] subscriber 1: received message: {m.Text}");
                }, SubscribeOptions.NonExclusive(opt => opt.Scope = "two"));

                caraBus.Subscribe <Message>(m =>
                {
                    Console.WriteLine($"[scope 'two'] subscriber 2: received message: {m.Text}");
                }, SubscribeOptions.NonExclusive(opt => opt.Scope = "two"));

                await caraBus.StartAsync();

                var scopeOneMessage = "Hello for scope 'one'";
                WriteDemoText($"one {scopeOneMessage}");
                await caraBus.PublishAsync(new Message { Text = scopeOneMessage }, new PublishOptions { Scope = "one" });

                await Task.Delay(TimeSpan.FromSeconds(2));

                var scopeTwoMessage = "Hello for scope 'two'";
                WriteDemoText($"two {scopeTwoMessage}");
                await caraBus.PublishAsync(new Message { Text = scopeTwoMessage }, new PublishOptions { Scope = "two" });

                while (true)
                {
                    var text = Console.ReadLine();
                    if (text == string.Empty)
                    {
                        break;
                    }

                    var parts = text.Split(' ');

                    var scope = parts[0];
                    text = parts.Length > 1
                        ? parts.Skip(1).Aggregate((c, n) => c + " " + n)
                        : String.Empty;

                    await caraBus.PublishAsync(new Message { Text = text }, new PublishOptions { Scope = scope });
                }

                await caraBus.StopAsync();
            }
        }