DEV Community

Bahman Shadmehr
Bahman Shadmehr

Posted on

Creating the producer class to send the notifications

Title: Exploring the RabbitMQProducer Class for Message Publishing

Table of Contents:

  1. Overview
  2. Code Explanation
  3. 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")
Enter fullscreen mode Exit fullscreen mode
  • If the channel property of the instance is None, it calls the get_channel method of the connection object to obtain a channel.

  • If the channel is not None, it performs the following steps:

    • Declares the exchange using the exchange_declare method of the channel object, specifying the exchange and exchange_type.
    • Converts the data parameter to JSON format using json.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 the channel object, specifying the exchange, routing_key, body, and properties.
    • Prints a success message indicating the exchange and routing key of the message.
  • 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 is None, 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.

Top comments (0)