Natalie Perret
Natalie Perret

Reputation: 8997

RabbitMQ + .NET C#: published message is never consumed in the same program, why?

I tried to publish and subscribe to the same queue within the same program, but nothing is ever consumed, am I missing out something?

The code:

using System;
using System.Text;

using RabbitMQ.Client;
using RabbitMQ.Client.Events;


namespace CSharpPlayground
{
    public static class Program
    {
        public static void Main()
        {
            const string queueName = "hello";
            var factory = new ConnectionFactory { HostName = "localhost" };
            using var connection = factory.CreateConnection();
            using var queueDeclareChannel = connection.CreateModel();

            queueDeclareChannel.QueueDeclare(
                queue: queueName,
                durable: false,
                exclusive: false,
                autoDelete: false,
                arguments: null);

            using var consumerChannel = connection.CreateModel();
            var consumer = new AsyncEventingBasicConsumer(consumerChannel);
            consumer.Received += async (sender, eventArgs) =>
            {
                var receivedBody = eventArgs.Body;
                var receivedMessage = Encoding.UTF8.GetString(receivedBody.ToArray());
                Console.WriteLine($"[x] Received {receivedMessage}");
            };
            consumerChannel.BasicConsume(
                queue: queueName,
                autoAck: true,
                consumer: consumer);

            const string messageToSend = "Hello World!";
            var bodyToSend = new ReadOnlyMemory<byte>(Encoding.UTF8.GetBytes(messageToSend));
            var publishChannel = connection.CreateModel();
            var basicProperties = publishChannel.CreateBasicProperties();
            queueDeclareChannel.BasicPublish(
                exchange: "",
                routingKey: queueName,
                mandatory: false,
                basicProperties: basicProperties,
                body: bodyToSend);
            Console.WriteLine($"[x] Sent {messageToSend}");

            Console.ReadKey();
        }
    }
}
[x] Sent Hello World!

Upvotes: 1

Views: 683

Answers (1)

JohanP
JohanP

Reputation: 5472

You have an async consumer, which means you need to tell your ConnectionFactory that you are receiving your messages in async fashion.

Set DispatchConsumersAsync = true inside new ConnectionFactory {}

Upvotes: 2

Related Questions