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 实现消息收发
相关推荐
ch.ju9 小时前
Java程序设计(第3版)第四章——final修饰的方法和类
java·开发语言
摇滚侠9 小时前
云原生 Java 架构师的第一课 K8s+Docker+KubeSphere+DevOps 26-40
java·云原生·kubernetes
认真的酒窝18 小时前
自己动手开发编译器(十一)语义分析
java·开发语言
wbs_scy20 小时前
Linux C++ 高并发编程:线程池全链路深度解析,从原理到手撕实现
java·开发语言
JAVA面经实录91720 小时前
Linux 常用命令完整知识体系
java·linux·开发语言·汇编
Full Stack Developme21 小时前
Java LRU 与 LFU 算法及应用
java·开发语言·算法
程序员老油条1 天前
WSL2 + Docker Desktop:Windows 下的完美 Java 开发环境
java·windows·docker·wsl2
shushangyun_1 天前
2026智能采购商城系统选型指南:如何引领企业数字化采购升级
java·大数据·数据库·人工智能·机器学习
她说..1 天前
Java 默认值设置方式
java·开发语言·后端·springboot
学渣超1 天前
记一次分布式事务数据不一致的排查之旅:从超时到索引,层层剥茧
java·后端·架构