Exemple #1
0
        public async Task PublishSubscribe_ShouldDeliverToOneSubscriber_IfSubscriptionIsExclusive()
        {
            // given
            var sentValue = Guid.NewGuid().ToString();

            var deliveryCount = 0;

            var options = SubscribeOptions.Exclusive();

            _sut.Subscribe <TestMessage3>(m =>
            {
                Interlocked.Increment(ref deliveryCount);
            }, options);

            _sut.Subscribe <TestMessage3>(m =>
            {
                Interlocked.Increment(ref deliveryCount);
            }, options);

            await _sut.StartAsync();

            // when
            await _sut.PublishAsync(new TestMessage3 { Value = sentValue });

            // then
            Thread.Sleep(TimeSpan.FromSeconds(2));

            Assert.That(deliveryCount, Is.EqualTo(1));
        }
Exemple #2
0
        private static async Task SinglePublisherMultipleSubscribersThatSharesQueue()
        {
            Console.Clear();
            Console.WriteLine("Single publisher and multiple subscribers that shares one message queue");
            Console.WriteLine("Enter message text to send or empty string to exit:");

            using (var caraBus = new RabbitMQCaraBus(new RabbitMQCaraBusOptions()))
            {
                var options = SubscribeOptions.Exclusive();

                caraBus.Subscribe <Message>(m =>
                {
                    Console.WriteLine($"Subscriber 1 received message: {m.Text}");
                }, options);

                caraBus.Subscribe <Message>(m =>
                {
                    Console.WriteLine($"Subscriber 2 received message: {m.Text}");
                }, options);

                await caraBus.StartAsync();

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

                    await caraBus.PublishAsync(new Message { Text = text });
                }

                await caraBus.StopAsync();
            }
        }
Exemple #3
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();
            }
        }
Exemple #4
0
        public async Task PublishSubscribe_ShouldDeliverMessagesEveryGroup()
        {
            // given
            var delivered = new CountdownEvent(16);

            var deliveryCountGroup1_sub1 = 0;
            var deliveryCountGroup1_sub2 = 0;

            var deliveryCountGroup2_sub1 = 0;
            var deliveryCountGroup2_sub2 = 0;

            var deliveryCountGroup3_sub1 = 0;
            var deliveryCountGroup3_sub2 = 0;
            var deliveryCountGroup3_sub3 = 0;
            var deliveryCountGroup3_sub4 = 0;

            var deliveryCountNoGroup = 0;

            _sut.Subscribe <TestMessage2>(m =>
            {
                Interlocked.Increment(ref deliveryCountGroup1_sub1);
                delivered.Signal();
            }, SubscribeOptions.Exclusive("GROUP 1"));

            _sut.Subscribe <TestMessage2>(m =>
            {
                Interlocked.Increment(ref deliveryCountGroup1_sub2);
                delivered.Signal();
            }, SubscribeOptions.Exclusive("GROUP 1"));

            _sut.Subscribe <TestMessage2>(m =>
            {
                Interlocked.Increment(ref deliveryCountGroup2_sub1);
                delivered.Signal();
            }, SubscribeOptions.Exclusive("GROUP 2"));

            _sut.Subscribe <TestMessage2>(m =>
            {
                Interlocked.Increment(ref deliveryCountGroup2_sub2);
                delivered.Signal();
            }, SubscribeOptions.Exclusive("GROUP 2"));

            _sut.Subscribe <TestMessage2>(m =>
            {
                Interlocked.Increment(ref deliveryCountGroup3_sub1);
                delivered.Signal();
            }, SubscribeOptions.Exclusive("GROUP 3"));

            _sut.Subscribe <TestMessage2>(m =>
            {
                Interlocked.Increment(ref deliveryCountGroup3_sub2);
                delivered.Signal();
            }, SubscribeOptions.Exclusive("GROUP 3"));

            _sut.Subscribe <TestMessage2>(m =>
            {
                Interlocked.Increment(ref deliveryCountGroup3_sub3);
                delivered.Signal();
            }, SubscribeOptions.Exclusive("GROUP 3"));

            _sut.Subscribe <TestMessage2>(m =>
            {
                Interlocked.Increment(ref deliveryCountGroup3_sub4);
                delivered.Signal();
            }, SubscribeOptions.Exclusive("GROUP 3"));


            _sut.Subscribe <TestMessage2>(m =>
            {
                Interlocked.Increment(ref deliveryCountNoGroup);
                delivered.Signal();
            }, SubscribeOptions.Exclusive());


            await _sut.StartAsync();

            // when
            var publish1_1 = _sut.PublishAsync(new TestMessage2());
            var publish1_2 = _sut.PublishAsync(new TestMessage2());

            var publish2_1 = _sut.PublishAsync(new TestMessage2());
            var publish2_2 = _sut.PublishAsync(new TestMessage2());

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

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

            Assert.That(deliveryCountGroup1_sub1, Is.EqualTo(2));
            Assert.That(deliveryCountGroup1_sub2, Is.EqualTo(2));
            Assert.That(deliveryCountGroup2_sub1, Is.EqualTo(2));
            Assert.That(deliveryCountGroup2_sub2, Is.EqualTo(2));

            Assert.That(deliveryCountGroup3_sub1, Is.EqualTo(1));
            Assert.That(deliveryCountGroup3_sub2, Is.EqualTo(1));
            Assert.That(deliveryCountGroup3_sub3, Is.EqualTo(1));
            Assert.That(deliveryCountGroup3_sub4, Is.EqualTo(1));

            Assert.That(deliveryCountNoGroup, Is.EqualTo(4));
        }