1.消息确认消费

1. 生产者端发消息时,加参数
properties=pika.BasicProperties(
delivery_mode=2, # make message persistent
), 2. 消费者端,消息处理完毕时,发送确认包
ch.basic_ack(delivery_tag=method.delivery_tag) 生产者端:
import pika credentials = pika.PlainCredentials('qqc', '123') parameters = pika.ConnectionParameters(host='127.0.0.1',credentials=credentials)
connection = pika.BlockingConnection(parameters) channel = connection.channel() #队列连接通道 #声明queue
channel.queue_declare(queue='hello_one',durable=True ) # durable==True 队列持久化 channel.basic_publish(exchange='',
routing_key='hello_one', #路由
properties = pika.BasicProperties (
delivery_mode= 2 , # 将消息持久化
),
body='Hello World') print(" [x] Sent 'Hello World!'") connection.close() 消费者端:
import pika
import time credentials = pika.PlainCredentials ('qqc','123') parameters = pika.ConnectionParameters (host='localhost',credentials =credentials )
connection = pika.BlockingConnection (parameters ) # 队列连接通道
channel = connection .channel() def callback(ch,method,properties,body):
'''
:param ch: 通道
:param method: 请求方法
:param properties: 消息参数
:param body: 消息内容
:return:
'''
print("[x] received %r" % body,method )
time.sleep(10)
print('msg handle done...',body) # 消费者处理完毕向服务端返回确认包,清除队列消息
ch.basic_ack(delivery_tag= method .delivery_tag) # 取信息
channel.basic_consume('hello_one',
callback, # 取到消息后调用callback
#no_ack=True # 消息处理后,不向rabbit-server确认消息已消费完毕
)
print('[*] waiting for messages. To exit press CTRL+C') # 阻塞模式
channel .start_consuming()

2. 公平分发

消费者端
channel.basic_qos(prefetch_count=1) 代码:
import pika
import time credentials = pika.PlainCredentials ('qqc','123') parameters = pika.ConnectionParameters (host='localhost',credentials =credentials )
connection = pika.BlockingConnection (parameters ) # 队列连接通道
channel = connection .channel() def callback(ch,method,properties,body):
'''
:param ch: 通道
:param method: 请求方法
:param properties: 消息参数
:param body: 消息内容
:return:
'''
print("[x] received %r" % body,method )
# time.sleep(10)
print('msg handle done...',body) # 消费者处理完毕向服务端返回确认包,清除队列消息
ch.basic_ack(delivery_tag= method .delivery_tag) # 公平分发
channel.basic_qos(prefetch_count=1) # 取信息
channel.basic_consume('hello_one',
callback, # 取到消息后调用callback
#no_ack=True # 消息处理后,不向rabbit-server确认消息已消费完毕
)
print('[*] waiting for messages. To exit press CTRL+C') # 阻塞模式
channel .start_consuming()

3. exchange

exchange type
fanout = 广播
direct = 组播
topic = 规则播
header =

3.1 fanout

生产者:
import pika
import sys
credentials = pika.PlainCredentials('qqc', '123') parameters = pika.ConnectionParameters(host='127.0.0.1',credentials=credentials)
connection = pika.BlockingConnection(parameters) channel = connection.channel() #队列连接通道 channel .exchange_declare(exchange= 'logs',exchange_type='fanout') message = ' '.join(sys.argv[1:]) or "info: Hello world" # 打印跟的参数 # 绑定exchange的所有队列都收到消息
channel .basic_publish(exchange= 'logs',
routing_key= '',
body =message )
print(" [x] Sent %r" % message) connection.close() '''
微博应用
发一个动态,关注的好友被推送,没有登陆的好友不推送
''' 消费者:
import pika
import time credentials = pika.PlainCredentials ('qqc','123') parameters = pika.ConnectionParameters (host='localhost',credentials =credentials )
connection = pika.BlockingConnection (parameters ) # 队列连接通道
channel = connection .channel() channel .exchange_declare(exchange='logs',exchange_type='fanout') #不指定queue名字,rabbit会随机分配一个名字
# exclusive=True会在使用此queue的消费者断开后,自动将queue删除
queue_obj = channel .queue_declare(queue='',exclusive= True) queue_name = queue_obj .method.queue
print('queue name',queue_name,queue_obj ) # 绑定队列都exchange
channel .queue_bind(exchange= 'logs',queue=queue_name) print(' [*] Waiting for logs. To exit press CTRL+C') def callback(ch,method,properties,body):
print(body) # 阻塞模式
channel .start_consuming()

