public static async Task Main()
        {
            var          rabbitMqConnectionManager = new RabbitMqConnectionManager(new Uri("amqp://localhost"), "test", TimeSpan.FromSeconds(30));
            const string queueName = "some-queue-name";
            var          options   = new RabbitMqServiceOptionsBuilder()
                                     .WithRetry(TimeSpan.FromSeconds(15), null, TimeSpan.FromSeconds(1))
                                     .WithDeliveryMode(DeliveryMode.Persistent)
                                     .WithConnectionManager(rabbitMqConnectionManager)
                                     .WithDefaultSerializer(message => Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)), "application/json")
                                     .Build();
            var serviceClient = new RabbitMqServiceClient(options);

            // Create a queue
            await serviceClient.CreateQueueAsync(queueName + "-Error", true);

            // Create a queue with options builder
            var createQueueOption = new CreateQueueOptionsBuilder(QueueType.Classic)
                                    .Durable()
                                    .WithDeadLetterExchange(RabbitMqConstants.DefaultExchangeName)
                                    .WithDeadLetterRoutingKey(queueName + "-Error")
                                    .Build();
            await serviceClient.CreateQueueAsync(queueName, createQueueOption);

            // Listen to queue (Auto reconnect is enabled)
            var consumerOptions = new ConsumerOptionsBuilder <string>()
                                  .WithDefaultDeSerializer(message => JsonConvert.DeserializeObject <string>(Encoding.UTF8.GetString(message.Span)))
                                  .WithSimpleMessageAck()
                                  .WithCustomPipe(async(context, next) =>
            {
                Console.WriteLine("Some logging message before processing");
                await next();
                Console.WriteLine("Some logging message after processing");
            })
                                  .Build();
            var activeConsumer = await serviceClient.StartListeningQueueAsync(queueName, consumerOptions, (message, items, ct) =>
            {
                Console.WriteLine(message);
                return(Task.CompletedTask);
            });

            // Enqueue a message
            await serviceClient.EnqueueMessageAsync(queueName, "some-message");

            await Task.Delay(100);

            // Enqueue using EnqueueQueueClient
            var queueClient = serviceClient.CreateQueueClient(queueName);
            await queueClient.EnqueueMessageAsync("some-other-message");

            // Cancel listening
            activeConsumer.Cancel();

            // Purge the queue
            await serviceClient.PurgeQueueAsync(queueName);

            // Delete a queue
            await serviceClient.DeleteQueueAsync(queueName, false, false);

            await serviceClient.DeleteQueueAsync(queueName + "-Error", false, false);
        }
Exemple #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}\"}}");
            }
        }
Exemple #3
0
        public void Setup()
        {
            _rabbitMqConnectionManager = new RabbitMqConnectionManager(InitRabbitMqDocker.RabbitMqUri, nameof(RabbitMqServiceClientTests), TimeSpan.FromSeconds(20));

            _baseOptionBuilder = new RabbitMqServiceOptionsBuilder()
                                 .WithRetry(TimeSpan.FromSeconds(15), null, TimeSpan.FromSeconds(1))
                                 .WithConnectionManager(_rabbitMqConnectionManager)
                                 .WithDefaultSerializer(message => Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)), "application/json");
            var options = _baseOptionBuilder.Build();

            _serviceClient = new RabbitMqServiceClient(options);
            _queueName     = BaseQueueName + Guid.NewGuid();
        }
Exemple #4
0
        public async Task CanOverridePerMessageTtl()
        {
            var options = new RabbitMqServiceOptionsBuilder()
                          .WithRetry(TimeSpan.FromSeconds(15), null, TimeSpan.FromSeconds(1))
                          .WithConnectionManager(_rabbitMqConnectionManager)
                          .WithPerMessageTtl(500)
                          .WithDefaultSerializer(message => Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)), "application/json")
                          .Build();
            var serviceClient = new RabbitMqServiceClient(options);

            await serviceClient.CreateQueueAsync(_queueName);

            await serviceClient.EnqueueMessageAsync(_queueName, "some-message", new Dictionary <string, object>
            {
Exemple #5
0
        public void Setup()
        {
            _rabbitMqConnectionManager = new RabbitMqConnectionManager(InitRabbitMqDocker.RabbitMqUri, nameof(RabbitMqServiceClientTests), TimeSpan.FromSeconds(20));

            var options = new RabbitMqServiceOptionsBuilder()
                          .WithRetry(TimeSpan.FromSeconds(15), null, TimeSpan.FromSeconds(1))
                          .WithConnectionManager(_rabbitMqConnectionManager)
                          .WithDefaultSerializer(message => Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)), "application/json")
                          .Build();

            _serviceClient  = new RabbitMqServiceClient(options);
            _queueName      = BaseQueueName + Guid.NewGuid();
            _errorQueueName = _queueName + "-Error";

            _consumerOptions = new ConsumerOptionsBuilder <string>()
                               .WithSimpleMessageAck()
                               .WithDefaultDeSerializer(message => JsonConvert.DeserializeObject <string>(Encoding.UTF8.GetString(message.Span)))
                               .Build();
        }
Exemple #6
0
        public async Task CanUsePerMessageTtl()
        {
            var options = new RabbitMqServiceOptionsBuilder()
                          .WithRetry(TimeSpan.FromSeconds(15), null, TimeSpan.FromSeconds(1))
                          .WithConnectionManager(_rabbitMqConnectionManager)
                          .WithPerMessageTtl(500)
                          .WithDefaultSerializer(message => Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)), "application/json")
                          .Build();
            var serviceClient = new RabbitMqServiceClient(options);

            await serviceClient.CreateQueueAsync(_queueName);

            await serviceClient.EnqueueMessageAsync(_queueName, "some-message");

            await Task.Delay(TimeSpan.FromMilliseconds(100));

            (await serviceClient.GetMessageCountInQueueAsync(_queueName)).Should().Be(1);
            await Task.Delay(TimeSpan.FromMilliseconds(600));

            (await serviceClient.GetMessageCountInQueueAsync(_queueName)).Should().Be(0);
        }
Exemple #7
0
        public async Task CanConfigureWhenEnqueue()
        {
            var options = new RabbitMqServiceOptionsBuilder()
                          .WithRetry(TimeSpan.FromSeconds(15), null, TimeSpan.FromSeconds(1))
                          .WithConnectionManager(_rabbitMqConnectionManager)
                          .WithPerMessageTtl()
                          .WithDefaultSerializer(message => Encoding.UTF8.GetBytes(JsonConvert.SerializeObject(message)), "application/json")
                          .Build();
            var serviceClient = new RabbitMqServiceClient(options);

            await serviceClient.CreateQueueAsync(_queueName);

            await serviceClient.EnqueueMessageAsync(_queueName, "some-message", new Dictionary <string, object>
            {
                [MessageTtlClientPipe.ContextItemExpirationKey] = 300
            });

            await Task.Delay(TimeSpan.FromMilliseconds(100));

            (await serviceClient.GetMessageCountInQueueAsync(_queueName)).Should().Be(1);
            await Task.Delay(TimeSpan.FromMilliseconds(400));

            (await serviceClient.GetMessageCountInQueueAsync(_queueName)).Should().Be(0);
        }