如何设置RabbitMQ使用者从非空队列中使用?

时间:2015-06-30 15:20:37

标签: python rabbitmq python-multiprocessing pika

我目前正在使用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()

1 个答案:

答案 0 :(得分:0)

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