Creating the producer class to send the notifications
Bahman Shadmehr
Posted on June 27, 2023
Title: Exploring the RabbitMQProducer Class for Message Publishing
Table of Contents:
- Overview
- Code Explanation
- Conclusion
1. Overview
In this blog post, we will explore the RabbitMQProducer
class, which is responsible for publishing messages to a RabbitMQ exchange. We will examine the code and discuss its functionality and error handling.
2. Code Explanation
The code snippet defines the RabbitMQProducer
class, which handles publishing messages to a RabbitMQ exchange. Let's explore its functionality and error handling in more detail.
2.1. Constructor (__init__
)
The constructor initializes the RabbitMQProducer
instance by accepting a connection
parameter, which represents an instance of the RabbitMQConnection
class. It sets the connection
property of the instance to the provided connection
object and initializes the channel
property to None
.
2.2. publish_message
method
The publish_message
method is responsible for publishing a message to the RabbitMQ exchange. It takes three parameters: exchange
, routing_key
, and data
.
import json
from pika import BasicProperties, exceptions as pika_exceptions
class RabbitMQProducer:
def __init__(self, connection):
self.connection = connection
self.channel = None
def publish_message(self, exchange, routing_key, data):
if self.channel is None:
self.channel = self.connection.get_channel()
if self.channel is not None:
try:
self.channel.exchange_declare(exchange=exchange, exchange_type="topic")
message = json.dumps(data)
properties = BasicProperties(content_type="application/json", delivery_mode=2)
self.channel.basic_publish(
exchange=exchange,
routing_key=routing_key,
body=message,
properties=properties,
)
print(f"Message sent to exchange: {exchange} with routing_key {routing_key}")
except pika_exceptions.ConnectionClosedByBroker:
print("Connection closed by broker. Failed to publish the message")
else:
print("Failed to obtain a channel for publishing the message")
If the
channel
property of the instance isNone
, it calls theget_channel
method of theconnection
object to obtain a channel.-
If the
channel
is notNone
, it performs the following steps:- Declares the exchange using the
exchange_declare
method of thechannel
object, specifying theexchange
andexchange_type
. - Converts the
data
parameter to JSON format usingjson.dumps
. - Creates a
BasicProperties
object with content type set to "application/json" and delivery mode set to 2 (persistent message). - Publishes the message to the exchange using the
basic_publish
method of thechannel
object, specifying theexchange
,routing_key
,body
, andproperties
. - Prints a success message indicating the exchange and routing key of the message.
- Declares the exchange using the
If a
ConnectionClosedByBroker
exception is raised during the publish process, it catches the exception and prints a failure message indicating the connection was closed by the broker.If the
channel
isNone
, it prints a failure message indicating that it failed to obtain a channel for publishing the message.
3. Conclusion
The RabbitMQProducer
class provides a convenient way to publish messages to a RabbitMQ exchange. It encapsulates the logic for establishing a channel, declaring an exchange, and publishing a message with the specified routing key and data. The class handles potential exceptions, such as a closed connection or failure to obtain a channel
, and provides informative error messages.
By using this class, you can easily integrate message publishing capabilities into your applications that communicate with RabbitMQ.
Posted on June 27, 2023
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.