rabbitmq python 消费者_python操作rabbitmq,实现生产消费者模型

下载第三方模块pika,版本差异语法差别需指定版本

pip3 install -i https://pypi.douban.com/simple pika==0.13.1

(1)简单的生产者和消费者(无确认无持久化)

生产者producer.py代码

1 importpika2 #创建凭证,使用rabbitmq用户密码登录

3 credentials = pika.PlainCredentials("yang","123456")4 #新建连接到服务器ip

5 connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.160.135',credentials=credentials))6 #创建频道

7 channel =connection.channel()8 #声明一个队列,用于接收消息,队列名字叫“消息队列1”

9 channel.queue_declare(queue='消息队列1')10

11

12 #注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),初学可以使用空字符串交换(exchange=''),它允许我们精确的指定发送给哪个队列(routing_key=''),参数body值发送的数据

13 channel.basic_publish(exchange='',14 routing_key='消息队列1',15 body='没有确认和持久化的消息队列生产者1')16 print("消息队列1已经发送了消息")17 #程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接

18 connection.close()

生产者producer.py代码

执行生产者代码

pyhton3 /opt/rabbitmqtest/producer.py

访问web管理界面,登录,查看队列信息

http://192.168.160.135:15672/

消息队列1      idle      1    0      1     0.00/s

消费者consumer.py代码

1 importpika2 #建立与rabbitmq的连接

3 credentials = pika.PlainCredentials("yang","123456")4 connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.160.135',credentials=credentials))5 channel =connection.channel()6 channel.queue_declare(queue="消息队列1")7

8

9 #定义一个处理消息的回调函数

10 defcallbak(ch,method,properties,body):11 print("消费者接收到了数据:%r"%body.decode("utf8"))12 #有消息来临,立即执行callbak,没有消息则夯住,等待消息

13 channel.basic_consume(callbak,queue="消息队列1",no_ack=True)#no_ack设置是否给消息队列确认处理正常

14 #开始消费,接收消息

15 channel.start_consuming()

消费者consumer.py代码

执行消费者代码

pyhton3 /opt/rabbitmqtest/consumer.py

刷新管理界面,消息队列为空是不在显示此消息队列信息

(2)确认机制的生产者和消费者(无持久化)

生产者producer_ack.py

1 importpika2 #创建凭证,使用rabbitmq用户密码登录

3 credentials = pika.PlainCredentials("yang","123456")4 #新建连接到服务器ip

5 connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.160.135',credentials=credentials))6 #创建频道

7 channel =connection.channel()8 #声明一个队列,用于接收消息,队列名字叫“消息队列2_ack”

9 channel.queue_declare(queue='消息队列2_ack')10

11

12 #注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),初学可以使用空字符串交换(exchange=''),它允许我们精确的指定发送给哪个队列(routing_key=''),参数body值发送的数据

13 channel.basic_publish(exchange='',14 routing_key='消息队列2_ack',15 body='没有持久化的确认机制生产者')16 print("消息队列2_ack已经发送了消息")17 #程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接

18 connection.close()

生产者producer_ack.py

消费者consumer_ack.py

1 importpika2 #建立与rabbitmq的连接

3 credentials = pika.PlainCredentials("yang","123456")4 connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.160.135',credentials=credentials))5 channel =connection.channel()6 channel.queue_declare(queue="消息队列2_ack")7

8

9 #定义一个处理消息的回调函数

10 defcallbak(ch,method,properties,body):11 print("消费者接收到了数据:%r"%body.decode("utf8"))12

13 #在处理完成之后,确认消息发送之前模拟异常错误

14 #int('asd')

15

16 #确认机制的回复信息

17 ch.basic_ack(delivery_tag=method.delivery_tag)18 #有消息来临,立即执行callbak,没有消息则夯住,等待消息

19 channel.basic_consume(callbak,queue="消息队列2_ack",no_ack=False)#消息队列确认机制,需在回调函数进行确认

20 #开始消费,接收消息

21 channel.start_consuming()

消费者consumer_ack.py

回调函数如果在处理之后确认之前发生异常抛错,则消息队列信息不删除,但实际已经处理,所以存在问题,实际认为没有正常处理

(3)持久化确认机制的生产者和消费者

持久化目的:在消息队列运行过程中,防止意外停止服务引起队列消息额丢失,从而进行持久化,重启后仍能看到

生产者producer_ack_durable.py

1 importpika2 #创建凭证,使用rabbitmq用户密码登录

3 credentials = pika.PlainCredentials("yang","123456")4 #新建连接到服务器ip

5 connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.160.135',credentials=credentials))6 #创建频道

7 channel =connection.channel()8 #声明一个队列,用于接收消息,队列名字叫“消息队列_ack_durable”

9 channel.queue_declare(queue='消息队列_ack_durable',durable=True)#durable确保队列持久化

10

11

12 #注意在rabbitmq中,消息想要发送给队列,必须经过交换(exchange),初学可以使用空字符串交换(exchange=''),它允许我们精确的指定发送给哪个队列(routing_key=''),参数body值发送的数据

13 channel.basic_publish(exchange='',14 routing_key='消息队列_ack_durable',15 body='持久化确认机制生产者',16 #支持数据持久化:代表消息是持久的 2

17 properties=pika.BasicProperties(delivery_mode=2,)18 )19 print("消息队列_ack_durable已经发送了消息")20 #程序退出前,确保刷新网络缓冲以及消息发送给rabbitmq,需要关闭本次连接

21 connection.close()

生产者producer_ack_durable.py

消费者consumer_ack_durable.py

1 importpika2 #建立与rabbitmq的连接

3 credentials = pika.PlainCredentials("yang","123456")4 connection = pika.BlockingConnection(pika.ConnectionParameters('192.168.160.135',credentials=credentials))5 channel =connection.channel()6 channel.queue_declare(queue="消息队列3_ack_durable",durable=True)#durable确保队列持久化

7

8

9 #定义一个处理消息的回调函数

10 defcallbak(ch,method,properties,body):11 print("消息队列3_ack_durable消费者接收到了数据:%r"%body.decode("utf8"))12

13 #在处理完成之后,确认消息发送之前模拟异常错误

14 #int('asd')

15

16 #确认机制的回复信息,告诉服务端已经取走数据

17 ch.basic_ack(delivery_tag=method.delivery_tag)18 #有消息来临,立即执行callbak,没有消息则夯住,等待消息

19 channel.basic_consume(callbak,queue="消息队列3_ack_durable",no_ack=False)#消息队列确认机制,需在回调函数进行确认

20 #开始消费,接收消息

21 channel.start_consuming()

消费者consumer_ack_durable.py

你可能感兴趣的:(rabbitmq,python,消费者)