3.2 direct

发布者:
import pika
import sys
credentials = pika.PlainCredentials('qqc', '123') parameters = pika.ConnectionParameters(host='127.0.0.1',credentials=credentials)
connection = pika.BlockingConnection(parameters) channel = connection.channel() #队列连接通道 channel .exchange_declare(exchange= 'direct_logs',exchange_type='direct') log_level =sys.argv[1] if len(sys.argv)> 1 else 'info'
message = ' '.join(sys.argv[1:]) or "info: Hello world" # 打印跟的参数 channel .basic_publish(exchange= 'logs',
routing_key= log_level ,
body =message )
print(" [x] Sent %r" % message) connection.close() # python3 P_direct.py info hello 在info上发消息 订阅者:
import pika
import time
import sys
credentials = pika.PlainCredentials ('qqc','123') parameters = pika.ConnectionParameters (host='localhost',credentials =credentials )
connection = pika.BlockingConnection (parameters ) # 队列连接通道
channel = connection .channel() channel .exchange_declare(exchange='logs',exchange_type='fanout') #不指定queue名字,rabbit会随机分配一个名字
# exclusive=True会在使用此queue的消费者断开后,自动将queue删除
queue_obj = channel .queue_declare(queue='',exclusive= True) queue_name = queue_obj .method.queue
print('queue name',queue_name,queue_obj ) log_levels = sys.argv[1:] if not log_levels :
sys.stderr .write("Usage: %s [info] [warning] [error]\n" % sys.argv[0])
sys.exit() for level in log_levels :
channel.queue_bind(exchange='logs',
queue=queue_name,
routing_key= level) # 绑定队列到exchange print(' [*] Waiting for logs. To exit press CTRL+C') def callback(ch,method,properties,body):
print(body) channel .basic_consume(queue_name, callback) # 阻塞模式
channel .start_consuming() '''
发布订阅模式
绑定且在线才能收到
''' # python3 .\C_direct.py info 接收info上的消息

3.3 topic

发布者:
import pika
import sys credentials = pika.PlainCredentials('qqc', '123') parameters = pika.ConnectionParameters(host='127.0.0.1',credentials=credentials)
connection = pika.BlockingConnection(parameters) channel = connection .channel() channel.exchange_declare(exchange= 'topic_log',exchange_type='topic') log_level = sys.argv[1] if len(sys.argv) >1 else 'all.info' message = ' '.join(sys.argv[1:]) or 'all.info:Hello World' channel .basic_publish(exchange='topic_log',
routing_key= log_level ,
body = message)
print("[x] Sent %r" %message)
connection .close() 订阅着:
import pika,sys
credentials = pika.PlainCredentials('qqc', '123') parameters = pika.ConnectionParameters(host='127.0.0.1',credentials=credentials)
connection = pika.BlockingConnection(parameters) channel = connection.channel() #队列连接通道
queue_obj = channel .queue_declare(queue = '',exclusive= True )
queue_name = queue_obj.method.queue log_levels = sys.argv[1:] if not log_levels :
sys.stderr .write("User: %s [info] [warning] [error]\n" % sys.argv[0]) for level in log_levels :
channel .queue_bind(exchange= 'topic_log',
queue = queue_name ,
routing_key= level)
print('[*] Waiting for logs.To exit press CTRL+C') def callback(ch,method,properties,body):
print("[x] %r" %body) channel .basic_consume(queue_name ,callback )
channel .start_consuming() 测试:
发布者:
python3 P_topic.py i.mysql.error tttttt 订阅者:
python3 C_topic.py *.mysql.error

4. RPC

