这是我参与2022首次更文挑战的第11天,活动详情查看:2022首次更文挑战」
1. RabbitMQ是什么
1.1 AMQP
认识RabbitMQ之前,先了解一下AMQP是什么。AMQP,Advanced Message Queuing Protocol,即高级消息队列协议,这是一种使用独立语言开发、应用广泛的消息协议,其定义了一种二级制格式的消息流。
基于AMQP协议的客户端可以与中间服务传递消息,任何语言都可以实现该协议并与中间服务通信。
1.2 RabbitMQ
RabbitMQ是一款使用Erlang语言开发的,基于AMQP协议的消息中间件,作为一款优秀的消息系统,RabbitMQ有高并发、可扩展等优势,并适用于大型系统中各个模块之间的通信。
RabbitMQ的特点为:
- 持久化、传输确认、发布确认等功能保证消息可靠
- 支持多种消息分发模式,处理更加灵活
- 提供可视化管理界面,使用方便
- 支持集群部署,保证服务高可用
2. RabbitMQ安装
rabbitmq作为第三方消息队列框架,使用时需要独立安装服务,详细安装流程可以查看相关教程。
- windows下安装rabbitmq
- linux下安装rabbitmq及常见问题 流程可以概括为:
- 安装erlang服务
- 安装rabbitmq,如果是3.9.10及以上版本会自动安装erlang依赖项,可跳过步骤1
- 安装完成启动rabbitmq服务,并使用账户登录后台服务
3. 项目中整合RabbitMQ
3.1 引入依赖信息
Spring Boot中已经对AMQP进行了封装,使用时只需要在项目依赖中引入spring-boot-starter-amqp的启动依赖信息即可。
<!--rabbitmq依赖信息-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
3.2 编辑配置信息
3.2.1 配置文件
引入rabbitmq依赖信息后,还需要在项目的配置文件中设置rabbitmq服务的地址、端口号以及连接服务的账户信息。
# ① rabbitmq配置
spring.rabbitmq.host=127.0.0.1
spring.rabbitmq.port=5672
spring.rabbitmq.username=guest
spring.rabbitmq.password=guest
# ② 直接使用address属性配置
spring.rabbitmq.addresses=amqp://guest:guest@localhost:5672
- 两种方式效果是相同的,可以选择其中一种进行配置
- 第二种方式中,主机地址和端口号为默认
localhost:5672时可以省略 - 生产和消费方都要使用配置,注意默认连接端口号是5672,而不是管理页面的15672
3.2.2 Exchange和Queue配置
使用rabbitmq时,需要先创建Queue作为消息的载体,用来存放生产者产生数据,并供给消费者处理,可以通过管理界面或代码中配置两种方式创建。
- 管理界面配置 rabbitmq服务启动后,使用账户登录管理页面,可以在其中管理rabbitmq中的相关容器组件。
rabbitmq中默认存在7种Exchange,可以在Exchanges标签页内手动添加自定义Exchange。
切换至Queues标签页,可以增加Queue。
对于Exchange和Queue,可以在Exchanges标签页种,点击具体的Exchange名称,使用Routing Key绑定Queue。
绑定完成后,在项目种可以使用Roting Key、Queue名称来指定发送和接收消息内容。
- 项目中声明配置 管理界面属于可视化操作,容易存在人为操作的遗漏问题。可以在代码配置种显示声明Exchange和Queue信息,使用时不存在则自动创建容器。
@Configuration
public class RabbitMQConfig {
/**
* 自定义消息队列
* @return
*/
@Bean
public Queue rabbitmqQueue(){
return new Queue("queue",true,false,false);
}
/**
* 自定义交换机
* @return
*/
@Bean
public DirectExchange rabbitmqDirectExchange(){
return new DirectExchange("directExchange",true,false);
}
/**
* 关联绑定
* @return
*/
@Bean
public Binding bindDirect(){
return BindingBuilder.bind(rabbitmqQueue()).to(rabbitmqDirectExchange()).with("routingKey");
}
}
- 声明队列时使用的是
org.springframework.amqp.core.Queue包中的Queue - 声明容器对象并加入Spring容器,启动时便会在rabbitmq服务中自动创建
- 创建队列和交换机时,传入的参数代表意义为:
- durable,默认false,消息是否持久化,即在无消费者消费时数据存储在内存还是磁盘中
- exclusive,默认false,容i是否只能被当前创建的连接使用,并且关闭后自动删除
- autoDelete,是否自动删除,为true时,当容器不再使用则会自动删除
3.3 生产者产生数据
生产者作为消息的生产方,主要功能就是将数据发送到消息队列中,发送时要指定具体发送的队列名称。
- 需要将3.2.1中的配置内容加入到生产者项目中,用于连接rabbitmq服务
- 使用SpringBoot内置的RabbitTemplate对象完成消息发送
@Autowired
private RabbitTemplate rabbitTemplate;
public void sendMessage2Queue(String message) {
rabbitTemplate.convertAndSend("exchangeName","routingKey",message);
}
- convertAndSend方法将消息message发送到exchangeName交换机,并通过routingKey转发到绑定的queue中
- routingKey值为空字符串时会转发至所有绑定的queue中
3.4 消费者读取数据
消费者作为消费数据的一方,需要对rabbitmq中指定的队列容器进行监听,并在队列中存在数据时进行消费。
- 项目中同样需要加入如3.2.1的rabbitmq连接配置
- 使用@RabbitListener注解类监听指定队列,并使用@RabbitHandler注解方法读取消息数据
@Component
@RabbitListener(queues = {"queueName"})
public class RabbitMQConsumer {
@RabbitHandler
public void consumer(String message){
System.out.println("获取到队列中消息:" + message);
}
}