SpringBoot--SpringBoot集成RabbitMQ

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)

xml 复制代码
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2. 创建队列对象

java 复制代码
// 持久化队列
Queue durableQueue = QueueBuilder.durable("queue01").build();

// 非持久化队列
Queue nonDurableQueue = QueueBuilder.nonDurable("myNonDurableQueue").build();

// 带长度限制的队列
Queue limitedQueue = QueueBuilder.durable("myLimitedQueue")
                         .maxLength(1000)
                         .build();

四、交换机类型详解

java 复制代码
@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");
    }
}

五、队列绑定交换机示例

java 复制代码
@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");
    }

}

六、生产与消费消息

简单传递消息

生产者
java 复制代码
@Component
public class MessageProducer {
    @Autowired
    private RabbitTemplate rabbitTemplate;

    public void send(String message) {
        rabbitTemplate.convertAndSend("myQueue", message);
    }
}
消费者
java 复制代码
@Component
public class MessageConsumer {
    @RabbitListener(queues = "myQueue")
    public void receive(String message) {
        System.out.println("Received: " + message);
    }
}

能够传对象

生产者
java 复制代码
@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 "发送成功";
    }

}
消费者
java 复制代码
@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);
            }
        }

    }

}
实体类
java 复制代码
@Data
@AllArgsConstructor
@ToString
public class UserGoods implements Serializable {
    private Integer user_Id;
    private Integer goods_Id;
}

使用交换机

生产者
java 复制代码
@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 "发送成功";
    }
}
消费者同上

七、手动反馈

使用注解

java 复制代码
@RabbitListener(queues = "queue01", ackMode = "MANUAL")

在yml配置文件中全局设置

yml 复制代码
#手动反馈
spring:
    listener:
      simple:
        acknowledge-mode: manual

八、关键点总结

  • 使用 QueueBuilder 可灵活构建不同类型的队列
  • 队列需通过 @Bean 注册到 Spring 容器
  • 队列与交换机通过 BindingBuilder 绑定
  • 生产者和消费者通过 RabbitTemplate@RabbitListener 实现消息收发
相关推荐
ZGG0036 分钟前
MySQL 索引详解:B+ 树、聚簇索引与最左前缀
java·数据库·mysql
萧瑟余晖16 分钟前
Java深入解析篇五十四之对象模型详解
java·开发语言
张文是假的啊34 分钟前
Java | record | Controller逻辑
java·开发语言
勿忘,瞬间41 分钟前
Mybatis高阶
java·数据库·mybatis
嘻哈baby2 小时前
Go 函数中的参数为什么不支持默认值?
java·开发语言·jvm
慧都小项2 小时前
MyEclipse 2026:当 Agent、MCP 与 Java 26 进入 Eclipse 工作流
java·eclipse·springboot·copilot·myeclipse
摇滚侠2 小时前
《SpringBoot 3:入门与应用实战》第 14 章 打包与部署 Spring Boot 应用打包 阅读笔记 41
spring boot·笔记·后端
大梦想家a2 小时前
新能源汽车共享充电桩收费管理系统的设计与实现(SpringBoot+MyBatis-Plus+Vue,前后台分离完整源码)
spring boot·汽车·mybatis
CoderYanger3 小时前
前端基础——JavaScript(基础语法)(下篇)
java·开发语言·前端·javascript·程序人生·面试·职场和发展
京师20万禁军教头3 小时前
39面向对象(高级)-设计模式
java·开发语言·设计模式