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 ...
随机推荐
- SpringBoot2.0+Shiro+JWT 整合
SpringBoot2.0+Shiro+JWT 整合 JSON Web Token(JWT)是一个非常轻巧的规范.这个规范允许我们使用 JWT 在用户和服务器之间传递安全可靠的信息. 我们利用一定的编 ...
- CentOS7配置防火墙
使用命令的方式配置 ##Add firewall-cmd --permanent --zone=public --add-port=/tcp ##Remove firewall-cmd --perma ...
- python两个 list 获取交集,并集,差集的方法
1. 获取两个list 的交集 #方法一: a=[2,3,4,5] b=[2,5,8] tmp = [val for val in a if val in b] print tmp #[2, 5] # ...
- 如何用cmd命令递归文件夹中的所有特定文件,拷贝到另一个文件夹中
现在有一个文件夹,里面有很多子文件夹,每个子文件夹中有很多不同类型的图片,现在想将其所有.png图片整理出来,一开始我是手动拷贝的,拷贝了几个图片后,突然想能不能让计算机来自动完成此项功能,经过一番尝 ...
- 【交换机】交换机RLDP(环路检测&链路检测)功能介绍及配置说明
功能简介RLDP 全称是Rapid Link Detection Protocol,是锐捷网络自主开发的一个用于快速检测以太网链路故障的链路协议.一般的以太网链路检测机制都只是利用物理连接的状态,通过 ...
- 在Java路上,我看过的一些书、源码和框架(转)
原文地址:http://www.jianshu.com/p/4a41ee88bd82 物有本末,事有终始,知所先后,则近道矣 面试经历 关于Java面试,你应该准备这些知识点关于Java面试,你应该准 ...
- 系统编码,文件编码,python编码
系统编码,可以通过locale命令查看(LINUX)https://wiki.archlinux.org/index.php/Locale_(简体中文), centos7 配置文件在/etc/prof ...
- github控件地址
地址: https://github.com/wasabeef/awesome-android-ui http://www.jcodecraeer.com/plus/list.php?tid=31 h ...
- DatagramSocket(邮递员):对应数据报的Socket概念,不需要创建两个socket,不可使用输入输出流。
UDP编程: DatagramSocket(邮递员):对应数据报的Socket概念,不需要创建两个socket,不可使用输入输出流. DatagramPacket(信件):数据包,是UDP下进行传输数 ...
- assets下的文件复制到SD卡
由于assets和res下的文件都只可以读不可以写,那么在程序初始化后,将后期需要使用并且需要修改的文件复制到SD卡.下面代码提供一个工具类,将assets下的任意资源复制到SD卡下. assets下 ...