Example #1
0
        public async Task CanListenToMessageAndSurviveRestart()
        {
            var randomMessage1 = "first-" + Guid.NewGuid();
            var randomMessage2 = "second-" + Guid.NewGuid();
            var semaphore      = new SemaphoreSlim(1);

            await _serviceClient.CreateQueueAsync(_queueName);

            var actualMessages  = new List <string>();
            var consumerOptions = new ConsumerOptionsBuilder <string>()
                                  .WithDefaultDeSerializer(message => JsonConvert.DeserializeObject <string>(Encoding.UTF8.GetString(message.Span)))
                                  .WithSimpleMessageAck()
                                  .Build();
            await _serviceClient.StartListeningQueueAsync(_queueName, consumerOptions, (message, _, ct) =>
            {
                actualMessages.Add(message);
                semaphore.Release();
                return(Task.CompletedTask);
            });

            await semaphore.WaitAsync();

            await _serviceClient.EnqueueMessageAsync(_queueName, randomMessage1);

            await semaphore.WaitAsync(TimeSpan.FromSeconds(20));

            InitRabbitMqDocker.RestartRabbitMq();

            await _serviceClient.EnqueueMessageAsync(_queueName, randomMessage2);

            await semaphore.WaitAsync(TimeSpan.FromSeconds(20));

            actualMessages.Should().BeEquivalentTo(randomMessage1, randomMessage2);
        }
Example #2
0
        public async Task CaneEnqueuePersistentMessage()
        {
            var randomMessage1 = Guid.NewGuid();
            var randomMessage2 = Guid.NewGuid();

            var options = _baseOptionBuilder
                          .WithDeliveryMode(DeliveryMode.Persistent)
                          .Build();

            _serviceClient = new RabbitMqServiceClient(options);
            await _serviceClient.CreateQueueAsync(_queueName);

            await _serviceClient.EnqueueMessageAsync(_queueName, new { test = "first-" + randomMessage1 });

            InitRabbitMqDocker.RestartRabbitMq();

            await _serviceClient.EnqueueMessageAsync(_queueName, new { test = "second-" + randomMessage2 });

            using var channelContainer = await _rabbitMqConnectionManager.AcquireChannel(ChannelType.Consumer);

            var message1 = Encoding.UTF8.GetString(channelContainer.Channel.BasicGet(_queueName, true).Body.Span);
            var message2 = Encoding.UTF8.GetString(channelContainer.Channel.BasicGet(_queueName, true).Body.Span);

            using (new AssertionScope())
            {
                message1.Should().BeEquivalentTo($"{{\"test\":\"first-{randomMessage1}\"}}");
                message2.Should().BeEquivalentTo($"{{\"test\":\"second-{randomMessage2}\"}}");
            }
        }