Example #1
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
        }