rabbitmq

消费者(停止自动回复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]# 

 

发布了22 篇原创文章 · 获赞 1 · 访问量 2089
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 书香水墨 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览