ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

Amazon Athena Java V2 代码示例:AWS SDK for Java 2.x 的运行与 JUnit 测试实战指南

Amazon Athena Java V2 代码示例:AWS SDK for Java 2.x 的运行与 JUnit 测试实战指南 示例工程教程后端【免费下载链接】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/example_code/athena 目录为起点系统讲解如何基于 AWS SDK for Java 2.x 编写、运行并测试 Amazon Athena 客户端示例涵盖凭证与环境的准备、六个核心示例类的调用链、config.properties测试配置以及使用 Maven 执行 JUnit 5 测试的完整流程。读完本文你将掌握 Athena 命名查询的增删查、查询执行的启动/停止/结果拉取等核心 API 的 Java 实现并能独立搭建可运行的本地测试环境。示例概览目录结构与功能清单javav2/example_code/athena是一个独立的 Maven 项目目录布局如下src/main/java/aws/example/athena/七个主源码文件一个客户端工厂 六个功能示例src/test/java/AmazonAthenaTest.java基于 JUnit 5 的集成测试src/main/resources/config.properties测试运行前必须配置的属性文件pom.xmlMaven 构建配置与依赖管理run_example.sh一键运行示例类的 Shell 脚本metadata.yaml按files → path → services结构登记示例文件与 Athena 服务的对应关系六个功能示例覆盖了 Athena 常用的数据平面操作其底层调用关系可由 metadata.yaml 和源码确认示例类核心 API 操作类型CreateNamedQueryExamplecreateNamedQuery命名查询创建ListNamedQueryExamplelistNamedQueriesPaginator命名查询分页列举DeleteNamedQueryExamplecreateNamedQuerydeleteNamedQuery命名查询删除先建后删ListQueryExecutionsExamplelistQueryExecutionsPaginator查询执行 ID 分页列举StartQueryExamplestartQueryExecution/getQueryExecution/getQueryResultsPaginator提交、轮询、取结果全流程StopQueryExecutionExamplestartQueryExecutionstopQueryExecution取消查询执行运行前置条件凭证、计费与破坏性操作默认凭证提供者示例统一使用default credentials provider默认凭证链不需要在代码中硬编码密钥。推荐通过 AWS 官方文档《Using credentials》了解默认凭证链的查找顺序环境变量、系统属性、~/.aws/credentials配置文件等。重要警示示例会在你凭证所对应的账号与 Region 上执行真实的 Athena 操作运行后可能产生AWS 服务费用。例如执行查询会按扫描的数据量计费请查阅 AWS Pricing 页面了解具体服务的计费规则。破坏性操作其中部分示例如DeleteNamedQueryExample会删除云资源。运行删除/修改类操作时务必格外小心最佳实践是为实验创建独立的、仅供测试使用的资源避免影响生产环境。依赖环境配置运行这些示例你需要用Apache Maven 或 Gradle搭建 AWS SDK for Java 2.x 项目环境详见官方《Get started with the AWS SDK for Java 2.x》指南。本仓库的 pom.xml 展示了关键依赖software.amazon.awssdk:bom:2.35.10通过 BOM 统一管理 SDK 模块版本dependencyManagement导入software.amazon.awssdk:athenaAthena 服务客户端software.amazon.awssdk:sso/ssooidc支持 IAM Identity CenterSSO凭证流程org.junit.jupiter:junit-jupiter:5.11.4JUnit 5 测试框架test scopelog4j-core、slf4j-api、log4j-slf4j2-impl日志实现编译目标为Java 21maven.compiler.source/target21必改配置ExampleConstants注意所有代码示例都依赖 ExampleConstants 中定义的常量运行前必须将其改为适配你环境的真实值常量默认值说明CLIENT_EXECUTION_TIMEOUT100000客户端执行超时毫秒ATHENA_OUTPUT_BUCKETs3://bucketscott2查询结果输出位置必须改成你自己的 S3 桶名ATHENA_SAMPLE_QUERYSELECT * FROM scott2;示例查询语句演示查询一个 CSV 逗号分隔表需匹配你的表名SLEEP_AMOUNT_IN_MS1000查询状态轮询的休眠间隔毫秒ATHENA_DEFAULT_DATABASEmydatabase默认数据库名需改为你实际创建的数据库其中ATHENA_SAMPLE_QUERY查询的表、ATHENA_DEFAULT_DATABASE指定的库需要你按照 Athena 官方《Working with data》文档预先在 AWS Glue 数据目录中建好可在 Athena 控制台通过 CREATE DATABASE / CREATE TABLE 完成。客户端工厂与 RegionAthenaClientFactory 展示了推荐式写法通过AthenaClient.builder()显式指定Region.US_WEST_2并使用ProfileCredentialsProvider.create()读取~/.aws/credentials中的配置文件凭证public class AthenaClientFactory { private final AthenaClientBuilder builder AthenaClient.builder() .region(Region.US_WEST_2) .credentialsProvider(ProfileCredentialsProvider.create()); public AthenaClient createClient() { return builder.build(); } }其余示例类则更简洁直接AthenaClient.builder().region(Region.US_WEST_2).build()后交给默认凭证链解析凭证。两种写法都遵循客户端用完即close()的规范。运行方式一Maven exec 插件与一键脚本本目录提供了 run_example.sh 一键运行脚本其内部逻辑为export CLASSPATHtarget/aws-athena-examples-1.0.jar export className$1 shift mvn exec:java -Dexec.mainClassaws.example.athena.$className -Dexec.args$ -Dexec.cleanupDaemonThreadsfalse用法是传入示例类名可附带该类的命令行参数多个参数放在引号内。例如创建命名查询需要 1 个参数name示例类通过args.length ! 1校验参数个数参数不足时打印 Usage 提示并退出./run_example.sh CreateNamedQueryExample myQueryNameDeleteNamedQueryExample同样接收一个name参数main 中先用getNamedQueryId以同名创建一条命名查询并取得其namedQueryId再调用deleteQueryName删除它——从源码结构看这是为了确保删除操作有确定的目标 ID。六大示例源码解析创建命名查询CreateNamedQueryExample核心方法createNamedQuery(AthenaClient, String name)构造CreateNamedQueryRequest四个字段全部来自ExampleConstants与入参CreateNamedQueryRequest createNamedQueryRequest CreateNamedQueryRequest.builder() .database(ExampleConstants.ATHENA_DEFAULT_DATABASE) .queryString(ExampleConstants.ATHENA_SAMPLE_QUERY) .description(Sample Description) .name(name) .build(); athenaClient.createNamedQuery(createNamedQueryRequest);注意AthenaException被显式捕获并打印堆栈后System.exit(1)这是所有示例统一的异常处理模式。分页列举命名查询ListNamedQueryExample该示例演示了 SDK for Java 2.x 的分页器Paginator用法调用listNamedQueriesPaginator返回ListNamedQueriesIterable用 for-each 遍历自动翻页的响应每页取出namedQueryIds()打印ListNamedQueriesIterable listNamedQueriesResponses athenaClient.listNamedQueriesPaginator(listNamedQueriesRequest); for (ListNamedQueriesResponse listNamedQueriesResponse : listNamedQueriesResponses) { ListString namedQueryIds listNamedQueriesResponse.namedQueryIds(); System.out.println(namedQueryIds); }采用分页器而非手动nextToken循环是避免漏页、简化翻页逻辑的推荐方式。删除命名查询DeleteNamedQueryExample删除前需要目标查询 ID。代码先构造并提交一个同名查询请求从CreateNamedQueryResponse.namedQueryId()拿到 ID再构造DeleteNamedQueryRequest执行删除DeleteNamedQueryRequest deleteNamedQueryRequest DeleteNamedQueryRequest.builder() .namedQueryId(sampleNamedQueryId) .build(); athenaClient.deleteNamedQuery(deleteNamedQueryRequest);分页列举查询执行ListQueryExecutionsExample与列举命名查询对称使用listQueryExecutionsPaginator遍历ListQueryExecutionsIterable逐页取出queryExecutionIds()并打印可用于审计账号内的历史查询执行记录。提交查询并取回结果StartQueryExample这是最完整的示例main 中串联了三个步骤String queryExecutionId submitAthenaQuery(athenaClient); waitForQueryToComplete(athenaClient, queryExecutionId); processResultRows(athenaClient, queryExecutionId);步骤 1 — 提交查询submitAthenaQuery组合三要素QueryExecutionContext.builder().database(...)指定查询所在数据库ResultConfiguration.builder().outputLocation(ATHENA_OUTPUT_BUCKET)指定结果写入的 S3 位置StartQueryExecutionRequest带上queryString后调用startQueryExecution返回queryExecutionId。步骤 2 — 轮询状态waitForQueryToComplete循环调用getQueryExecution读取queryExecution().status().state()FAILED→ 抛出 RuntimeException附带stateChangeReason()错误原因CANCELLED→ 抛出 RuntimeException 提示查询已取消SUCCEEDED→ 退出循环其他状态如QUEUED/RUNNING→Thread.sleep(SLEEP_AMOUNT_IN_MS)后重试。if (queryState.equals(QueryExecutionState.FAILED.toString())) { throw new RuntimeException(The Amazon Athena query failed to run with error message: getQueryExecutionResponse.queryExecution().status().stateChangeReason()); }步骤 3 — 拉取结果processResultRows使用getQueryResultsPaginator遍历GetQueryResultsIterable从每个响应的resultSet().resultSetMetadata().columnInfo()取列元数据、resultSet().rows()取行数据再通过Datum.varCharValue()逐列打印单元格值。源码注释也指出GetQueryResultsRequest不设置 Max Results 时会自动选择最大页大小。停止查询执行StopQueryExecutionExample该示例先submitAthenaQuery发起一条查询获得执行 ID再调用stopQueryExecution请求取消StopQueryExecutionRequest stopQueryExecutionRequest StopQueryExecutionRequest.builder() .queryExecutionId(sampleQueryExecutionId) .build(); athenaClient.stopQueryExecution(stopQueryExecutionRequest);停止后立即调用getQueryExecution复核状态若status().state()等于QueryExecutionState.CANCELLED则打印“The Amazon Athena query has been cancelled!”确认取消成功。这是一种“请求取消 状态确认”的健壮实现模式。JUnit 5 测试AmazonAthenaTest测试入口与属性文件测试文件 AmazonAthenaTest 位于src/test/java文件夹基于JUnit 5。你可以从 Java IDE如 IntelliJ直接运行也可以在命令行用 Maven 运行。测试运行时会打印每条用例的成功/失败信息例如“Test 3 passed”。警告这些 JUnit 测试会操作真实的 AWS 资源运行可能在你的账号上产生费用。测试类使用了 JUnit 5 的两个关键注解TestInstance(TestInstance.Lifecycle.PER_METHOD)每个测试方法独立实例配合BeforeAll中的静态athenaClient共享客户端TestMethodOrder(MethodOrderer.OrderAnnotation.class)Order(1..6)确保六个测试按依赖顺序执行。BeforeAll中通过getClassLoader().getResourceAsStream(config.properties)加载 classpath 下的配置文件用Properties读取nameQuery属性并赋值给静态字段。加载不到文件时会打印 Sorry, unable to find config.properties。config.properties 必须项运行测试前必须在 config.properties位于resources文件夹中定义测试所需的值只要有一项未定义JUnit 测试就会失败。本测试唯一必须项nameQuery—— 一个命名查询的名称。创建类测试用它作为待创建的查询名删除类测试也用它重建同名查询以获得待删 ID。仓库中的默认示例值如下测试前请按需调整注意保持nameQuery与你的 Athena 数据库/查询环境一致因为示例代码内部还会读取ExampleConstants的库名、查询语句与输出桶nameQuery sampleQuery命令行运行在项目根目录执行mvn test命令会触发maven-surefire-plugin:3.5.2运行测试输出形如[INFO] ------------------------------------------------------- [INFO] T E S T S [INFO] ------------------------------------------------------- [INFO] Running AmazonAthenaTest Test 1 passed Test 2 passed ... Done! [INFO] Results: [INFO] [INFO] Tests run: 7, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] -------------------------------------------- [INFO] BUILD SUCCESS [INFO]-------------------------------------------- [INFO] Total time: 12.003 s [INFO] Finished at: 2020-02-10T14:25:08-05:00 [INFO] --------------------------------------------测试用例与示例类的对应关系从 AmazonAthenaTest 源码可以精确还原六个用例与主代码的调用链顺序测试方法调用链1testCreateNamedQueryExampleCreateNamedQueryExample.createNamedQuery(client, nameQuery)2testListNamedQueryExampleListNamedQueryExample.listNamedQueries(client)3testListQueryExecutionsExampleListQueryExecutionsExample.listQueryIds(client)4testDeleteNamedQueryExamplegetNamedQueryId取 ID 后 →deleteQueryName(client, id)5testStartQueryExamplesubmitAthenaQuery→waitForQueryToComplete→processResultRows6testStopQueryExecutionExamplesubmitAthenaQuery→stopAthenaQuery所有用例均以assertDoesNotThrow(...)包裹通过 SLF4J Logger 输出Test N passed因此日志中的“Test 3 passed”即为第三条用例列举查询执行成功的标志。测试失败排错若属性文件中的值不正确JUnit 测试不会通过Maven 构建会失败并输出如下错误实际包名以你项目的 artifactId 为准[INFO] [INFO] -------------------------------------- [INFO] BUILD FAILURE [INFO] -------------------------------------- [INFO] Total time: 19.038 s [INFO] Finished at: 2020-02-10T14:41:51-05:00 [INFO] --------------------------------------- [ERROR] Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.22.1:test (default-test) on project S3J2Project: There are test failures. [ERROR];排错步骤核对 config.properties 中的nameQuery是否已定义且与测试预期一致核对 ExampleConstants 中的数据库名、表名查询语句与输出桶是否真实存在且可写确认凭证对应的 IAM 账号对 Athenaathena:StartQueryExecution、athena:GetQueryResults等和 S3写入结果桶具备足够权限修正后重新执行mvn test。进阶把示例扩展为生产用法从上述源码可以提炼出几个值得复用的工程模式统一异常处理所有示例以try-catch (AthenaException)包裹 API 调用并printStackTrace生产代码建议改为记录日志并抛出业务级异常轮询而非忙等StartQueryExample的SLEEP_AMOUNT_IN_MS 1000毫秒间隔配合状态机判断是 Athena 异步查询的标准等待模式可进一步结合重试退避策略优先使用分页器listNamedQueriesPaginator、listQueryExecutionsPaginator、getQueryResultsPaginator三个分页器消除了手写nextToken的样板代码测试即文档AmazonAthenaTest的Order顺序恰好覆盖了创建 → 列举 → 执行 → 删除/取消的完整生命周期可作为集成测试模板复用到其他 Athena 业务场景。小结javav2/example_code/athena提供了一套麻雀虽小、五脏俱全的 Athena Java V2 参考实现从客户端构建、命名查询增删查到查询提交、状态轮询、结果分页拉取与执行取消再到配套的 JUnit 5 集成测试完整覆盖了 Athena API 的高频使用面。按本文步骤配置好凭证、ExampleConstants与config.properties后即可用mvn test一键验证全部示例并以此为模板快速搭建你自己的 Athena 数据查询服务。赞分享示例工程教程后端【免费下载链接】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点击查看免费下载相关推荐基于 AWS SDK for Java 2.x 的 Amazon API Gateway 实战指南代码示例运行与 JUnit 集成测试基于 AWS SDK for Java 2.x 的 Amazon API Gateway 实战指南代码示例运行与 JUnit 集成测试 本文以 AWS Cod示例工程教程后端AWS SDK for Java 2.x 实战在 aws-doc-sdk-examples 中运行与测试 Amazon MQ 的 Java 示例AWS SDK for Java 2.x 实战在 aws doc sdk examples 中运行与测试 Amazon MQ 的 Java 示例 本文基于 j示例工程教程后端基于 AWS SDK for Java 2.x 的 Amazon GuardDuty 示例源码解析、运行与 JUnit 集成测试指南基于 AWS SDK for Java 2.x 的 Amazon GuardDuty 示例源码解析、运行与 JUnit 集成测试指南 本文以 aws doc示例工程教程后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表