当前位置: 代码网 > it编程>编程语言>Java > 在Spring Boot中集成RabbitMQ的实战记录

在Spring Boot中集成RabbitMQ的实战记录

2025年06月25日 Java 我要评论
前言在现代微服务架构中,消息队列(message queue)是实现异步通信、解耦系统组件的重要工具。rabbitmq 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。本博客将详细介

前言

在现代微服务架构中,消息队列(message queue)是实现异步通信、解耦系统组件的重要工具。rabbitmq 是一个流行的消息中间件,支持多种消息协议,具有高可靠性和可扩展性。

本博客将详细介绍如何在 spring boot 项目中集成 rabbitmq,包括配置、发送和接收消息的基本流程,并介绍如何通过 两种方式定义交换机(exchange)与队列(queue):一种是在生产者端手动声明,另一种是在消费者端通过注解自动绑定。

准备工作

1. 安装 rabbitmq

可以通过 docker 快速安装 rabbitmq:

docker run -d --hostname my-rabbit --name rabbitmq \
  -p 5672:5672 -p 15672:15672 \
  rabbitmq:3-management
  • 5672:amqp 协议端口
  • 15672:rabbitmq 管理界面端口

访问管理界面:http://localhost:15672
默认账号密码:guest / guest

2. 消息发送者(producer)配置

1. 创建 spring boot 项目

使用 spring initializr 或 ide 的新建项目向导来创建一个新的 spring boot 项目,确保添加以下依赖:

  • spring web
  • spring amqp

2. 配置 rabbitmq 连接信息

application.yml 中配置 rabbitmq 的连接参数:

spring:
  rabbitmq:
    host: localhost
    port: 5672
    username: guest
    password: guest

3. 编写消息发送逻辑

创建一个简单的 rest 控制器来触发消息发送:

@restcontroller
@requestmapping("/api/producer")
public class producercontroller {
    @autowired
    private amqptemplate amqptemplate;
    @getmapping("/send")
    public string sendmessage(@requestparam string message) {
        amqptemplate.convertandsend("my.queue", message);
        return "message sent: " + message;
    }
}

注意:这种方式适用于直接发送到队列的情况,但在实际项目中我们通常会通过 exchange 来路由消息。

3. 使用 exchange 的两种方式

在 rabbitmq 中,消息的流向是:producer → exchange → queue → consumer。因此,定义 exchange 和 queue 并进行绑定是非常关键的步骤。

下面介绍两种常见的定义方式:

方式一:在生产者端手动声明 exchange、queue 和 binding

示例:direct exchange

1. 配置类定义 exchange、queue 及其绑定关系

@configuration
public class rabbitmqconfig {
    @bean
    public directexchange mydirectexchange() {
        return new directexchange("my.direct.exchange");
    }
    @bean
    public queue mydirectqueue() {
        return new queue("my.direct.queue");
    }
    @bean
    public binding bindingdirectqueuetoexchange(queue mydirectqueue, directexchange mydirectexchange) {
        return bindingbuildersupport.bind(mydirectqueue).to(mydirectexchange).with("direct.key").noargs();
    }
}

2. 发送消息时指定 exchange 和 routing key

amqptemplate.convertandsend("my.direct.exchange", "direct.key", message);

这种方式适合需要精细控制队列和交换机的场景,如多服务协同、复杂路由等。

方式二:在消费者端通过注解自动声明 exchange、queue 并绑定

spring 提供了强大的注解功能,可以在消费者监听方法上直接声明 exchange、queue 和绑定关系,无需额外的配置类。

示例:使用 @rabbitlistener 注解绑定

@component
public class consumerlistener {
    @rabbitlistener(bindings = @queuebinding(
        value = @queue(value = "my.annotation.queue", durable = "true"),
        exchange = @exchange(value = "my.annotation.exchange", type = "direct", durable = "true"),
        key = "annotation.key"
    ))
    public void receive(string message) {
        system.out.println("【消费者】收到消息:" + message);
    }
}

优点:开发更高效,特别适合快速搭建原型或小型项目。

注意事项

  • 此方式只在消费者端有效;
  • 如果已有 exchange 或 queue 与注解配置不一致,可能会抛出异常;
  • 建议设置 durable = "true" 实现持久化。

4. 消息消费者(consumer)配置

1. 创建 spring boot 项目

同样地,创建一个新的 spring boot 项目,这次只需要添加 spring amqp 依赖。

2. 配置 rabbitmq 连接信息

与生产者的配置相同,在 application.yml 中配置 rabbitmq 的连接参数。

3. 创建队列并编写消息接收逻辑

方法一:手动定义队列(推荐用于简单场景)

@configuration
public class rabbitmqconfig {
    @bean
    public queue myqueue() {
        return new queue("my.queue");
    }
}

方法二:使用 @rabbitlistener 自动绑定(详见上文)

消息监听器

@component
public class consumerlistener {
    @rabbitlistener(queues = "my.queue")
    public void receive(string message) {
        system.out.println("received message: " + message);
    }
}

注意事项

  • 队列名称一致性:确保生产者和消费者的队列名称一致,这样它们才能正确通信。
  • 网络连通性:如果生产者和消费者运行在不同的机器上,请确保这些机器之间能够通过网络访问 rabbitmq 服务器,并根据需要调整主机名或 ip 地址。
  • 并发处理:考虑在消费者端配置并发消费者以提高消息处理效率。
  • 幂等性与容错机制:建议开启确认机制(ack/nack),避免消息丢失或重复消费。

总结

通过以上步骤,我们就可以拥有两个独立的 spring boot 应用程序:一个用于发送消息,另一个用于消费消息。这种方式非常适合构建基于消息队列的分布式系统。

同时,也了解了两种定义 exchange、queue 及其绑定关系 的方式:

方式适用场景特点
生产者手动声明多服务协作、复杂路由控制精细,结构清晰
消费者注解绑定快速开发、轻量级项目开发效率高,但仅限于消费者端

到此这篇关于在spring boot中集成rabbitmq的完整指南的文章就介绍到这了,更多相关spring boot集成rabbitmq内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com