SpringBoot--SpringBoot集成RabbitMQ
一、QueueBuilder 概述
- 作用:用于以编程方式构建 RabbitMQ 队列的构建器类。
- 特点 :
- 灵活配置队列属性(持久化、排他、自动删除等)
- 与 Spring AMQP 紧密集成,适用于 Spring Boot 项目
二、常用队列类型与创建方法
| 类型 |
方法 |
说明 |
| 持久化队列 |
QueueBuilder.durable(String name) |
服务器重启后队列和消息不丢失 |
| 非持久化队列 |
QueueBuilder.nonDurable(String name) |
连接关闭后队列可能被自动删除 |
| 排他队列 |
QueueBuilder.exclusive(String name) |
仅创建它的连接可使用,连接关闭后队列删除 |
| 自动删除队列 |
QueueBuilder.autoDelete(String name) |
所有消费者断开或消息消费完后队列自动删除 |
| 带长度限制队列 |
.maxLength(int maxLength) |
设置队列最大消息数量 |
三、使用步骤
1. 引入依赖(Maven)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-amqp</artifactId>
</dependency>
2. 创建队列对象
// 持久化队列
Queue durableQueue = QueueBuilder.durable("queue01").build();
// 非持久化队列
Queue nonDurableQueue = QueueBuilder.nonDurable("myNonDurableQueue").build();
// 带长度限制的队列
Queue limitedQueue = QueueBuilder.durable("myLimitedQueue")
.maxLength(1000)
.build();
四、交换机类型详解
@Configuration
public class RabbitMqConfig {
// Direct Exchange(直连交换机)
@Bean
public DirectExchange directExchange() {
return new DirectExchange("direct.exchange");
}
// Topic Exchange(主题交换机)
@Bean
public TopicExchange topicExchange() {
return new TopicExchange("topic.exchange");
}
// Fanout Exchange(广播交换机)
@Bean
public FanoutExchange fanoutExchange() {
return new FanoutExchange("fanout.exchange");
}
}
五、队列绑定交换机示例
@Configuration
public class RabbitMqConfig {
@Bean
public Queue queue01() {
return QueueBuilder.durable("queue01").build();
}
@Bean
//创建交换机
public DirectExchange exchange01() {
return ExchangeBuilder.directExchange("exchange01").build();
}
@Bean
//绑定交换机和队列
public Binding binding01(DirectExchange exchange, Queue queue) {
return BindingBuilder.bind(queue)
.to(exchange)
.with("yy");
}
}
六、生产与消费消息
简单传递消息
生产者
@Component
public class MessageProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
public void send(String message) {
rabbitTemplate.convertAndSend("myQueue", message);
}
}
消费者
@Component
public class MessageConsumer {
@RabbitListener(queues = "myQueue")
public void receive(String message) {
System.out.println("Received: " + message);
}
}
能够传对象
生产者
@RestController
@RequestMapping("/mq")
public class MessageProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
private Integer id=0;
@GetMapping("/send")
public String send() {
id++;
UserGoods userGoods = new UserGoods(1001,id);
rabbitTemplate.convertAndSend("queue01", userGoods);
return "发送成功";
}
}
消费者
@Component
public class Listener {
// ackMode = "MANUAL" 开启手动反馈
@RabbitListener(queues = "queue01", ackMode = "MANUAL")
public void onMessage(Message message, Channel channel) {
try {
UserGoods userGoods = (UserGoods) SerializationUtils.deserialize(message.getBody());
System.out.println(userGoods.toString());
// 手动反馈
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
} catch (Exception e) {
try {
// 手动反馈
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, true);
} catch (IOException ex) {
throw new RuntimeException(ex);
}
}
}
}
实体类
@Data
@AllArgsConstructor
@ToString
public class UserGoods implements Serializable {
private Integer user_Id;
private Integer goods_Id;
}
使用交换机
生产者
@RestController
@RequestMapping("/mq")
public class MessageProducer {
@Autowired
private RabbitTemplate rabbitTemplate;
private Integer id=0;
@GetMapping("/send")
public String send() {
id++;
UserGoods userGoods = new UserGoods(99,id);
//发送消息 到交换机 exchange01,路由键 yy
rabbitTemplate.convertAndSend("exchange01","yy", userGoods);
return "发送成功";
}
}
消费者同上
七、手动反馈
使用注解
@RabbitListener(queues = "queue01", ackMode = "MANUAL")
在yml配置文件中全局设置
#手动反馈
spring:
listener:
simple:
acknowledge-mode: manual
八、关键点总结
- 使用
QueueBuilder 可灵活构建不同类型的队列
- 队列需通过
@Bean 注册到 Spring 容器
- 队列与交换机通过
BindingBuilder 绑定
- 生产者和消费者通过
RabbitTemplate 和 @RabbitListener 实现消息收发