I'm trying to write a context manager to connect to rabbit using pika
. This is how it looks
import pika
class RabbitConnection:
def __init__(self, host, user, password, queue_name, port=5627):
self.host = host
self.user = user
self.password = password
self.port = port
self.queue_name = queue_name
def __enter__(self):
credentials = pika.PlainCredentials(self.user, self.password)
parameters = pika.ConnectionParameters(
host=self.host,
port=self.port,
credentials=credentials
)
self.connection = pika.BlockingConnection(parameters)
self.channel = self.connection.channel()
self.channel.queue_declare(queue=self.queue_name)
return self.channel
def __exit__(self):
self.connection.close()
But it doesn't work. Here is simple django view for sending message to rabbit
def send_message(request):
message = request.GET['message']
queue_name = 'hello'
with RabbitConnection(settings.RABBIT_HOST, settings.RABBIT_USER, settings.RABBIT_PASSWORD, queue_name) as rc:
rc.basic_publish(
exchange='',
routing_key=queue_name,
body=message,
)
return HttpResponse()
But I got an error pika.exceptions.AMQPConnectionError
on line self.connection = pika.BlockingConnection(parameters)
The funny thing is when I use same code without context manager it works (no errors)
def send_message(request):
message = request.GET['message']
queue_name = 'hello'
credentials = pika.PlainCredentials(settings.RABBIT_USER, settings.RABBIT_PASSWORD)
parameters = pika.ConnectionParameters(
host=settings.RABBIT_HOST,
port=5672,
credentials=credentials
)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(
exchange='',
routing_key='hello',
body=message,
)
connection.close()
return HttpResponse()
Where the problem is?
take a look at the default port you're using:
def __init__(self, host, user, password, queue_name, port=5627):
The rabbitmq port is typically 5672...