芹菜鼠兔,连接关闭

时间:2014-11-26 09:21:32

标签: python rabbitmq pika

我使用芹菜和RabbitMQ来执行某些任务,有时我需要将工作人员的消息返回给RabbitMQ,以便我使用鼠兔。

我目前正在使用BlockingConnection()来连接RabbitMQ,但过了一段时间我得到一个异常" Connection Lost"。

我认为这是因为芹菜是异步的,我使用的是BlockingConnection()。

这是我的代码:

class RabbitConnection(object):
    def __init__(self):
        self.connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
        self.channel = self.connection.channel()
        self.channel.queue_declare(queue=RABBITMQ_OUT_NAME, durable=True)
        self.channel.confirm_delivery()

    def add_alert(self, new_alert):
        message = new_alert.to_json()
        delivered = self.channel.basic_publish(exchange='',
                                               routing_key=RABBITMQ_OUT_NAME,
                                               body=message,
                                               properties=pika.BasicProperties(
                                                   delivery_mode=2,
                                                   content_type='application/json',
                                               ))

我应该使用不同的连接吗?如果是这样我应该如何使用它?

2 个答案:

答案 0 :(得分:3)

听起来这可能是一个线程问题。您可以通过多个线程处理Pika请求,但理想情况下,每个线程应该有一个连接,或use locking。我建议您使用线程安全库,而不是为代码添加额外的复杂性;例如amqp-stormrabbitpy

如果你使用我的AMQP-Storm库来实现它,代码看起来就像这样。

import amqpstorm

class RabbitConnection(object):
    def __init__(self):
        self.connection = amqpstorm.Connection('localhost', 'guest', 'guest')
        self.channel = self.connection.channel()
        self.channel.queue.declare(queue=RABBITMQ_OUT_NAME, durable=True)
        self.channel.confirm_deliveries()

    def add_alert(self, new_alert):
        message = new_alert.to_json()
        delivered = self.channel.basic.publish(exchange='',
                                               routing_key=RABBITMQ_OUT_NAME,
                                               body=message,
                                               properties={
                                                   'delivery_mode': 2,
                                                   'content_type': 'application/json',
                                                })

答案 1 :(得分:-1)

如果您愿意为每个请求牺牲约5毫秒的延迟:

import pika

class PikaClient:
    def __init__(self):
        self.connection = None
        self.channel = None

    def __enter__(self):
        connection = pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
        channel = connection.channel()
        channel.queue_declare(queue='myqueue')
        self.connection = connection
        self.channel = channel
        return self

    def __exit__(self, type, value, traceback):
        self.connection.close()

    def messageSent(self, msgStr):
        self.channel.basic_publish(exchange='', routing_key='myqueue', body=msgStr)

然后当你想发送信息时:

with PikaClient() as pClient: 
    pClient.messageSent("my message")

根据您的应用程序,5毫秒的延迟可能是值得付出的代价。如果您的应用程序成功,您可能仍然想要重写,然后您可以使用具有更好的多线程功能的语言,例如Java。