游乐游手机版
首页/AI教程/文章详情

阿里云AMQP SpringBoot集成教程

时间:2026-06-23 15:59
通过实际示例演示阿里云AMQP与SpringBoot的集成过程,核心参数需配置实例信息及资源OwnerID。生产者确认机制中,ReturnCallback在消息不可路由时先于ConfirmCallback触发,正常路由仅触发ConfirmCallback。测试验证了三种消息场景的日志输出。

在微服务架构广泛应用的当下,消息队列已成为系统解耦与异步通信的核心组件。RabbitMQ凭借其高可靠性与灵活的路由特性,持续受到众多开发团队的青睐。而Spring Boot的自动配置能力,更是将RabbitMQ的集成门槛大幅降低。那么,当我们将目光转向阿里云,尝试借助其AMQP服务(即云上RabbitMQ)搭建消息通道时,是否会遇到不同的配置与实现细节?

答案很明确:核心逻辑保持一致,但在具体实施时的参数配置与认证方式确实存在差异。本文将通过一个可实际运行的示例,逐步引导您完成阿里云AMQP与Spring Boot的完整集成。

准备工作:一个可运行的示例程序

任何技术验证,从一份可立即执行的代码入手最为高效。本文提供一个封装好的示例demo,您可以直接上手使用,无需从零搭建项目。

阿里云AMQP Springboot集成

获取代码后,下一步是将您的云上资源集成到该demo中。关键步骤是登录阿里云AMQP管理控制台,获取实例信息。您需要将以下核心参数填入项目的配置文件:

核心资源参数配置: application.properties

spring.application.name=rabbitmq-demo
spring.rabbitmq.host=18********617278.mq-amqp.cn-hangzhou-a.aliyuncs.com
spring.rabbitmq.port=5672
spring.rabbitmq.username=******
spring.rabbitmq.password=******
spring.rabbitmq.virtual-host=******
spring.rabbitmq.template.mandatory=true
spring.rabbitmq.publisher-confirms=true
spring.rabbitmq.publisher-returns=true

请务必注意,在RabbitConfig配置类中还需要指定资源Owner ID。这是容易忽略的关键细节,也正是阿里云AMQP与本地社区版之间的核心差异——权限隔离更为精细。

private static final long RESOURCE_OWNER_ID = 18********617278L; //资源owner账户 ID 信息

代码调整:让测试场景更贴近实际业务

默认示例仅包含“发送未被路由的消息”这一种测试场景。为了使您更全面地理解RabbitMQ的生产者确认机制(ConfirmCallback和ReturnCallback),我们对代码进行了少量调整并添加了注释。当然,如果您只想快速验证整体流程,跳过这一步直接执行测试也完全可行。

生产者核心逻辑:SenderWithCallback.class

核心调整主要涵盖三个场景:

package com.alibaba.rabbit;
// ... (imports)
@Component
public class SenderWithCallback {
    // ...
    public void send() {
        String exchange = "exchange-rabbit-springboot-advance5";
        String routingKey = "product";
        String unRoutingKey = "norProduct";
        
        // 1. 发一条“找不到队列”的消息 (触发ReturnCallback + ConfirmCallback)
        String message = LocalDateTime.now().toString() + "发送一条消息.";
        rabbitTemplate.convertAndSend(exchange, unRoutingKey, message, new CorrelationData("unRouting-" + UUID.randomUUID().toString()));
        log.info("发送一条消息,exchange:[{}],routingKey:[{}],message:[{}]", exchange, unRoutingKey, message);
        
        // 2. 发一条“正常路由”的消息 (仅触发ConfirmCallback)
        rabbitTemplate.convertAndSend(exchange, routingKey, message, new CorrelationData("Routing-" + UUID.randomUUID().toString()));
        log.info("发送一条消息,exchange:[{}],routingKey:[{}],message:[{}]", exchange, routingKey, message);
        
        // 3. 直接向队列发送消息 (测试消费者的正常消费)
        rabbitTemplate.convertAndSend("queue", "test queue message.");
    }
}

