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