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 实现消息收发
相关推荐
Zsh-cs2 小时前
SpringMVC
java·springmvc
用户8307196840822 小时前
Java 并发进化史:从踩坑到躺赢
java
傻啦嘿哟2 小时前
Python在Excel中创建与优化数据透视表的完整指南
java·前端·spring
uup2 小时前
异常的 “隐藏传递”:finally 中的 return 会吞噬异常?
java
白露与泡影2 小时前
春招 Java 面试大纲:Java+ 并发 +spring+ 数据库 +Redis+JVM+Netty 等
java·数据库·面试
roman_日积跬步-终至千里2 小时前
【多线程】 Spring 无状态 Service 线程安全设计实战
java·安全·spring
Yeniden2 小时前
Deepeek用大白话讲解 --> 状态模式(企业级场景1,自动售货机2,订单状态3,消除if-else4)
java·开发语言·状态模式
Wang's Blog2 小时前
RabbitMQ: 集群网络分区的深度解析之意义、风险与处理策略
网络·分布式·rabbitmq
掉鱼的猫2 小时前
超越 SpringBoot 4.0了吗?OpenSolon v3.8, v3.7.4, v3.6.7 发布
java·spring boot