我使用芹菜和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',
))
我应该使用不同的连接吗?如果是这样我应该如何使用它?
答案 0 :(得分:3)
听起来这可能是一个线程问题。您可以通过多个线程处理Pika请求,但理想情况下,每个线程应该有一个连接,或use locking。我建议您使用线程安全库,而不是为代码添加额外的复杂性;例如amqp-storm或rabbitpy。
如果你使用我的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。