消费者(停止自动回复ack,手动回复ack)
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(host="10.47.199.130",credentials=pika.credentials.PlainCredentials(
'admin', 'admin')))
channel = connection.channel()
channel.queue_declare(queue='hello')
def callback(ch, method, properties, body):
ch.basic_ack(delivery_tag = method.delivery_tag) ##手动回复ack
channel.basic_qos(prefetch_count=1) ##处理完一条后,mq再发送消费者下一条数据
print(" [x] Received %r" % body)
channel.basic_consume(
queue='hello', on_message_callback=callback, auto_ack=False) ##禁止自动回复ack
print(' [*] Waiting for messages. To exit press CTRL+C')
channel.start_consuming()
自带测试界面
fanout类型Exchang
在fanout类型exchang路由规则非常简单,它会把所有发送到该exchang的消息路由到所有与它绑定的Queue中。
不是简单的将fanout类型exchang中的消息发送到所有的Queue,前提是首先exchang先绑定Queue。在exchang绑定Queue前的消息是全部丢失的,不缓存到Queue中。
auto expire 自动过期
手动将Queue绑定到exchange
命令行查看绑定情况
持久化
可以将Queue,Exchange,Message都设置为可持久化的(durable)
exchang设置持久化 channel.exchange_declare(exchange="jmx1", exchange_type="fanout", durable=False)
将队列queue设置成可持久化 channel.exchange_declare(exchange="jmx1", exchange_type="fanout", durable=True)
生产者:
RabbitMQ消息传递模型的核心思想是,【生产者】不直接发送任何信息到队列。事实上,【生产者】根本就不知道消息是否会被传送到任何队列。
exchange的设置只是发布者/生成者干的事情,发布者/生成者和队列queue没有任何关系,
channel.basic_publish(exchange='jmx', routing_key="Q1", body=message) 在发送端只需要关系exchang的类型和routing_key发往queue的名字
消费者:
假设一个情况:先是生产者已经将消息发送到rabbitmq的exchang,而这时没有消费者消费,也没有任何声明队列。直到新的接收队列生成前,前面的消息都将丢失。由此可以发现消息都是缓存到队列queue中的。
在消费时,
channel.basic_consume(
queue=queue_name, on_message_callback=callback, auto_ack=True)
auto_ack=True时,只可以消费一次,在订阅消息的时候可以指定应答模式,当自动应答等于true的时候,表示当消费者一收到消息就表示消费者收到了消息,消费者收到了消息就会立即从队列中删除。
auto_ack=False时,可以消费多次
消息持久化
使用web界面发送持久化与非持久化消息
接收界面的消息
代码设置发送消息持久化
channel.basic_publish(exchange='jmx', routing_key="", body=message, properties=pika.BasicProperties(delivery_mode=2)) ##在 exchange_type="fanout" 可以忽略routing_key
关机重启后,消息丢失情况
开启web界面(启用插件)
命令:rabbitmq-plugins enable rabbitmq_management ##会生成/etc/rabbitmq/enabled_plugins文件
cat /etc/rabbitmq/enabled_plugins
[rabbitmq_management].
权限
默认情况下rabbitmq有guest用户,不允许在远程登陆。添加以下内容/etc/rabbitmq/rabbitmq.config ,既可以远程web登陆
[root@localhost ~]# vim /etc/rabbitmq/rabbitmq.config
[{rabbit, [{loopback_users, []}]}].
[root@localhost ~]#
新建用户
rabbitmqctl add_user admin admin
rabbitmqctl set_user_tags admin administrator
rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*"
rabbitmqctl list_user_permissions admin
[root@localhost rabbitmq_server-3.7.14]# rabbitmqctl add_user admin admin #新建用户
Adding user "admin" ...
[root@localhost rabbitmq_server-3.7.14]# rabbitmqctl set_user_tags admin administrator #赋于角色
Setting tags for user "admin" to [administrator] ...
[root@localhost rabbitmq_server-3.7.14]# rabbitmqctl list_user_permissions guest #查看默认用户权限
Listing permissions for user "guest" ...
vhost configure write read
/ .* .* .*
[root@localhost rabbitmq_server-3.7.14]# rabbitmqctl list_user_permissions admin #查看新建用户权限,默认全无
Listing permissions for user "admin" ...
[root@localhost rabbitmq_server-3.7.14]# rabbitmqctl set_permissions -p "/" admin ".*" ".*" ".*" ##赋权
Setting permissions for user "admin" in vhost "/" ...
[root@localhost rabbitmq_server-3.7.14]# rabbitmqctl list_user_permissions admin ##查看赋权后的权限
Listing permissions for user "admin" ...
vhost configure write read
/ .* .* .*
[root@localhost rabbitmq_server-3.7.14]#