每回合处理队列中的1条消息

时间:2018-01-11 15:43:05

标签: python rabbitmq pika

我需要拉出每条消息,处理它,一旦我完成了拉动和下一次,因为我向队列发送了很多消息,而且我有很少的接收器,但我希望每个接收器接受一条消息,进程它,拉下一个。

我无法理解如何使用此代码实现此目的:

def main():
credentials = pika.PlainCredentials('admin', 'admin')
connection = pika.BlockingConnection(pika.ConnectionParameters(host=ConfigurationManager.ConfigurationManager().getMessageBrokerUrl(), credentials=credentials))
channel = connection.channel()
channel.queue_declare(queue=matchingExec.getChannelName(), durable=True)

def callback(ch, method, properties, body):
    matchingExec.handleMatchingMessage(json.loads(body))

channel.basic_qos(1)    
channel.basic_consume(callback,
                      queue=matchingExec.getChannelName(),
                      no_ack=True)

print(' [*] Waiting for messages. To exit press CTRL+C')

1 个答案:

答案 0 :(得分:-1)

不知道问题是什么,因为你没有在你的问题中描述它,有一点非常奇怪的是你如何设置你的qos。

如果你这样做,你的问题是否会消失:

channel.basic_qos(prefetch_count=1)

现在您只需将其设置为1而不使用关键字参数,根据文档,第一个参数可能是prefetch_size而不是prefetch_count。

但我并非100%确定您可以在没有消息确认的情况下执行此操作。当您将其作为no_ack=True运行时,兔子会在发送给客户端时隐式确认每条消息,并且服务器无法判断消息是否已由客户端处理过。这可能会使basic_qos在理论上应该具有的效果无效,因为服务器不会从客户端收到任何反馈。

如果仍然无效,请尝试在完成处理后切换消息确认并确认回叫中的消息。