使用rabbitmq前需要安装Erlang
1.安装Erlang
下载地址:https://www.erlang.org/downloads
设置环境变量(将安装好的目录添加到系统环境变量中)
检查是否安装成功
在CMD中
像这样的表示已经安装成功。
2.安装rabbitmq
下载地址:http://www.rabbitmq.com/download.html
设置环境变量
j打开CMD,将工作目录切换到D:\rabbitmq\rabbitmq_server-3.8.9\sbin>#这个目录指的是安装rabbitmq的路径。
在cmd中输入rabbitmq-plugins enable rabbitmq_management,检查是否有以下输出。
在浏览器中打开 http://localhost:15672/ 需要设置用户名和密码,默认都为guest。
得到以下页面
当然你也可以打开cmd
在D:\rabbitmq\rabbitmq_server-3.8.9\sbin>中输入 rabbitmqctl.bat list_queues 就可以看到当前的消息队列了。
3.在官网中查看rabbitmq使用方法
在python中
pika官方解释
pika举例
produce端
import pika
connection = pika.BlockingConnection()
channel = connection.channel()
channel.basic_publish(exchange='test', routing_key='test',
body=b'Test message.')
connection.close()
consumer端:
import pika
connection = pika.BlockingConnection()
channel = connection.channel()
for method_frame, properties, body in channel.consume('test'):
# Display the message parts and acknowledge the message
print(method_frame, properties, body)
channel.basic_ack(method_frame.delivery_tag)
# Escape out of the loop after 10 messages
if method_frame.delivery_tag == 10:
break
# Cancel the consumer and return any pending messages
requeued_messages = channel.cancel()
print('Requeued %i messages' % requeued_messages)
connection.close()
pika提供以下适配器
pika.adapters.asyncio_connection.AsyncioConnection-用于Python 3 AsyncIO的I / O循环的异步适配器。
pika.BlockingConnection-库顶部的同步适配器,以方便使用。
pika.SelectConnection-没有第三方依赖性的异步适配器。
pika.adapters.tornado_connection.TornadoConnection-用于Tornado的I / O循环的异步适配器。
pika.adapters.twisted_connection.TwistedProtocolConnection-异步适配器,用于Twisted的I / O循环。
多个连接参数
单个Pika连接适配器实例的单线程使用约束可能会由于使用者中的AMQP心跳超时而导致AMQP /流连接丢失,而消费者花费很长时间来处理传入消息。一种常见的解决方案是将传入消息的处理委托给另一个线程,而连接适配器的线程继续为其I / O循环的消息泵提供服务,从而允许AMQP心跳信号和其他I / O得以及时提供服务。
可能无法直接从该线程直接确认在另一个线程中处理的消息,因为对连接适配器实例的所有访问都必须来自单个线程,该线程是运行适配器的I / O循环的线程。这是通过请求在适配器的I / O循环线程中执行回调来完成的。例如,回调函数的实现可能如下所示:
def ack_message(channel, delivery_tag):
"""Note that `channel` must be the same Pika channel instance via which
the message being acknowledged was retrieved (AMQP protocol constraint).
"""
if channel.is_open:
channel.basic_ack(delivery_tag)
else:
# Channel is already closed, so we can't acknowledge this message;
# log and/or do something that makes sense for your app in this case.
pass
一些RabbitMQ客户端(Bunny,Java,.NET,Objective-C,Swift)提供了一种在网络故障后自动恢复连接,其通道和拓扑(例如队列,绑定和使用者)的方法。其他要求由应用程序代码执行连接恢复,并努力使其变得简单明了。皮卡属于第二类。
Pika支持多个连接适配器。他们采用不同的方法来恢复连接。
对于pika.BlockingConnection适配器,可以使用异常处理来检查连接错误。这是一个非常基本的示例:
import pika
while True:
try:
connection = pika.BlockingConnection()
channel = connection.channel()
channel.basic_consume('test', on_message_callback)
channel.start_consuming()
# Don't recover if connection was closed by broker
except pika.exceptions.ConnectionClosedByBroker:
break
# Don't recover on channel errors
except pika.exceptions.AMQPChannelError:
break
# Recover on all other connection errors
except pika.exceptions.AMQPConnectionError:
continue
4.实操
publish:
import pika
import time
connection=pika.BlockingConnection(pika.ConnectionParameters('localhost'))
channel=connection.channel()
channel.queue_declare(queue="hello")#消息持久化
while True:
channel.basic_publish(exchange='',
routing_key="hello",
properties=pika.BasicProperties(delivery_mode=2),
body="hanks!")
time.sleep(2)
print("send the masagers!")
consume1:
import pika
import time
connection=pika.BlockingConnection(pika.ConnectionParameters("localhost"))
channel=connection.channel()
channel.queue_declare(queue="hello")
def callback(ch,method,properties,body):
#time.sleep(2)
print("收到的消息:",body)
#ch.basic_ack(delivery_tag=method.delivery_tag) # 手动处理
channel.basic_qos(1)
channel.basic_consume('hello',callback)#不关心消息是否处理
print("waiting for masages!")
channel.start_consuming()
consume2:
import pika
import time
connection=pika.BlockingConnection(pika.ConnectionParameters("localhost"))
channel=connection.channel()
channel.queue_declare(queue="hello")#消息持久化
def callback(ch,method,properties,body):
time.sleep(2)
print("收到的消息:",body)#处理消息
#ch.basic_ack(delivery_tag=method.delivery_tag) # 手动处理
channel.basic_consume('hello',callback)#不关心消息是否处理
print("waiting for masages!")
channel.start_consuming()
在cmd中输入 rabbitmqctl.bat list_queues 可以查看队列状态。
或者在本机地址 http://localhost:15672/ 中查看实时队列状态。
如果对我的文章感兴趣,请为我点一个赞,如果有python的知识需要了解或探讨,可以加本人微信:cuiliang1666457052