尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

使用 AWS SDK for Java v2 构建处理 Amazon SQS 消息的 React + Spring REST 应用

发布时间:2026/9/26 4:15:14

资讯中心
01
ARTICLE

使用 AWS SDK for Java v2 构建处理 Amazon SQS 消息的 React + Spring REST 应用

使用 AWS SDK for Java v2 构建处理 Amazon SQS 消息的 React + Spring REST 应用
示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载导读本文基于 javav2/usecases/creating_message_application/README.md 教程完整讲解如何用 Spring Boot 编写一个基于AWS SDK for Java v2的 REST API通过Amazon SQS FIFO 队列收发消息并借助Amazon Comprehend自动检测消息语言最终由一个React 单页应用SPA消费这些 REST 接口完成消息的发送、展示与清空。阅读完成后你将掌握 SqsClient 的构建与消息收发、FIFO 队列的消息组与去重 ID 用法、Comprehend 语言检测集成以及前后端联调的完整实战链路。文中的所有代码均可在仓库javav2/usecases/creating_message_application/src/main/java/com/example/sqs/下找到真实实现。应用架构与核心思路教程构建的是一个前后端解耦的消息应用前端是 React 编写的单页应用SPA通过 RESTful 的 GET / POST 请求与后端交互后端是 Spring REST API内部使用software.amazon.awssdk.services.sqs.SqsClient处理消息消息存放在一个FIFO先进先出队列中确保消息读取顺序与写入顺序一致——先入队的消息先被读出每条消息在入队前会经过Amazon Comprehend的detectDominantLanguage接口识别语言代码并将语言代码拼入消息组 IDmessageGroupId实现按语言分组。从上图可以看出请求的完整走向React 客户端发起 HTTP 请求 → Spring REST 端点处理并返回 JSON 数据 → Spring REST 端点对 SQS FIFO 队列执行读写操作。应用的源码实现集中在 SendReceiveMessages.javaSQS 与 Comprehend 操作、MainController.javaHTTP 路由与 MessageData.java数据模型三个类中并可通过 metadata.yaml 查看该用例对 Amazon SQS 服务能力发送、接收、清空队列的映射。前置条件要完整跑通本教程需要准备一个AWS 账户消息相关的服务处于 AWS Free Tier 范围内但运行代码仍可能产生费用请在使用后终止相关资源一个Java IDE教程以 IntelliJ IDEA 为例实际亦可使用任何支持 Maven 的 IDEJava JDK 17见下文的 POM 配置java.version与maven.compiler.source/target均设为 17Maven 3.6 或更高版本AWS 账号凭据配置源码中的客户端均使用ProfileCredentialsProvider.create()读取本地 AWS 配置文件中的默认凭证因此运行前需确保本机已配置好 AWS 凭证如~/.aws/credentials中的 profile。注意代码并未在所有 AWS 区域测试过部分 AWS 服务仅在某些区域可用本教程代码将客户端 Region 固定为Region.US_WEST_2。请在使用前确认你的目标区域支持所用服务并在结束后清理所有创建的资源以免持续产生费用。准备 SQS FIFO 队列与样本数据在 AWS 控制台中创建一个名为Message.fifo的FIFO 队列FIFO 队列名必须以.fifo结尾。在队列详情页选择Send and receive messages逐行输入以下样本数据每行输入完成后点击Send messageMessage bodyMessage group IDMessage deduplication IDMessage AttributesI am going swimming soon11Name:lamthat sounds like fun22Name:scottwould you like to come?33Name:lamsure44Name:scott这些样本数据为后续验证GET /chat/msgs接口的返回结果提供了明确预期每条消息携带一个名为Name的消息属性message attribute后端读取时会通过messageAttributeNames显式请求该属性并解析到MessageData.name字段。应用的消息处理工作流React 应用的核心交互是输入消息内容与用户名后点击Send Message发送同时应用轮询队列并展示新消息。整体处理流程分为 4 步源码对应关系见 MainController.java 与 SendReceiveMessages.java前端将user与message两个值 POST 到 Spring REST 端点Spring 控制器创建一个自定义MessageData对象其中id字段由UUID.randomUUID()生成的 GUID 填充另保存消息文本与用户名控制器将MessageData交给消息服务SendReceiveMessages服务内部通过SqsClient将其写入 FIFO 队列写入前会先用 Comprehend 检测消息语言REST 端点调用消息服务的getMessages方法读取队列中的全部消息返回ListMessageData给 React 前端展示。创建 IntelliJ Maven 项目在 IntelliJ IDEA 中选择File → New → Project在New Project对话框中选择Maven然后点击NextGroupId填写aws-springmessage仓库实际 POM 中为org.example以你本地新建时填写的值为准即可ArtifactId填写AWSMessageRest点击Next与Finish完成项目创建。配置 POM 依赖仓库中 pom.xml 是完整可用的构建配置关键要素如下父工程spring-boot-starter-parent版本2.0.4.RELEASEJava 版本java.version、maven.compiler.target、maven.compiler.source均为17AWS SDK BOM 管理通过software.amazon.awssdk:bom版本2.21.20统一管理 AWS SDK 各模块版本业务依赖只需声明 artifactId 而无需指定版本software.amazon.awssdk:sqs—— Amazon SQS 客户端software.amazon.awssdk:comprehend—— Amazon Comprehend 语言检测software.amazon.awssdk:protocol-core—— AWS SDK 协议层支持Web 依赖spring-boot-starter-web提供 REST 能力与内嵌 Web 服务器测试依赖spring-boot-starter-test排除了 junit-vintage-engine、junit-jupiter系列、assertj-core工具依赖jakarta.mail、commons-io、jxl等构建插件spring-boot-maven-plugin用于打包/运行 Spring Boot 应用。创建 Java 类在src/main/java下新建包com.example.sqs仓库源码即位于javav2/usecases/creating_message_application/src/main/java/com/example/sqs/并创建以下 4 个类MessageData—— 应用的模型类POJOApp—— Spring Boot 启动入口类MainController—— 处理 HTTP 请求的 Spring Boot 控制器SendReceiveMessages—— 使用 Amazon SQS API 处理消息的服务类含 Comprehend 语言检测。MessageData应用数据模型MessageData是承载消息的三字段模型id消息 ID前端展示用、body消息正文、name发送者用户名并提供标准 getter/setter。完整实现见 MessageData.javapackage com.example.sqs; public class MessageData { private String id; private String body; private String name; public String getName() { return this.name; } public void setName(String name) { this.name name; } public String getId() { return id; } public void setId(String id) { this.id id; } public String getBody() { return this.body; } public void setBody(String body) { this.body body; } }AppSpring Boot 启动类App是一个标准 Spring Boot 入口类由SpringBootApplication注解启用自动配置与组件扫描main方法调用SpringApplication.run(App.class, args)启动内嵌 Web 服务器。完整实现见 App.javapackage com.example.sqs; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; SpringBootApplication public class App { public static void main(String[] args) throws Throwable { SpringApplication.run(App.class, args); } }MainControllerHTTP 路由控制器MainController使用CrossOrigin(origins *)开放跨域访问供 React 前端跨端口调用类级映射路径为/chat并通过Autowired注入SendReceiveMessages消息服务。完整实现见 MainController.javaCrossOrigin(origins *) RestController RequestMapping(/chat) public class MainController { Autowired SendReceiveMessages msgService; // 添加一条新消息到 FIFO 队列。 PostMapping(/add) ListMessageData addItems(HttpServletRequest request, HttpServletResponse response) { String user request.getParameter(user); String message request.getParameter(message); // 生成 ID。 UUID uuid UUID.randomUUID(); String msgId uuid.toString(); MessageData messageOb new MessageData(); messageOb.setId(msgId); messageOb.setName(user); messageOb.setBody(message); msgService.processMessage(messageOb); return msgService.getMessages(); } // 清空队列。 RequestMapping(value /purge, method RequestMethod.GET) ResponseBody String purgeMessages(HttpServletRequest request, HttpServletResponse response) { msgService.purgeMyQueue(); return Queue is purged; } // 获取队列中的消息。 RequestMapping(value /msgs, method RequestMethod.GET) ResponseBody ListMessageData getItems(HttpServletRequest request, HttpServletResponse response) { ListMessageData data msgService.getMessages(); return data; } }三个端点各司其职POST /chat/add接收user、message两个查询参数组装MessageData后先写队列再返回全量消息GET /chat/purge清空队列GET /chat/msgs返回队列内全部消息。SendReceiveMessagesSQS 消息收发与语言检测SendReceiveMessages标注为Component是核心服务类。完整实现见 SendReceiveMessages.java仓库源码实际使用ProfileCredentialsProvider.create()读取本地 AWS 凭证配置。其关键设计如下客户端构建SqsClient 与 ComprehendClientprivate SqsClient getClient() { return SqsClient.builder() .region(Region.US_WEST_2) .credentialsProvider(ProfileCredentialsProvider.create()) .build(); } private ComprehendClient getComClient() { return ComprehendClient.builder() .region(Region.US_WEST_2) .credentialsProvider(ProfileCredentialsProvider.create()) .build(); }读取消息getMessages()该方法先通过GetQueueUrlRequest仅按queueName Message.fifo查询队列 URL解析出queueUrl再构建ReceiveMessageRequest读取消息ReceiveMessageRequest receiveRequest ReceiveMessageRequest.builder() .queueUrl(queueUrl) .maxNumberOfMessages(10) // 单次最多取 10 条 .waitTimeSeconds(20) // 长轮询等待 20 秒 .messageAttributeNames(attr) // 显式请求名为 Name 的消息属性 .build();随后遍历返回的Message列表将m.body()正文、m.messageId()消息 ID以及从m.messageAttributes()中取出的Name属性映射进MessageData。这里可以看到消息属性Message Attributes的完整读取方式先在请求里声明要拉取的属性名再从响应的messageAttributes映射中按 key 取值。发送消息并检测语言processMessage(MessageData msg)发送端的关键逻辑是把用户姓名封装成类型为String的消息属性Name然后调用 Comprehend 检测正文语言MessageAttributeValue attributeValue MessageAttributeValue.builder() .stringValue(msg.getName()) .dataType(String) .build(); MapString, MessageAttributeValue myMap new HashMap(); myMap.put(Name, attributeValue); // 用 Comprehend 检测传入消息的语言代码。 ComprehendClient comClient getComClient(); String lanCode ; DetectDominantLanguageRequest request DetectDominantLanguageRequest.builder() .text(msg.getBody()) .build(); DetectDominantLanguageResponse resp comClient.detectDominantLanguage(request); ListDominantLanguage allLanList resp.languages(); for (DominantLanguage lang : allLanList) { System.out.println(Language is lang.languageCode()); lanCode lang.languageCode(); }语言检测结果lanCode被拼接到 FIFO 队列发送请求的messageGroupId中同时用控制器生成的 UUID 作为messageDeduplicationId从而在满足 FIFO 队列“按组保证顺序”的前提下实现按语言对消息分组与 5 分钟窗口内的自动去重SendMessageRequest sendMsgRequest SendMessageRequest.builder() .queueUrl(queueUrl) .messageAttributes(myMap) // 携带 Name 用户属性 .messageGroupId(GroupA_ lanCode) // 语言分组如 GroupA_en .messageDeduplicationId(msg.getId()) // UUID 去重 ID .messageBody(msg.getBody()) .build(); sqsClient.sendMessage(sendMsgRequest);清空队列purgeMyQueue()先查询队列 URL再构建PurgeQueueRequest调用purgeQueue删除队列中的全部消息注意SQS 的 PurgeQueue 操作有 60 秒冷却限制两次调用之间需间隔至少 60 秒。运行 Spring REST API在 IntelliJ 中直接点击App类的运行按钮绿色箭头即可启动 Spring REST API。注意如果你的 8080 端口已被占用请在 IntelliJ 的 Run Configuration 中添加 VM 参数-Dserver.port8082让 Spring 内嵌 Web 服务器改监听 8082 端口。启动后Spring API 提供以下 URLReact 前端将消费这些端点URL方法说明/chat/msgsGET返回队列中的全部消息ListMessageData/chat/addPOST携带user、message参数添加新消息到队列/chat/purgeGET清空队列中的消息说明原 README 中一处文字将 purge 端点误写为/api/purge但仓库中 MainController.java 的实际实现为/chat/purgeReact 端的 AwsService.js 也以/chat/purge为准本文按源码实现整理。验证 API 是否正常工作在浏览器中打开端口按实际启动值调整http://localhost:8080/chat/msgs浏览器会看到形如上图的 JSON 数组每条记录包含id、body、name三个字段对应MessageData模型。创建 React 前端React 前端是一个独立的 Elwing 插件项目位于仓库 resources/clients/react/elwing/src/plugins/sqs-message/其 README.md 包含项目搭建说明。关键文件config.json —— 前端服务配置默认BASE_URL为http://localhost:3000AwsService.js —— 通过 axios 封装与 Java 后端通信的 REST 调用MessageForm.js 与 SqsChatComponent.js —— 消息表单与聊天组件SqsChatComponent.unit.test.js —— 组件单元测试。关键配置将plugins/sqs-message/src/config.json中的BASE_URL替换为启动 Spring 应用时所用的端口例如{ BASE_URL: http://localhost:8082 }BASE_URL决定了 React 应用向后端发起请求的地址务必与 Spring 实际监听端口保持一致。前端与后端联调逻辑AwsService.js 的真实实现import axios from axios; import configData from ./config.json; export const getMessages async () { return await axios.get(${configData.BASE_URL}/chat/msgs); }; export const postMessage async (item) { let user item.username; let message item.message; await axios.post( ${configData.BASE_URL}/chat/add?user user message message ); }; export const purgeMessages async () { await axios.get(${configData.BASE_URL}/chat/purge); };三个函数分别对应后端的三个端点getMessages拉取消息列表、postMessage以查询参数形式提交用户名与消息、purgeMessages清空队列。前端发起的user/message参数正好对应MainController.addItems中request.getParameter(user)与request.getParameter(message)的取值。启动 React 应用后页面形态如下输入消息与用户名后点击Send Message即可发送消息会先经 Spring REST 写入 SQS FIFO 队列再通过轮询读取并展示在消息列表中。收尾与资源清理恭喜至此你已经完成了一个名为 AWS Messaging 的 Spring React 消息应用它借助 AWS SDK for Java v2 将消息写入 SQS FIFO 队列、按语言分组并读取展示。需要再次提醒请务必终止本教程过程中创建的所有 AWS 资源包括Message.fifo队列否则将持续产生费用。该仓库中还有更多多服务multiservice示例可参考例如 javav2/usecases 目录下的其他 Spring 用例如 DynamoDB、RDS、Redshift 相关的 REST 应用。赞分享示例工程教程后端【免费下载链接】aws-doc-sdk-examplesWelcome to the AWS Code Examples Repository. This repo contains code examples used in the AWS documentation, AWS SDK Developer Guides, and more. For more information, see the Readme.md file below.项目地址https://gitcode.com/gh_mirrors/aw/aws-doc-sdk-examples点击查看免费下载相关推荐Spring Boot 与 AWS SDK for Java v2构建 Amazon Aurora Serverless 工作项追踪 REST 应用Spring Boot 与 AWS SDK for Java v2构建 Amazon Aurora Serverless 工作项追踪 REST 应用 本篇以示例工程教程后端使用AWS SDK for Java V2构建异步消息发布订阅Web应用使用AWS SDK for Java V2构建异步消息发布订阅Web应用 概述 本文介绍如何使用AWS SDK for Java V2开发一个具有订阅和发布功能示例工程教程后端使用 AWS SDK for Java v2 构建多语言 Amazon Lex 聊天机器人并集成到 Spring Boot 应用使用 AWS SDK for Java v2 构建多语言 Amazon Lex 聊天机器人并集成到 Spring Boot 应用 导读 本教程基于当前仓库 ja示例工程教程后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。