Rabbit
安装配置参考:https://blog.csdn.net/qq_31634461/article/details/79377256
概念学习参考:https://www.cnblogs.com/ityouknow/p/6120544.html
RabbitMQ的hello world(基于Spring Boot)
1.配置文件
spring.application.name=rabbitMQ spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
2.配置队列
@Configuration
public class RabbitMQConfig { @Bean
public Queue queue() {
//队列名称,后面生产者根据此队列名称发送消息,消费者也监听此名称
return new Queue("hello");
}
}
3.生产者
@Component
public class RabbitMQSender {
//AmqpTemplate接口,spring boot会去实现它
@Autowired
private AmqpTemplate rabbitTemplate; public void send() {
String info = "hello RabbitMQ!";
System.out.println("send:" + info);
//参数"hello"对应队列的名称
rabbitTemplate.convertAndSend("hello", info);
}
}
4.消费者
@Component
@RabbitListener(queues="hello") //监听队列"hello"
public class RabbitMQReceiver {
//调用队列的信息,参数hello既是消费的信息;
@RabbitHandler
public void receive(String hello) {
System.out.println("receive:" + hello);
}
}
5.test
@RunWith(SpringRunner.class)
@SpringBootTest
public class RabbitMqApplicationTests { @Autowired
private RabbitMQSender rabbitMQSender; @Test
public void contextLoads2() {
rabbitMQSender.send();
}
}
结果:
send:hello RabbitMQ!
receive:hello RabbitMQ!
RabbitMQ的四种交换机
交换机的作用是接收消息,并转发到绑定的队列,四种类型:Direct, Topic, Headers and Fanout
Direct
Direct类型的Exchange交换机,在生产者发送消息时,会去严格匹配生产者所绑定的队列queue名称
Topic(最为灵活)
给队列绑定routing_key(路由key),发送消息时,就根据发送消息传回的参数去匹配这个routing_key,然后根据匹配情况把消息分配到对应的消息队列中;
举个例子:
与交换机绑定的queue是 #.abc,生产者发消息当routing_key设置为 any.abc时(这里any可以为任何值),那么这个最终生产者所发的消息都会发送给绑定到 #.abc的队列中去
Headers
生产者发出消息时,无论routing_key设置成什么,这个消息都是根据生产者与队列的headers参数比对结果来判断是否发送消息。
比对的方式,通过在绑定队列时设置头,有两种设置方式:
x-match:all --------------> 表示要头全部匹配上才发送到队列中
x-match:any --------------> 表示要头只要有一个匹配上就发送到队列中
Fanout
生产者发出消息时,无论routing_key设置成什么,这个消息都会被等量复制发送给所有绑定到Fanout类型Exchange的队列queue中去
RabbitMQ死信队列
死信定义
dead-letter,死信,以下几种情况会发生死信并让死信进入死信队列:
1.消费方调用channel.basicNack或者channel.basicReject时,并且requeue参数设置为false
2.消息在队列中存在时间超过TTL(time-to-live)
3.消息超过了队列允许的最大长度;
死信队列需要在配置队列queue时,设置死信队列信息
如何处理死信
1.配置死信队列交换机,死信队列queue,死信队列其实和普通的队列本质上一样,只是可以专门来处理死信而已;
2.为正常队列设置死信队列信息,需要用map设置以下参数:
x-dead-letter-exchange:死信队列交换机
x-dead-letter-routing-key:死信队列routing-key,注意:如果配置了这个参数,那么死信进来之后其routing-key也会替换成这个参数,否则就保留其本身的routing-key
RabbitMQ延迟队列
延迟队列是什么
延迟队列指的是,队列需要在指定时间之后才被消费。
在特有的场景下可以使用延迟队列,例如一些定时通知的业务,可以通过延迟队列实现。
TTL实现延迟队列
首先, TTL 是什么。TTL是英文 time to live 的缩写,就是最大存活时间。在上一节有说到消息队列在队列中存活超过TTL设置的时间之后,会进入死信队列。而延迟队列则正是通过给队列设置TTL过期时间,然后在这个时间过期之后,这个消息成为死信并进入到 死信队列 中。这样就实现了死信队列。
但是,TTL实现延迟队列有以下几个问题:
1.在队列上配置TTL,有不可扩展性,每有一个业务需要不同的TTL就需要一个新的队列来配置,这样不合理。于是,可以在消息本身设置TTL。
2.队列有先入先出的特性,在第一条消息被处理成死信之前,第二条消息无法被处理。例如,队列A先进来,设置了TTL 10秒,随后立刻让队列B进来,设置了TTL 1秒。这个时候会发生这种情况,A队列在被处理成死信之前(需要10秒时间),B队列设置TTL是1秒,理论上来说B队列在1秒之后会被处理成死信,但是,实际上RabbitMQ在处理的时候会先处理A,后面的队列依次等待。于是呢,需要RabbitMQ的延迟队列插件来实现,具体可以看下面的链接和方法。
插件实现延迟队列
首先,在官网下载插件: rabbitmq_delayed_message_exchange ,https://www.rabbitmq.com/community-plugins.html,然后放到其插件目录中再重启即可。
安装成功之后,就可以像上面第2条所说的那样,后入队的B队列1秒之后就被处理成了死信,先入队的A队列在10秒之后被处理成死信,就不存在处理顺序的问题了。
Rabbit的更多相关文章
- 拥抱.NET Core,跨平台的轻量级RPC:Rabbit.Rpc
不久前发布了一篇博文".NET轻量级RPC框架:Rabbit.Rpc",当初只实现了非常简单的功能,也罗列了之后的计划,经过几天的不断努力又为Rabbit.Rpc增加了一大波新特性 ...
- hdu----(1849)Rabbit and Grass(简单的尼姆博弈)
Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- 在 Windows 上安装Rabbit MQ 指南
rabbitMQ是一个在AMQP协议标准基础上完整的,可服用的企业消息系统.他遵循Mozilla Public License开源协议.采用 Erlang 实现的工业级的消息队列(MQ)服务器. Ra ...
- .NET轻量级RPC框架:Rabbit.Rpc
最近准备写一个.NET的管理平台应用在公司,由于存在大量的Client => Server,Server => Client的请求需求在加上之前一直接触了解过RpcClient组件的开发, ...
- 古典问题rabbit
/**古典问题: * 有一对兔子,从出生后第三个月起每个月都生一对兔子, * 小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死, * 问每个月的兔子总数为多少? * 程序分析:兔子的规律为数列: ...
- Error: unable to connect to node rabbit@mail: nodedown
某天,开启一个应用时,发现连接rabbitmq失败,本来想用rabbitmqctl来查看队列,结果提示“Error: unable to connect to node rabbit@mail: no ...
- HDU-4057 Rescue the Rabbit(AC自动机+DP)
Rescue the Rabbit Time Limit: 20000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Othe ...
- .NET 平台下的插件化开发内核(Rabbit Kernel)-转
什么是RabbitHub? RabbitHub 是专门针对 .NET 平台所设计.研发的一套相对完整的插件开发框架,它是由一个内核两大框架多个组件及一系列的开发时支持而构成. RabbitHub 架构 ...
- windows下的php rabbit mq安装、配置
http://www.cnblogs.com/shanyou/p/4067250.html 这篇博文写的rabbit mq和erlang的安装以及rabbitmq可视化插件的一些操作 接下去开始安装P ...
- hdu 1849(Rabbit and Grass) 尼姆博弈
Rabbit and Grass Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
随机推荐
- eclipse安装中文语言包
打开eclipse官网 https://www.eclipse.org/ 选择Projects 搜索框输入:Babel 点击搜索 选择Downloads 根据eclipse启动图画里的版本选择要下载的 ...
- HTTP客户端识别与Cookie机制
HTTP识别用户的几种技巧 承载用户身份信息的HTTP首部 客户端IP地址跟踪,通过用户的IP地址对其进行识别 用户登录,用认证方式识别用户 胖URL,一种在URL中潜入识别信息的技术 cookie, ...
- 与大家分享学习微信小程序开发的一些心得
因为我也才开始学习微信小程序不久,下文也是现在的一时之言,大家有不同的想法也可以在评论里共同交流讨论,希望文章能给大家提供一点点帮助. 最近接触到了一些前端框架,像Vue.js,React,发现小程序 ...
- POC iis短文件名
__author__ = '*'# -*- coding:utf-8 -*- from lib.httpparse import httpparse def verify(protocol,ip,po ...
- 超简单(两步)-微信怎么实现打开外部浏览器,下载app,打开网页URL
现在微信渠道可以说是拉新最快的渠道,因为微信具备强裂变性.但是目前微信对第三方下载链接的拦截是越来越严格了,那么想要在微信内肆无忌惮地推广链接就需要用到微信跳转浏览器的接口,那如何获取该接口呢? ...
- CentOS7虚拟机配置ip地址
首先安装后的虚拟机选NAT模式配置vm的虚拟网络编辑器(vmware中的编辑),NAT模式中查看DHCP的范围,配置子网(写成和电脑一样),在linux中进入/etc/sysconfig/networ ...
- linux io的cfq代码理解
内核版本: 3.10内核. CFQ,即Completely Fair Queueing绝对公平调度器,原理是基于时间片的角度去保证公平,其实如果一台设备既有单队列,又有多队列,既有快速的NVME,又有 ...
- JDK 1.8 sun.misc.Unsafe类CAS底层实现
在java.util.concurrent包下面的很多类为了追求性能都采用了sun.misc.Unsafe类中的CAS操作,从而避免使用synchronized等加锁方式带来性能上的不足. 在sun. ...
- python学习Day13 函数的嵌套定义、global、nonlocal关键字、闭包及闭包的运用场景、装饰器
复习 1.函数对象:函数名 => 存放的是函数的内存地址1)函数名 - 找到的是函数的内存地址2)函数名() - 调用函数 => 函数的返回值 eg:fn()() => fn的返回值 ...
- ApplicationListener接口的生命周期
create:游戏初次创建时被调用,一般在这里创建ApplicationListener对象,初始化布景信息,将数据或UI布局绑定到监听器等,执行完该方法后会执行resize方法,是游戏创建立即执行的 ...