rabbitmq消息队列

使用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

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

穆穆Max

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值