这里需要特别留意 RabbitReturnCallbackRabbitConfirmCallback 两个回调类的设计。它们的执行顺序存在明确优先级:当消息成功到达交换机但未匹配到队列时,ReturnCallback 会先被触发,提示“路由失败”,随后 ConfirmCallback 会告知“消息已被服务端接收”。理解这一先后关系,对排查消息丢失问题非常有利。

// RabbitReturnCallback.class - 专注于处理“不可路由”的消息
public class RabbitReturnCallback implements RabbitTemplate.ReturnCallback {
    // ...
    @Override
    public void returnedMessage(Message message, int replyCode, String replyText, String exchange, String routingKey) {
        log.error("message:" + message + ",replyCode:" + replyCode + ",replyText:" + replyText + ",exchange:" + exchange + ",routingKey:" + routingKey);
    }
}

// RabbitConfirmCallback.class - 确认消息是否抵达RabbitMQ服务端
public class RabbitConfirmCallback implements RabbitTemplate.ConfirmCallback {
    // ...
    @Override
    public void confirm(CorrelationData correlationData, boolean ack, String cause) {
        log.error("correlationData:" + correlationData + ",ack:" + ack + ",cause:" + cause);
        // ack为true,代表消息正常接收到了
    }
}

运行测试,观察效果

配置完成后,启动您的Spring Boot应用,并在浏览器中访问以下地址:https://localhost:8080/test/send。您将在控制台看到类似如下的日志输出:

019-06-07 12:42:43.693 INFO 2752 --- [nio-8080-exec-1] com.alibaba.rabbit.SenderWithCallback: 发送一条消息,exchange:[exchange-rabbit-springboot-advance5],routingKey:[norProduct],message:[2019-06-07T12:42:43.612发送一条消息.]
2019-06-07 12:42:43.727 ERROR 2752 --- [124.156.22:5672] com.alibaba.rabbit.RabbitReturnCallback: message:(Body:'2019-06-07T12:42:43.612发送一条消息.' MessageProperties [headers={spring_returned_message_correlation=unRouting-75d1580a-c93d-4d9c-bf06-2ed05ad8e464}, contentType=text/plain, contentEncoding=UTF-8, contentLength=0, receivedDeliveryMode=PERSISTENT, priority=0, deliveryTag=0]),replyCode:312,replyText:NO_ROUTE,exchange:exchange-rabbit-springboot-advance5,routingKey:norProduct
2019-06-07 12:42:43.728 ERROR 2752 --- [124.156.22:5672] c.alibaba.rabbit.RabbitConfirmCallback : correlationData:CorrelationData [id=unRouting-75d1580a-c93d-4d9c-bf06-2ed05ad8e464],ack:true,cause:null
2019-06-07 12:42:43.753 INFO 2752 --- [nio-8080-exec-1] com.alibaba.rabbit.SenderWithCallback: 发送一条消息,exchange:[exchange-rabbit-springboot-advance5],routingKey:[product],message:[2019-06-07T12:42:43.612发送一条消息.]
2019-06-07 12:42:43.891 ERROR 2752 --- [124.156.22:5672] c.alibaba.rabbit.RabbitConfirmCallback : correlationData:CorrelationData [id=Routing-9ee37a35-0f8e-4a0d-b00b-2fc0fab574b4],ack:true,cause:null
2019-06-07 12:42:43.892 ERROR 2752 --- [124.156.22:5672] c.alibaba.rabbit.RabbitConfirmCallback : correlationData:null,ack:true,cause:null
Receiver : test queue message.

