Java开发中使用 RabbitMQ 入门到进阶详解(含注解方式、JSON配置)

本文围绕 RabbitMQ 在 Java Spring Boot 中的使用进行讲解,按以下大纲组织:

  1. 快速入门(简单消息发送接收)

  2. Work Queues 工作队列模型

  3. 交换机类型(Fanout、Direct、Topic)

  4. 声明队列和交换机,并绑定(Bean配置方式、注解方式)

  5. 配置 JSON 消息转换器


一、快速入门:简单消息发送与接收

1. 添加依赖

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

2. 配置 RabbitMQ

复制代码
spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

3. 创建队列配置类

复制代码
@Configuration
public class SimpleQueueConfig {
    @Bean
    public Queue simpleQueue() {
        return new Queue("simple.queue", true);
    }
}

4. 发送消息

复制代码
@Autowired
private RabbitTemplate rabbitTemplate;

public void send() {
    rabbitTemplate.convertAndSend("simple.queue", "Hello RabbitMQ");
}

5. 接收消息

复制代码
@RabbitListener(queues = "simple.queue")
public void receive(String message) {
    System.out.println("接收到消息:" + message);
}

二、Work Queues 模型(能者多劳)

多个消费者监听同一个队列,任务会被均匀分配,或根据处理速度差异实现"能者多劳"。

设置 prefetch:每次只处理一条消息

复制代码
spring:
  rabbitmq:
    listener:
      simple:
        prefetch: 1 # 每次只能获取一条消息,处理完成才能获取下一个消息

消费者示例

复制代码
@RabbitListener(queues = "work.queue")
public void consume(String message, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long tag) throws IOException {
    try {
        System.out.println("消费消息:" + message);
        channel.basicAck(tag, false);
    } catch (Exception e) {
        channel.basicNack(tag, false, true);
    }
}

三、交换机类型(Fanout、Direct、Topic)

1. Fanout(广播模式)

无视 routing key,所有绑定的队列都能收到消息。

复制代码
@Bean
public FanoutExchange fanoutExchange() {
    return new FanoutExchange("fanout.exchange");
}

2. Direct(点对点模式)

根据 routing key 精确匹配。

复制代码
@Bean
public DirectExchange directExchange() {
    return new DirectExchange("direct.exchange");
}

3. Topic(通配符匹配)

支持模糊匹配:

  • * 匹配一个单词

  • # 匹配多个单词

    @Bean
    public TopicExchange topicExchange() {
    return new TopicExchange("topic.exchange");
    }

例如:

复制代码
@RabbitListener(queues = "topic.queue")
public void receive(Map<String, Object> msg) {
    System.out.println("[Topic模式] 接收到:" + msg);
}

RoutingKey 绑定:china.# 能匹配 china.newschina.news.weather


四、声明队列与交换机并绑定

Bean 配置方式

复制代码
@Bean
public Queue queue() {
    return new Queue("test.queue");
}

@Bean
public DirectExchange exchange() {
    return new DirectExchange("test.exchange");
}

@Bean
public Binding binding(Queue queue, DirectExchange exchange) {
    return BindingBuilder.bind(queue).to(exchange).with("test.key");
}

注解方式(推荐)

复制代码
@RabbitListener(bindings = @QueueBinding(
        value = @Queue(value = "anno.queue", durable = "true"),
        exchange = @Exchange(value = "anno.exchange", type = ExchangeTypes.DIRECT),
        key = "anno.key"
))
public void listenAnno(String msg) {
    System.out.println("[注解方式] 接收到:" + msg);
}

使用到的注解包括:

  • @RabbitListener: 监听队列

  • @QueueBinding: 定义队列和交换机绑定

  • @Queue: 队列定义

  • @Exchange: 交换机定义


五、配置 JSON 消息转换器

RabbitMQ 默认处理的是字节数组,为了方便发送/接收 JSON,需要配置转换器。

1. 配置 Jackson 转换器

复制代码
@Bean
public MessageConverter jsonMessageConverter() {
    return new Jackson2JsonMessageConverter();
}

@Autowired
private RabbitTemplate rabbitTemplate;

@PostConstruct
public void init() {
    rabbitTemplate.setMessageConverter(jsonMessageConverter());
}

2. 发送 JSON 消息

复制代码
Map<String, Object> data = new HashMap<>();
data.put("name", "张三");
data.put("age", 22);
rabbitTemplate.convertAndSend("test.exchange", "test.key", data);

3. 接收 JSON 消息

复制代码
@RabbitListener(queues = "test.queue")
public void receive(Map<String, Object> msg) {
    System.out.println("接收到JSON消息:" + msg);
}

六、总结

RabbitMQ 是微服务解耦、异步通信中不可或缺的消息中间件。本教程介绍了从快速入门到 WorkQueues、Fanout、Direct、Topic 模式,再到注解绑定与 JSON 消息支持的完整使用流程,适合入门和进阶使用。

欢迎收藏、点赞和评论交流!

相关推荐
code2roc几秒前
SpringBoot整合Milvus向量数据库
数据库·spring boot·milvus·向量化
苏渡苇1 分钟前
Seata 番外篇:使用 docker-compose 部署 Seata Server(TC)及 K8S 部署 Seata 高可用
spring boot·docker·微服务·容器·kubernetes·seata·springcloud
日月云棠1 分钟前
12 Enum —— 枚举类型的底层实现
java·后端
工位植物人2 分钟前
深入理解Java中的类、抽象类、接口与枚举类
后端
用户2181697049303 分钟前
Gin (二) 参数 路由分组
后端
用户925807911486 分钟前
nacos服务注册源码浅析
后端
轻刀快马7 分钟前
从繁琐到极简,从幻象到本质:Spring AOP 架构演进与实战避坑指南
java·spring·架构
weixin_BYSJ19877 分钟前
springboot旅游管理系统04470(附源码+开发文档+部署教程)
java·spring boot·python·算法·django·flask·旅游
8Qi89 分钟前
LeetCode 209. 长度最小的子数组(Minimum Size Subarray Sum)
java·算法·leetcode·双指针·滑动窗口
方也_arkling12 分钟前
【Java-Day12】接口
java·开发语言