RabbitMQ使用(二)的更多相关文章

  1. RabbitMQ(二)

    一.启用 rabbitmq_management 插件(官网提供的 web 版管理工具) cd /usr/sbin rabbitmq-plugins enable rabbitmq_managemen ...

  2. 消息队列的使用 RabbitMQ (二): Windows 环境下集群的实现

    一.RabbitMQ 集群的基本概念 一个 RabbitMQ 中间件(broker) 由一个或多个 erlang 节点组成,节点之间共享 用户名.虚拟目录.队列消息.运行参数 等, 这个 节点的集合被 ...

  3. SpringBoot集成rabbitmq(二)

    前言 在使用rabbitmq时,我们可以通过消息持久化来解决服务器因异常崩溃而造成的消息丢失.除此之外,我们还会遇到一个问题,当消息生产者发消息发送出去后,消息到底有没有正确到达服务器呢?如果不进行特 ...

  4. python使用rabbitMQ介绍二(工作队列模式)

    一模式介绍 第一章节的生产-消费者模式,是非常简单的模式,一发一收.在实际的应用中,消费者有的时候需要工作较长的时间,则需要增加消费者. 队列模型: 这时mq实现了一下几个功能: rabbitmq循环 ...

  5. RabbitMQ (十二) 消息确认机制 - 发布者确认

    消费者确认解决的问题是确认消息是否被消费者"成功消费". 它有个前提条件,那就是生产者发布的消息已经"成功"发送出去了. 因此还需要一个机制来告诉生产者,你发送 ...

  6. Rabbitmq笔记二

    消息何去何从 mandatory 和 immediate 是 channel . basicPublish 方法中的两个参数,它们都有 当消息传递过程中不可达目的地时将消息返回给生产者的功能. 当 m ...

  7. RabbitMQ系列(二)--基础组件

    声明:对于RabbitMQ的学习基于某课网相关视频和<RabbitMQ实战指南>一书,后续关于RabbitMQ的博客都是基于二者 一.什么是RabbitMQ RabbitMQ是开源代理和队 ...

  8. RabbitMq应用二

    在应用一中,基本的消息队列使用已经完成了,在实际项目中,一定会出现各种各样的需求和问题,rabbitmq内置的很多强大机制和功能会帮助我们解决很多的问题,下面就一个一个的一起学习一下. 消息响应机制 ...

  9. RabbitMQ(二) -- Work Queues

    RabbitMQ(一) -- Work Queues RabbitMQ使用Work Queues的主要目的是为了避免资源使用密集的任务,它不同于定时任务处理的方式,而是把任务封装为消息添加到队列中.而 ...

  10. RabbitMQ系列二(构建消息队列)

    从AMQP协议可以看出,MessageQueue.Exchange和Binding构成了AMQP协议的核心.下面我们就围绕这三个主要组件,从应用使用的角度全面的介绍如何利用RabbitMQ构建消息队列 ...

随机推荐

  1. jQuery插件之——弹窗框(模态框)leanModal

    1.首先在网上下载jquery.leanModal.min.js,添加到你的页面参考网址:https://blog.csdn.net/NTDDLIN... LeanModal.js下载地址: http ...

  2. php开发面试题---Apache 运行PHP原理(整理)

    php开发面试题---Apache 运行PHP原理(整理) 一.总结 一句话总结: 不要忘记 php引擎将页面静态化 和 php引擎和apache之间通讯 反思的回顾非常有用,因为决定了我的方向和技巧 ...

  3. STM32 系统架构

    这里所讲的 STM32 系统架构主要针对的 STM32F103 这些非互联型芯片 STM32 主系统主要由四个驱动单元和四个被动单元构成. 四个驱动单元是: 内核 DCode 总线; 系统总线;通用  ...

  4. 72、salesforce call RESTful 的方式

    通过Chrome的Postman 来call salesforce的restful api https://login.salesforce.com/services/oauth2/token?gra ...

  5. 60、saleforce的future方法

    测试future方法的异步执行 public with sharing class FutureSample { //future在自己线程中运行,直到资源可用才运行 @future public s ...

  6. interleave two text files with specified lines

    a_file=$1 a_step=$2 b_file=$3 b_step=$4 a_start=1 let a_end=$a_start+$a_step b_start=1 let b_end=$b_ ...

  7. upc组队赛6 Canonical Coin Systems【完全背包+贪心】

    Canonical Coin Systems 题目描述 A coin system S is a finite (nonempty) set of distinct positive integers ...

  8. 基于MFC的Media Player播放器的制作(1---播放器界面的布局)

    |   版权声明:本文为博主原创文章,未经博主允许不得转载. 通过上面的一些预备知识,我们现在就可以自己来制作基于MFC的播放器了,接下来我们讲的是使用MFC制作我们播放器 的界面. 首先,我们我们打 ...

  9. spark sql数据源--hive

    使用的是idea编辑器 spark sql从hive中读取数据的步骤:1.引入hive的jar包 2.将hive-site.xml放到resource下 3.spark sql声明对hive的支持 案 ...

  10. leetcode.矩阵.766托普里茨矩阵-Java

    1. 具体题目 如果一个矩阵的每一方向由左上到右下的对角线上具有相同元素,那么这个矩阵是托普利茨矩阵.给定一个 M x N 的矩阵,当且仅当它是托普利茨矩阵时返回 True. 示例 1: 输入: ma ...