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}")); }
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); }); }
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 }
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(); } }