In rabbitmq, Direct Exchange will deliver messages to the queues based on the message routing key. In direct exchange, the message is routed to the queues whose binding key exactly matches the routing key of the message.
Generally, in rabbitmq when the producer creates a message that will not directly send to the queue, instead first the message will be sent to exchanges, then after that, a routing agent reads and sends it to the appropriate queue with help of header attributes, bindings and routing keys.
In rabbitmq, we have different types of exchanges available are
To know more about exchanges in rabbitmq, check this RabbitMQ Exchanges.
Following is the pictorial representation of message flow in rabbit direct exchange.
Now, we will learn how to use Direct Exchange to push and read messages from rabbitmq in c# or .net application with examples.
Let’s create a simple console application with the Name “RequestRabbitMQ” as shown below to publish messages to the rabbitmq queue using direct exchange in c#.
After creating an application, now we will add the “RabbitMQ.Client” NuGet package in our c# application to communicate with rabbitmq server to publish or consume messages from queues in rabbitmq.
In c#, we can publish or consume messages from rabbitmq by using RabbitMQ.Client NuGet package for that, right-click on your application and select Manage NuGet Packages as shown below.
Now search for RabbitMQ.Client package and install it in your application as shown below.
Following is another way to install RabbitMQ.Client package by using Package Manager Console as shown below by entering the following command.
Command to install - Install-Package RabbitMQ.Client -Version 5.1.0
Before we start writing a code in c# to publish messages to rabbitmq, we will create a direct exchange, queue and will bind a queue to exchange using the web admin console.
To create an exchange in rabbitmq web management portal, open http://localhost:15672/#/exchanges url and then go to Add a new exchange panel and enter details as shown below by selecting Type as “direct” and click on Add exchange button to create an exchange (request.exchange).
After creating an exchange (request.exchange), next, we will create a queue (request.queue) in the web management portal.
To create a queue in rabbitmq web management portal, open http://localhost:15672/#/queues url and then go to Add a new queue panel and enter details as shown below, and click on add queue button to create a queue (request.queue).
After creating a queue and exchange, next, we need to bind a queue with an exchange in rabbitmq web admin console.
To bind a queue with an exchange, click on the queue (request.queue) name, then the Bindings panel will expand and enter details like exchange name as “request.exchange”, routing key as “directexchange_key”, and click on Bind button. After binding a queue to exchange, the binding will be as shown below.
After the completion of binding a queue to exchange, now we will publish messages from the c# application to rabbitmq queue using RabbitMQ.Client service.
In c#, by using the BasicPublish method of RabbitMQ.Client service we can publish a messages to particular queue based on our requirements.
Following is the definition of rabbitmq BasicPublish method in c#.
If you observe the BasicPublish method, it accepts multiple parameters like a model, exchange, routing key, properties, and required message to publish in rabbitmq queue.
Following is the sample way of calling the BasicPublish method to publish a message to rabbitmq queue in c# programming language.
To publish messages to the rabbitmq queue, add a class with the name “Directmessages.cs” in your application as shown below.
Now, open Directmessages.cs class file and write the code as shown below.
If you observe the above code, to establish a connection with rabbitmq server we are passing the required credentials along with the HostName to ConnectionFactory() method. After that, we are publishing a message (Direct Message) to the queue by passing the required parameters like an exchange, routing key, properties, and message to the BasicPublish method.
Now open Program.cs class file and write a code in the Main method to call Directmessages.cs class to get messages from rabbitmq.
Following is the code which we need to write in Program.cs class file Main method to publish messages to rabbitmq server.
When we execute the above c# program, we will get the result as shown below.
After executing the above program, if we check the queue (request.queue) details in the rabbitmq web management portal, the Ready column is having 1 as shown below which means the message was published successfully to request.queue.
After publishing a message to the queue, now will learn how to consume or get messages from rabbitmq using RabbitMQ.Client service in c# or .net application with examples.
Let’s create a simple console application with the Name “RabbitMQConsumer” as shown below to consume or read messages from the rabbitmq queue.
After creating an application, now add the “RabbitMQ.Client” NuGet package reference to your application as we did in publishing the application to communicate with the rabbitmq server.
After installing RabbitMQ.Client, next add a class with the name “MessageReceiver.cs” in your application as shown below to read or get messages from queues in rabbitmq.
Now, open MessageReceiver.cs class file and write the code as shown below.
If you observe the above code, we created a MessageReceiver class and it’s inheriting from DefaultBasicConsumer class of RabbitMQ.Client service and we implemented a HandleBasicDeliver method by overriding it to receive a message body.
Now open Program.cs class file and write a code in the Main method to call MessageReceiver.cs class to get messages from rabbitmq.
Following is the code which we need to write in Program.cs class file Main method to receive data from rabbitmq server.
If you observe the above example, to establish a connection with rabbitmq server we are passing the required credentials along with the HostName to ConnectionFactory() method. After that, we created a connection and channel by calling the “CreateConnection” and “CreateModel” methods and we set a prefetchCount to 1 so that it tells RabbitMQ not to give more than one message at a time to the worker.
Next, we created an instance of MessageReceiver class and passed IModel (channel) to it, in the final step we called the “BasicConsume” method and passed the queue name to it “request.queue” along with we have set autoAck to false and passed the messageReceiver instance to it.
Here, prefetchCount is used to tell RabbitMQ not to give more than one message at a time to the worker. Or, in other words, don't dispatch a new message to a worker until it has been processed and acknowledged the previous one. Instead, it will dispatch to the next worker that is not still busy.
When we execute our application, we will get messages from the queue (request.queue) as shown below.
This is how we can use rabbitmq direct exchanges to consume or read messages from queues in c# using RabbitMQ.Client service based on our requirements.