【问题标题】:How do I set up a RabbitMQ consumer to consume from a nonempty queue?如何设置 RabbitMQ 消费者以从非空队列消费?
【发布时间】:2015-06-30 15:20:36
【问题描述】:

我目前正在使用 Pika 客户端在 Python 中使用 RabbitMQ 来创建处理各种消息类型的服务器。我的基本设置是一个接收所有传入消息的队列,一个将它们引导到正确目的地的路由进程,以及几个处理请求和接受传入数据的进程。除了一种特定情况外,此设置一直运行良好。当我在服务器进程启动之前运行 RabbitMQ 服务器并收到一条消息时,它会正确地将这些消息存储在传入消息队列中。但是,当我尝试启动这些进程并使用 pika.basic_consume 函数为该非空传入队列设置消费者时,程序挂起。因此,目前如果我想启动我的服务器进程,我必须从队列中清除所有消息,然后它才能正常工作。如何解决此问题以使用非空队列?


这是其中一个流程的示例,它们的设置基本上与此流程相同。

class Router(Process):

    def __init__(self,routing_table):
        super(Router,self).__init__()
        self.routing_table = routing_table

        self.routeQueues    = {
            'r' : 'registration',
            't' : 'util',
            'p' : 'util',
            's' : 'data'
        }

        # Create a connection to the RabbitMQ server.
        self.rabbitConn =  pika.BlockingConnection(pika.ConnectionParameters(host='localhost'))
        self.channel = self.rabbitConn.channel()

        # Load all of the existing registered node queues
        with open('registrations/nodes.txt','r') as nodes:
            for line in nodes:
                info = line.strip().split(":")
                self.channel.queue_declare(info[1])

        # Declare the default queues
        queue_list = ["incoming","registration","util"]
        for queueName in queue_list:
            self.channel.queue_declare(queueName)

        # Start consuming things from the incoming queue
        self.channel.basic_consume(self.gotPacket,queue='incoming')

    def gotPacket(self,ch,method,params,body):
        # Does stuff. Not relevant here.
        pass

   def run(self):
       self.channel.start_consuming()

【问题讨论】:

  • 这应该不是问题。我建议您尝试升级到最新版本的 pika。或者尝试其他库,如 rabbitpy 或我自己的 amqp-storm。
  • @eandersson 我正在使用 pika 0.9.13,最新版本。如果可能的话,我更愿意继续使用 pika,因为此时切换到另一个库将是一项艰巨的任务。
  • 0.9.14 大约一年前发布,修复了很多问题。
  • @eandersson 原来是这样!出于某种奇怪的原因,Pip 声称我拥有最新版本,有点摆弄,我得到它来安装较新的版本。谢谢!

标签: python rabbitmq python-multiprocessing pika


【解决方案1】:

这个问题是由 pika 0.9.13 库引起的。升级到 pika 0.9.14 解决了这个问题。 @eandersson

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-03
    • 2014-03-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多