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 消息支持的完整使用流程,适合入门和进阶使用。

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

相关推荐
小奏技术几秒前
国内APP的隐私进步,从一个“营销授权”弹窗说起
后端·产品
即将进化成人机8 分钟前
Maven架构的依赖管理和项目构建
java·架构·maven
小研说技术18 分钟前
Spring AI存储向量数据
后端
苏三的开发日记18 分钟前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台处于同一台服务器)
后端
苏三的开发日记20 分钟前
jenkins部署ruoyi后台记录(jenkins与ruoyi后台不在同一服务器)
后端
qianmoq23 分钟前
第03章:无限流:generate()和iterate()的神奇用法
java
陈三一25 分钟前
MyBatis OGNL 表达式避坑指南
后端·mybatis
whitepure25 分钟前
万字详解JVM
java·jvm·后端
我崽不熬夜31 分钟前
Java的条件语句与循环语句:如何高效编写你的程序逻辑?
java·后端·java ee
我崽不熬夜1 小时前
Java中的String、StringBuilder、StringBuffer:究竟该选哪个?
java·后端·java ee