Skip to content

ansmirnov/python-rabbitmq-work-queues

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

41 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Using work queues in RabbitMQ and Python

Contents

Environment description

  • Deployed RabbitMQ 3.8.11
  • Python 3.9.1

Python requirements

pika==1.1.0

Producer

Imports

Import system modules.

import os
import sys

Import pika.

import pika

Parameters

RABBITMQ_HOST = os.environ.get("RABBITMQ_HOST")
RABBITMQ_USER = os.environ.get("RABBITMQ_USER")
RABBITMQ_PASSWORD = os.environ.get("RABBITMQ_PASSWORD")

Queue parameters

RABBITMQ_QUEUE = os.environ.get("RABBITMQ_QUEUE")
RABBITMQ_DURABLE = bool(os.environ.get("RABBITME_DURABLE"))

Messages parameters

RABBITMQ_DELIVERY_MODE = int(os.environ.get("RABBITMQ_DELIVERY_MODE"))

Creds

credentials = pika.PlainCredentials(RABBITMQ_USER, RABBITMQ_PASSWORD)

Connection

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host=RABBITMQ_HOST, credentials=credentials)
)

Channel

channel = connection.channel()

Declare queue

channel.queue_declare(queue=RABBITMQ_QUEUE, durable=RABBITMQ_DURABLE)

Message

message = ' '.join(sys.argv[1:]) or "Hello World!"

Publish

channel.basic_publish(
    exchange='',
    routing_key=RABBITMQ_QUEUE,
    body=message,
    properties=pika.BasicProperties(
        delivery_mode=RABBITMQ_DELIVERY_MODE,
    ))

Close the connection

connection.close()

Consumer

Imports

import os
import time
import pika

Parameters

RABBITMQ_HOST = os.environ.get("RABBITMQ_HOST")
RABBITMQ_USER = os.environ.get("RABBITMQ_USER")
RABBITMQ_PASSWORD = os.environ.get("RABBITMQ_PASSWORD")

Queue parameters

RABBITMQ_QUEUE = os.environ.get("RABBITMQ_QUEUE")
RABBITMQ_DURABLE = bool(os.environ.get("RABBITME_DURABLE"))

Channel parameters

RABBITMQ_PREFETCH_COUNT = int(os.environ.get("RABBITMQ_PREFETCH_COUNT"))

Creds

credentials = pika.PlainCredentials(RABBITMQ_USER, RABBITMQ_PASSWORD)

Connection

connection = pika.BlockingConnection(
    pika.ConnectionParameters(host=RABBITMQ_HOST, credentials=credentials)
)

Channel

channel = connection.channel()

Declare queue

channel.queue_declare(queue=RABBITMQ_QUEUE, durable=RABBITMQ_DURABLE)

Callback

def callback(ch, method, properties, body):
    print("Received %r" % body)
    time.sleep(body.count(b'.'))
    print("Done")
    ch.basic_ack(delivery_tag=method.delivery_tag)

Configure QOS

channel.basic_qos(prefetch_count=RABBITMQ_PREFETCH_COUNT)

Set callback

channel.basic_consume(queue=RABBITMQ_QUEUE, on_message_callback=callback)

Start consuming

channel.start_consuming()

References

  1. https://www.rabbitmq.com/tutorials/tutorial-two-python.html
  2. https://www.enterpriseintegrationpatterns.com/patterns/messaging/CompetingConsumers.html