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 实现消息收发
相关推荐
杨杨杨大侠3 小时前
都能接模型、RAG 和 MCP,Java Agent 框架到底差在哪?
java
凤山老林3 小时前
Spring Boot 启动冲刺:耗时剖析、懒加载策略与事件驱动初始化优化
spring boot·后端·python
Thinker QAQ4 小时前
并发编程(九):BlockingQueue 与 Channel——语言层的原子性、可见性与有序性
java·python·go·并发编程·channel·blockingqueue·message passing
霸道流氓气质5 小时前
RAG 可观测性与生产监控实战:四层遥测模型、五大仪表盘与 OpenTelemetry 全链路追踪的 Java 生产级实现
java·人工智能·python
AOI小白新手上路5 小时前
autodl常用的tar 打包下载(数据集)命令手册:逐段拆解与套用模板
java·大数据·数据库
dishugj7 小时前
系统架构风险点、敏感点和权衡点的概念和区分
java·开发语言
苜蓿muxu7 小时前
常用代码命名规范
java
马优晨7 小时前
JAVA 中 VO 实体类是什么意思,为什么要做这个
java·开发语言·状态模式·java vo·java vo是什么
Baron X8 小时前
Eclipse Temurin 21 (JRE) Alpine 镜像获取、离线导入与推送操作
java·docker·eclipse·temurin