Reputation: 8997
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
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