🍁 作者:知识浅谈,CSDN签约讲师,CSDN博客专家,华为云云享专家,阿里云专家博主 📌 擅长领域:全栈工程师、爬虫、ACM算法
(🤞Spring Boot集成RabbitMQ的使用🤞)
🎈引言
RabbitMQ是一个开源的消息代理和队列服务器,用来实现各个应用服务间的数据共享(跨平台,跨语言)。RabbitMQ是使用Erlang语言编写的,并且基于AMQP协议实现。它适用于需要低延迟、高吞吐量的消息传递场景,如金融交易、事件驱动架构等。Spring Boot提供了spring-boot-starter-amqp组件,使得与RabbitMQ的集成变得简单快捷。本文将详细介绍如何在Spring Boot项目中集成RabbitMQ,并实现消息的发送与接收。
🎈引入依赖
首先,在Spring Boot项目的pom.xml文件中引入RabbitMQ的依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
<version>3.2.7</version> <!-- 请根据实际情况调整版本号 -->
</dependency>
🎈配置RabbitMQ
在application.yml或application.properties配置文件中配置RabbitMQ的连接信息。
spring:
rabbitmq:
host: 127.0.0.1
port: 5672
username: guest
password: guest
🎈交换机、队列和绑定
RabbitMQ中的核心组件包括交换机(Exchange)、队列(Queue)和绑定(Binding)。交换机根据路由键(Routing Key)将消息路由到不同的队列中。在Spring Boot项目中,可以通过配置类来声明交换机、队列和它们之间的绑定关系。
📍声明交换机和队列
@Configuration
public class RabbitMQConfig {
// 声明队列
@Bean
public Queue queue1() {
return new Queue("queue1", true); // 第二个参数表示是否持久化
}
@Bean
public Queue queue2() {
return new Queue("queue2", true);
}
// 声明交换机
@Bean
public DirectExchange directExchange() {
return new DirectExchange("directExchange");
}
// 队列绑定到交换机
@Bean
public Binding binding1() {
return BindingBuilder.bind(queue1()).to(directExchange()).with("routeKey1");
}
@Bean
public Binding binding2() {
return BindingBuilder.bind(queue2()).to(directExchange()).with("routeKey2");
}
}
📍发送消息
在Spring Boot中,可以使用AmqpTemplate来发送消息。
@Autowired
private AmqpTemplate rabbitTemplate;
public void sendMessage(String routingKey, String message) {
rabbitTemplate.convertAndSend("directExchange", routingKey, message);
}
📍接收消息
通过@RabbitListener注解来监听队列中的消息。
@Component
public class MessageListener {
@RabbitListener(queues = "queue1")
public void listenQueue1(String message) {
System.out.println("Received from queue1: " + message);
}
@RabbitListener(queues = "queue2")
public void listenQueue2(String message) {
System.out.println("Received from queue2: " + message);
}
}
🎈消息类型
RabbitMQ支持多种消息类型,主要通过交换机来区分。常见的交换机类型有:
- Direct Exchange(直连型交换机):通过完全匹配路由键来分发消息。
- Fanout Exchange(扇型交换机):将消息广播到所有绑定的队列。
- Topic Exchange(主题交换机):通过模式匹配路由键来分发消息。
🎈消息确认
在RabbitMQ中,消息的确认分为发送确认和消费确认。
📍 发送确认
发送确认可以确保消息被成功发送到RabbitMQ服务器。在Spring Boot中,可以通过配置RabbitTemplate的confirmCallback来实现。
📍消费确认
消费确认可以确保消息被消费者正确消费。在Spring Boot中,可以通过设置@RabbitListener的acknowledgeMode为MANUAL来实现手动确认。
@RabbitListener(queues = "queue1", acknowledgeMode = "MANUAL")
public void listenQueue1(String message, Channel channel, Message message1) throws IOException {
try{
System.out.println("Received from queue1: " + message);
// 业务处理逻辑
// 消息处理完毕后手动确认
channel.basicAck(message1.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
// 如果处理过程中出现异常,可以选择重新入队或拒绝消息
// 重新入队
// channel.basicNack(message1.getMessageProperties().getDeliveryTag(), false, true);
// 拒绝消息
// channel.basicReject(message1.getMessageProperties().getDeliveryTag(), false);
// 这里仅做异常打印处理
e.printStackTrace();
}
}
🎈消息序列化
在RabbitMQ中,消息需要被序列化成字节流才能发送,接收方需要反序列化才能读取。Spring Boot的spring-boot-starter-amqp默认使用Java序列化,但这种方式不推荐用于生产环境,因为它会导致跨语言或跨版本的不兼容问题。可以使用JSON序列化方式替代,通过自定义MessageConverter来实现。
@Configuration
public class RabbitConfig {
@Bean
public MessageConverter jsonMessageConverter() {
return new Jackson2JsonMessageConverter();
}
// 确保自定义的MessageConverter被RabbitTemplate使用
@Bean
public RabbitTemplate rabbitTemplate(ConnectionFactory connectionFactory, MessageConverter jsonMessageConverter) {
RabbitTemplate template = new RabbitTemplate(connectionFactory);
template.setMessageConverter(jsonMessageConverter);
return template;
}
}
🎈监控与管理
RabbitMQ提供了管理界面(RabbitMQ Management Plugin),通过它可以方便地查看交换机、队列、消息、连接等信息。确保在RabbitMQ服务器上启用了该插件。
🎈注意事项
确保RabbitMQ服务器运行正常,并且Spring Boot应用能够成功连接到RabbitMQ服务器。 处理好消息的确认机制,确保消息的可靠传输。 在生产环境中,考虑使用更健壮的序列化方式,如JSON。 注意RabbitMQ的性能调优,如调整队列的持久化策略、内存和磁盘的使用等。
🍚总结
Spring Boot与RabbitMQ的集成提供了强大的消息传递能力,可以方便地实现服务间的解耦和异步通信。通过合理的配置和使用,可以充分发挥RabbitMQ的优势,提升应用的性能和可靠性。 大功告成,撒花致谢🎆🎇🌟,关注我不迷路,带你起飞带你富。 作者:码海浮生