RabbitMQ之路由键转发消息
RabbitMQ学习
参考:https://www.jianshu.com/p/6b62a0ed2491
消息队列:目前流行的有 Kafka、RabbitMQ、ActiveMQ等
功能:为了解决消息的分布式消费,完成项目、服务之间的解耦动作。消息的生产者与消费者之间完全采用异步通信方式,极大的提高了系统的响应能力,从而提高系统的网络请求吞吐量。
Spring-Boot 整合RabbitMQ
依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
RabbitMQ:跨平台的分布式消息队列服务,可以部署在任意的操作系统上。需要Erlang环境的支持,需要安装Erlang 和 RabbitMQ
RabbitMQ中有三种常用的转发方式:
1.DirectExchange:路由键方式转发消息
2.FanoutExchange:广播方式转发消息
3.TopicExchange: 主题匹配方式转发消息
DirectExchange:消息被生产者发送至RabbitMQ会携带一个路由键Key,RabbitMQ会将该消息转发,只有路由键为Key的队列消费者会完成消息的消费过程。
几个重要的类:
RabbitTemplate.ConfirmCallback:用来回调消息发送成功后的方法,当一个消息被成功写入RabbitMQ服务端时,就会自动回调RabbitTemplate.ConfirmCallback接口内的confirm方法完成通知。
两个配置信息:
队列的交换信息 ExchangeEnum
@Getter
public enum ExchangeEnum {
USER_REGISTER("user.register.topic.exchange");
private
String value;
ExchangeEnum(String value){
this.value = value;
}
}
队列路由信息 QueueEnum
@Getter
public enum QueueEnum { /**
* 用户注册枚举
*/
USER_REGISTER("user.register.queue","user.register"); /**
* 队列名称
*/
private String name; /**
* 队列路由键
*/
private String routingKey; QueueEnum(String name,String routingKey){
this.name = name;
this.routingKey = routingKey;
}
}
用户注册消息队列配置
@Configuration
public class UserRegisterQueueConfiguration { /**
* 配置路由交换对象实例
*/
@Bean
public DirectExchange userRegisterDirectExchange(){
return new DirectExchange(ExchangeEnum.USER_REGISTER.getValue());
} /**
* 配置用户注册队列对象实例
* 并设置持久化队列
*/
@Bean
public Queue userRegisterQueue(){
return new Queue(QueueEnum.USER_REGISTER.getName(),true);
} /**
* 将用户注册队列绑定到路由交换配置上并设置指定路由键进行转发
*
*/
@Bean
public Binding userRegisterBinding(){
return BindingBuilder
.bind(userRegisterQueue()).to(userRegisterDirectExchange()).with(QueueEnum.USER_REGISTER.getRoutingKey());
} }
配置交换实例:
DirectExchange实例对象,为交换设置名称,消息提供者与消息消费者的交换名称必须一致才可以通讯。
配置队列实例:
Queue实例对象,为消息队列设置名称,生产者与消费者的队列名称也必须一致。
绑定队列实例到交换实例中:
Binding实例对象,将Queue绑定到Exchange上,并通过设置的路由key进行消息转发。配置了路由key后,只有符合该路由的配置的消息才会被妆发到绑定的交换上的消息队列。
生产者:
在业务逻辑完成之后,调用消息发送方法,将消息发送至队列中
消费者:
@Component
@RabbitListener(queues = "user.register.queue")
public class UserRegisterMQ { @RabbitHandler
public void execute(UserEntity message){
log.error("用户:"+message.toString()+",注册成功");
}
}
两个注解:
@RabbitListener:队列消息监听注解,该注解配置监听queue内的队列名称列表。
@RabbitHandler 消息处理方法,该方法的参数需要与生产者发送消息的类型保持一致,否则无法自动调用消费方法,且无法完成消费。
本文临摹(抄袭)我的偶像 简书:恒宇少年 Spring-Boot 四十一章。
生产者和消费者是两个不同的项目,关于RabbitMQ的配置信息一模一样,两个项目分别启动,消息可以成功接收。
问题:我将消费者打包发给同事,同事无法启动,我们在同一局域网,但是他本地没有安装RabbitMQ,该问题后续定位。。。。。。。。。
RabbitMQ之路由键转发消息的更多相关文章
- SpringCloud Stream生产者配置RabbitMq的动态路由键
在写这个文章前不得不吐槽目前国内一些blog的文章,尽是些复制粘贴的文章,提到点上但没任何的深入和例子.......... 经过测试下来总结一下RabbitMQ的Exchange的特性: 1.dire ...
- python中RabbitMQ的使用(路由键)
1.简介 当我们希望每个接收端接收各自希望的消息时,我们可以使用路由键,此时交换机的类型为direct. 2.工作原理 每个接收端的消息队列在绑定交换机的时候,可以设定相应的路由键. 发送端通过交换机 ...
- 消息中间件系列三:使用RabbitMq原生Java客户端进行消息通信(消费者(接收方)自动确认模式、消费者(接收方)自行确认模式、生产者(发送方)确认模式)
准备工作: 1)安装RabbitMQ,参考文章:消息中间件系列二:RabbitMQ入门(基本概念.RabbitMQ的安装和运行) 2.)分别新建名为OriginalRabbitMQProducer和O ...
- SpringCloud(六) - RabbitMQ安装,三种消息发送模式,消息发送确认,消息消费确认(自动,手动)
1.安装erlang语言环境 1.1 创建 erlang安装目录 mkdir erlang 1.2 上传解压压缩包 上传到: /root/ 解压缩# tar -zxvf otp_src_22.0.ta ...
- RabbitMQ入门-路由-有选择的接受消息
比如一个日志系统,之前的处理方式呢,是各种类型(info,error,warning)的消息都发给订阅者,可是实际情况上不一定都需要.可能A需要error,其他的都不需要.那么就引入了今天的处理方式- ...
- RabbitMQ 入门系列:3、基础含义:持久化、排它性、自动删除、强制性、路由键。
系列目录 RabbitMQ 入门系列:1.MQ的应用场景的选择与RabbitMQ安装. RabbitMQ 入门系列:2.基础含义:链接.通道.队列.交换机. RabbitMQ 入门系列:3.基础含义: ...
- python中RabbitMQ的使用(路由键模糊匹配)
路由键模糊匹配 使用正则表达式进行匹配.其中“#”表示所有.全部的意思:“*”只匹配到一个词. 匹配规则: 路由键:routings = [ 'happy.work', 'happy.life' , ...
- springboot rabbitmq direct exchange和topic exchange 写法上关于路由键的区别
这是direct exchange写法中消息发送写法,可见下图红色框中路由键是queue队列中定义的路由键 这是topic exchange写法中消息发送写法,可见下图红色框中路由键是exchange ...
- RabbitMQ学习笔记2-理解消息通信
消息包含两部分:1.有效载荷(payload) - 你想要传输的数据.2.标签(lable) - 描述有效载荷的相关信息,包含具体的交换器.消息的接受兴趣方等. rabbitmq的基础流程如下: Ra ...
随机推荐
- Maven中classifier
1.classifier概述 classifier通常用于区分从同一POM构建的具有不同内容的构件(artifact).它是可选的,它可以是任意的字符串,附加在版本号之后. 2.使用场景 场景一:区分 ...
- centos7防火墙iptables开放常用端口
清除所有规则: iptables -F 开放常用tcp端口: iptables -I INPUT -p tcp -m multiport --dports 20,21,22,3690,80,443,4 ...
- Python3爬虫实例 代理的使用
现在爬虫越来越难了,一些网站会有相应的反爬虫措施,例如很多网站会检测某一段时间某个IP的访问次数,如果访问频率太快以至于看起来不像正常访客,它可能就会会禁止这个IP的访问. 所以我们需要设置一些代理服 ...
- ionic ion-tab图标修改, 自定义tab图标
遇到需要自定义tab图标很简单, 只需要自定义相应的css就可以了, 这里要注意的是如何调整背景图片的大小. <ion-view hide-back-button="false&quo ...
- BABLE 原理
1.babel转换原理 2.主要过程 (1)babylon进行解析得到AST (2)babel-traverse插件对AST树进行遍历转译得到新的AST树 (3)babel-generator将AST ...
- SpringBoot乱码
第一步: 第一步,约定好传参编码格式 不管是运用httpclient,还是原生http,都要设置传参的编码,为了统一,这儿全部设置为utf-8 第二步,修正application.properties ...
- PHP异步扩展Swoole笔记(2)
dispatch_mode, 数据包分发策略 可以选择7种类型,默认为21,轮循模式,收到会轮循分配给每一个Worker进程2,固定模式,根据连接的文件描述符分配Worker.这样可以保证同一个连接发 ...
- 分析技术和方法论营销理论知识框架,营销方面4P、用户使用行为、STP,管理方面5W2H、逻辑树、金字塔、生命周期
原文:五种分析框架:PEST.5W2H.逻辑树.4P.用户使用行为 最近在一点点的啃<谁说菜鸟不懂得数据分析>,相当慢,相当的费脑力,总之,真正的学习伴随着痛苦:) 最初拿到这本书的时候, ...
- jmeter 执行python脚本
jmeter 可以通过Jython 执:行python代码 1.下载Jython jar包:http://www.jython.org/downloads.html 2.把下载的Jython 的jar ...
- 怎么让Windows2012和Windows2008多用户同时远程
具体方法请参照百度经验:http://jingyan.baidu.com/article/cd4c2979f19765756e6e60ec.html.经过实践证明,是没有问题的.