如何在python中做一个简单的Pika SelectConnection发送消息?

时间:2015-05-19 17:30:50

标签: python rabbitmq pika

我正在尝试将我的代码转换为通过Pika发送rabbitmq消息。我在理解如何使用异步连接(例如SelectConnection)发送简单消息时遇到了很多麻烦。

在我使用amqp库的旧代码中,我只是声明一个这样的类:

kAudioFormatMPEG4AAC

然后我的代码中的其他地方我调用sendMQ("这是我的消息"),然后代码继续。我不需要听取确认等。

有人可以使用pika和SelectConnection编写一个简单的类,它也可以使用sendMQ发送消息("这是我的消息")?我看过鼠兔的例子,但我不知道如何绕过ioloop和KeyboardInterrupt。我想我只是不确定如何在没有所有这些尝试/排除的情况下让我的代码继续运行...而且,不确定如何通过所有回调传递我的消息...

感谢任何帮助!

感谢。

2 个答案:

答案 0 :(得分:0)

整个事情都是回调驱动的,因为这是一种异步的做事方式。异步使用者很容易理解,我们可以通过提供回调函数来获取消息。但是,至少对于初学者来说,发布者的部分有点难以理解。

通常,我们需要一个队列来进行通信,发布者会定期从中获取数据。

使用SelectConnection的关键是将发布消息功能注册到事件循环中,这可以由connection.add_timeout完成。完成发布后,注册下一轮发布。

下一个问题是在哪里进行初始注册。初始注册可以在通道打开的回调中完成。

下面是一个代码片段,可以帮助您更好地理解。请注意,该产品尚未投入生产。因为它仅以每秒10条的最大速度发布消息。您需要调整发布间隔,并在回叫时发布更多消息。

class MQ(Object):
    def __init___(self, queue):
        self.queue = queue
    def on_channel_open(self, chn):
        self.channel = chn
        self.connection.add_timeout(0.1, self.schedule_next_message)
    def schedule_next_message(self):
        try:
            msg = self.queue.get(True, 0.01)
            self.channel.basic_publish('YOUR EXCHANGE','YOUR ROUTING KEY',msg)
        catch Queue.Empty:
            pass
        self.connection.add_timeout(0.1, self.schedule_next_message)
    def on_open(self, conn):
        self.connection = conn
        self.connection.channel(on_open_callback=self.on_channel_open)
    def run(self):
        # create a connection
        self.connection = pika.SelectConnection(pika.ConnectionParameters(heartbeat=600,host=args.mq_ip),self.on_open)
        try:
            self.connection.ioloop.start()
        except Exception:
            print "exception in publisher"
            self.connection.close()
            self.connection.ioloop.start()

将MQ(queue).run()放在单独的线程中,每当您要将消息放入mq时,只需将其放入队列对象即可。

答案 1 :(得分:-2)

作为第一种方法,我建议您从帖子末尾提供的这个pub / sub示例开始。一旦理解了这个简单的示例,就开始按照最后代码块之前提供的教程进行操作。该教程有6个不同的用例,带有python示例。通过5个第一步,您将了解其工作方式。您应该清楚交换的概念(将消息路由到每个队列的实体),绑定密钥(用于连接交换和队列的密钥),路由密钥(与发布者发送的消息一起发送的密钥)交换机用于将消息路由到一个或另一个队列)和队列(可以存储消息的缓冲区,可以有多于1个(或者如果需要的话)1个用户,并且可以从多个交换机获取消息并且基于不同的绑定密钥)。此外,还有不止一种类型的交换(扇出,主题(这可能是你需要的那个)......)。

如果这听起来很新,请遵循RabbitMQ提供的教程:

https://www.rabbitmq.com/tutorials/tutorial-one-python.html

pub.py:

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
    host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

channel.basic_publish(exchange='',
                  routing_key='hello',
                  body='Hello World!')
print " [x] Sent 'Hello World!'"
connection.close()

sub.py:

#!/usr/bin/env python
import pika

connection = pika.BlockingConnection(pika.ConnectionParameters(
    host='localhost'))
channel = connection.channel()

channel.queue_declare(queue='hello')

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

def callback(ch, method, properties, body):
    print " [x] Received %r" % (body,)

channel.basic_consume(callback,
                  queue='hello',
                  no_ack=True)

channel.start_consuming()