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 实现消息收发
相关推荐
zhougl99611 小时前
Java 枚举类(enum)详解
java·开发语言·python
想七想八不如1140811 小时前
2019机试真题
java·华为od·华为
恋爱绝缘体111 小时前
Java语言提供了八种基本类型。六种数字类型【函数基数噶】
java·python·算法
MX_935912 小时前
使用Spring的BeanFactoryPostProcessor扩展点完成自定义注解扫描
java·后端·spring
弹简特12 小时前
【JavaEE05-后端部分】使用idea社区版从零开始创建第一个 SpringBoot 程序
java·spring boot·后端
1104.北光c°12 小时前
【黑马点评项目笔记 | 登录篇】Redis实现共享Session登录
java·开发语言·数据库·redis·笔记·spring·java-ee
爬山算法12 小时前
Hibernate(81)如何在数据同步中使用Hibernate?
java·后端·hibernate
毕设源码-钟学长12 小时前
【开题答辩全过程】以 基于javaweb的音乐节管理系统为例,包含答辩的问题和答案
java·eclipse
启山智软12 小时前
供应链商城核心功能模块清单
java·前端·开源
是萧萧吖12 小时前
每日一练——有效的括号
java·开发语言·javascript