Django:如何建立到rabbitmq的持久连接?
我正在寻找一种从django应用程序向rabbitmq服务器发布消息的方法。这不是任务卸载,所以我不想用芹菜。目的是使用django应用程序发布到exchange,并使docker容器中的一个姐妹(非django)应用程序从该队列中使用 这一切似乎都非常简单,但是,如果每次都不建立和关闭连接,即使没有明确要求这样做,我也无法发布到exchange 为了解决这个问题,我定义了一个带有嵌套单例类的类,该类使用Pika维护到rabbitmq服务器的连接。其想法是嵌套的单例将只实例化一次,在那时声明连接。任何时候发布到队列中的内容,单例都会处理它Django:如何建立到rabbitmq的持久连接?,django,docker,rabbitmq,amqp,pika,Django,Docker,Rabbitmq,Amqp,Pika,我正在寻找一种从django应用程序向rabbitmq服务器发布消息的方法。这不是任务卸载,所以我不想用芹菜。目的是使用django应用程序发布到exchange,并使docker容器中的一个姐妹(非django)应用程序从该队列中使用 这一切似乎都非常简单,但是,如果每次都不建立和关闭连接,即使没有明确要求这样做,我也无法发布到exchange 为了解决这个问题,我定义了一个带有嵌套单例类的类,该类使用Pika维护到rabbitmq服务器的连接。其想法是嵌套的单例将只实例化一次,在那时声明连接
import logging
import pika
import os
logger = logging.getLogger('django')
class PikaChannelSingleton:
class __Singleton:
channel = pika.adapters.blocking_connection.BlockingChannel
def __init__(self):
self.initialize_connection()
def initialize_connection(self):
logger.info('Attempting to establish RabbitMQ connection')
credentials = pika.PlainCredentials(rmq_username, rmq_password)
parameters = pika.ConnectionParameters(rmq_host, rmq_port, rmq_vhost, credentials, heartbeat=0)
connection = pika.BlockingConnection(parameters)
con_chan = connection.channel()
con_chan.exchange_declare(exchange='xchng', exchange_type='topic', durable=True)
self.channel = con_chan
def send(self, routing_key, message):
if self.channel.is_closed:
PikaChannelSingleton.instance.initialize_connection()
self.channel.basic_publish(exchange='xchng', routing_key=routing_key,
body=message)
instance = None
def __init__(self, *args, **kwargs):
if not PikaChannelSingleton.instance:
logger.info('Creating channel singleton')
PikaChannelSingleton.instance = PikaChannelSingleton.__Singleton()
@staticmethod
def send(routing_key, message):
PikaChannelSingleton.instance.send(routing_key, message)
rmq_connection = PikaChannelSingleton()
然后在django应用程序中需要的地方导入rmq_连接。在toy应用程序和python repl中,一切都可以正常工作,但是每次在django应用程序中调用send函数时,都会建立一个新的连接。然后,连接立即关闭,并显示消息“客户端意外关闭TCP连接”。消息确实正确地发布到了exchange
因此,我确信django正在发生一些事情,以及它如何处理进程等等。问题仍然存在,我如何在每次都不重新建立连接的情况下向队列发送大量消息?如果我理解正确,连接就不能像在单线程上下文中那样保持活动状态。当您的Django应用程序继续执行时,amqp客户端不会在通道上发送,连接将终止 您可以使用,在Django的上下文中可能不容易 一个很好的折衷办法是,只需在您的singleton中收集消息,但只需在Django请求的最后使用
阻塞连接
一次性发送所有消息