我正在尝试将我的代码转换为通过Pika发送rabbitmq消息。我在理解如何使用异步连接(例如SelectConnection)发送简单消息时遇到了很多麻烦。
在我使用amqp库的旧代码中,我只是声明一个这样的类:
kAudioFormatMPEG4AAC
然后我的代码中的其他地方我调用sendMQ("这是我的消息"),然后代码继续。我不需要听取确认等。
有人可以使用pika和SelectConnection编写一个简单的类,它也可以使用sendMQ发送消息("这是我的消息")?我看过鼠兔的例子,但我不知道如何绕过ioloop和KeyboardInterrupt。我想我只是不确定如何在没有所有这些尝试/排除的情况下让我的代码继续运行...而且,不确定如何通过所有回调传递我的消息...
感谢任何帮助!
感谢。
答案 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()