这段日志包含丰富的信息,我们来分析一下:

  • 第一条消息(routingKey = norProduct):ReturnCallback 返回了 replyText:NO_ROUTE,紧接着 ConfirmCallbackack:true。这一组合揭示了关键信息:消息虽然到达了阿里云服务端,但由于无匹配队列而被直接丢弃。
  • 第二条消息(routingKey = product):仅触发了 ConfirmCallback,且 ack:true。说明消息成功路由至队列。
  • 第三条消息(直接发给queue):日志末尾的 “Receiver : test queue message.”,表明消费者已正常接收并消费了该消息。

参考链接

若希望更深入理解整个消息确认机制,推荐阅读这篇文章,它将RabbitMQ生产者的消息确认原理阐述得非常清晰:RabbitMQ生产者的消息确认。同时,本文完整的示例代码也可从上方提及的链接中获取。

来源:https://developer.aliyun.com/article/704801
上一篇VITA完整方案轻松处理600MB长视频 下一篇年5款AI纪要工具对比:腾讯会议领衔评测
本站内容用于信息整理与展示,如有侵权或内容问题请及时联系处理。

相关推荐

补充同频道和同主题内容,方便继续浏览更多相关内容。

同类最新

继续查看同栏目最近更新的文章。

更多
Windows Docker Desktop RabbitMQ生产级部署完整指南
AI教程 · 2026-06-29

Windows Docker Desktop RabbitMQ生产级部署完整指南

前言 在 Windows 本地开发环境中,直接安装 RabbitMQ 确实颇为周折:需要单独配置 Erlang 运行环境、手动管理环境变量、服务启停全凭手工操作。更令人困扰的是,版本兼容冲突、端口占用、环境不一致等问题层出不穷。笔者见过不少开发者为搭建环境就得耗费整整半天时间。 相比之下,借助 Do

AI搜索重构制造业采购逻辑的阿里云企业级GEOCMS优化实践
AI教程 · 2026-06-29

AI搜索重构制造业采购逻辑的阿里云企业级GEOCMS优化实践

先分享一个切实感受。过去两年,我们与福建制造企业合作较为频繁,发现一个非常突出的现象:超过80%的企业官网,产品参数仍然存放在PDF或图片中。AI爬虫?根本无法抓取。这些企业技术实力不弱、资质证照齐全、应用案例也丰富,但在AI搜索这一全新战场上,它们几乎处于隐身状态。 一、一个正在发生的行业变化 A

阿里云Token Plan团队版功能价格与省钱购买指南
AI教程 · 2026-06-29

阿里云Token Plan团队版功能价格与省钱购买指南

阿里云百炼近期推出了名为“Token Plan 团队版”的全新服务,这一服务专为企业与开发者量身打造,定位为AI大模型订阅平台。通过引入Credits作为统一计量单位,将文本生成、图像生成等多模态AI能力纳入单一计费体系,同时无缝兼容主流AI编程工具及智能体(Agent)生态系统。其核心亮点包括:全

阿里云物联网.NET Core客户端位置信息上报
AI教程 · 2026-06-29

阿里云物联网.NET Core客户端位置信息上报

阿里云物联网平台的位置服务并非一个完全独立的功能模块。位置信息可包含二维坐标与三维坐标,而位置数据的来源本质上是借助设备属性进行上传。换言之,若要让设备上报位置,您需先将其视为一个普通属性进行处理。 1)添加二维位置数据 操作过程十分简洁。进入数据分析 → 空间数据可视化 → 二维数据,点击添加,将

年阿里云服务器选型配置与网站部署全攻略
AI教程 · 2026-06-29

年阿里云服务器选型配置与网站部署全攻略

2026年,阿里云服务器生态已高度成熟,形成了清晰的轻量应用服务器与ECS云服务器两大产品阵营。无论你是计划搭建个人博客、企业官网,还是运营电商平台、进行应用开发,基本都能找到理想的解决方案。本指南将从服务器选型、配置选择、部署流程到安全运维,系统梳理2026年最实用的操作要点,帮助你少走弯路,让网