aws dynamodb_带有AWS DynamoDB的React式Spring Webflux

aws dynamodb

AWS已经发布了Java版本2的AWS开发工具包 ,该开发工具包现在支持针对不同AWS服务的API调用的非阻塞IO。 在本文中,我将探讨如何使用AWS开发工具包2.x的DynamoDB API以及如何使用Spring Webflux堆栈公开响应式端点-这种方式,应用程序是端对端响应式的,大概应该非常有效地使用资源(我有计划在此设置上做一些测试作为后续步骤)。

申请详情

简单地看一下代码并在那儿遵循它可能会更容易-在我的GitHub存储库中可以找到它。

该应用程序很简单-可以对使用以下Kotlin代码表示的酒店实体执行CRUD操作:

data class Hotel(val id: String = UUID.randomUUID().toString(),val name: String? = null,val address: String? = null,val state: String? = null,val zip: String? = null
)

我想公开端点以保存和检索酒店实体,并按州获取酒店列表。

AWS开发工具包2的详细信息

AWS SDK 2 api的所有软件包名称现在都以“ software.amazon.awssdk”前缀开头,使用以下几行代码创建与DynamoDB进行交互的客户端:

import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider
import software.amazon.awssdk.regions.Region
import software.amazon.awssdk.services.dynamodb.DynamoDbAsyncClientval client: DynamoDbAsyncClient = DynamoDbAsyncClient.builder().region(Region.of(dynamoProperties.region)).credentialsProvider(DefaultCredentialsProvider.builder().build()).build()

创建DynamoDbAsyncClient实例后,使用此客户端的任何操作都将返回Java 8 CompletableFuture类型。 例如。 保存酒店实体时:

val putItemRequest = PutItemRequest.builder().tableName("hotels").item(HotelMapper.toMap(hotel)).build()val result: CompletableFuture<PutItemResponse> =dynamoClient.putItem(putItemRequest)

并通过ID检索记录:

val getItemRequest: GetItemRequest = GetItemRequest.builder().key(mapOf(Constants.ID to AttributeValue.builder().s(id).build())).tableName(Constants.TABLE_NAME).build()val response: CompletableFuture<GetItemResponse> = dynamoClient.getItem(getItemRequest)

CompletableFuture提供了一组全面的功能,以在可用时转换结果。

与Spring Webflux集成

Spring Webflux是一个React式Web框架。 现在,借助AWS开发工具包2中的非阻塞IO支持,可以使用DynamoDB编写端到端的响应式和非阻塞应用程序。 Spring Webflux使用React堆核心提供React流支持,与AWS开发工具包2集成的技巧是将Java 8 CompletableFuture转换为React堆核心类型,方法是通过id从DynamoDB检索项目时采用以下方式:

val getItemRequest: GetItemRequest = GetItemRequest.builder().key(mapOf(Constants.ID to AttributeValue.builder().s(id).build())).tableName(Constants.TABLE_NAME).build()return Mono.fromCompletionStage(dynamoClient.getItem(getItemRequest)).map { resp ->HotelMapper.fromMap(id, resp.item())}

Spring Webflux期望不同Web终结点方法签名的返回类型为响应类型,因此,用于说出酒店列表的典型终结点如下:

@RequestMapping(value = ["/hotels"], method = [RequestMethod.GET])
fun getHotelsByState(@RequestParam("state") state: String): Flux<Hotel> {return hotelRepo.findHotelsByState(state)
}

Spring Webflux还支持一种描述应用程序API的功能性方法,因此,一个等效的API可通过其ID来检索酒店,但表示为功能性DSL如下:

@Configuration
class HotelAdditionalRoutes {@Beanfun routes(hotelRepo: HotelRepo) = router {GET("/hotels/{id}") { req ->val id = req.pathVariable("id")val response: Mono<ServerResponse> = hotelRepo.getHotel(id).flatMap { hotel ->ServerResponse.ok().body(BodyInserters.fromObject(hotel))}response.switchIfEmpty(ServerResponse.notFound().build())}}
}

结论

AWS SDK 2使编写端到端的React性和非阻塞性应用程序变得简单。 我已经使用Spring Webflux和AWS SDK 2发电机客户端在此处编写了这样的应用程序。 完整的工作示例可在我的GitHub存储库中找到-https ://github.com/bijukunjummen/boot-with-dynamodb,其中包含有关如何启动DynamoDB本地版本并将其用于测试应用程序的说明。

翻译自: https://www.javacodegeeks.com/2018/12/reactive-spring-webflux-aws-dynamodb.html

aws dynamodb

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/332810.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

centos6.5 rpm安装mysql_CentOS6.5系统下RPM包安装MySQL5.6(转)

1.查看操作系统相关信息。[rootlinuxidc ~]# cat /etc/issueCentOS release 6.5 (Final)Kernel \r on an \m[rootlinuxidc ~]# uname -aLinux linuxidc 2.6.32-431.el6.x86_64 #1 SMP Fri Nov 22 03:15:09 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux2.创建需要下载rpm软件包的目…

对象作为参数示例java_功能Java示例 第6部分–用作参数

对象作为参数示例java这是称为“ Functional Java by Example”的系列文章的第6部分。 我在本系列的每个部分中开发的示例是某种“提要处理程序”&#xff0c;用于处理文档。 在前面的部分&#xff0c;我们试图通过移动尽可能多的副作用&#xff0c;如IO&#xff0c;该系统的外…

为什么Java在后来的版本中,给接口增加了默认方法、静态方法、私有方法?

在业务发展过程中&#xff0c;发现某个功能是所有子类都需要的&#xff0c;那么我们该怎么办&#xff1f;给接口增加抽象方法吗&#xff1f;如果直接在接口增加抽象方法&#xff0c;那么所有已经写好的具体实现类就会报编译错误。因为具体类必须实现接口的全部抽象方法。这样就…

linux 源码包安装mysql_LINUX下源码包安装mysql

tar xvfz mysql-5.1.50-linux-i686-glibc23.tar.gz -C /usr/local/解压到的目录cd /usr/local/[rootdrbd2 local]# ln -sv mysql-5.1.50-linux-i686-glibc23 mysql(创建连接)groupadd mysql 添加mysql的用户组useradd -g mysql mysql 增加mysql用户并把其加入mysql组cd mysql[r…

jdk 安全属性_系统属性的JDK 12 Javadoc标记

jdk 安全属性JDK 12 Early Access Build 20 &#xff08; 2018/11/15 &#xff09;可用&#xff0c;可以用来试用新的Javadoc标签{systemProperty} 。 新的{systemProperty} Javadoc标记在core-libs-dev邮件列表消息“ FYI&#xff1a;用于记录系统属性的新javadoc标记 ”中进行…

Lambda表达式的学习

文章目录函数式编程思想函数式接口Lambda 的使用前提Lambda 的标准格式Lambda 极简特性演示代码函数式编程思想 与面向对象编程思想的区别&#xff1a; 1.面向对象的思想是做一件事情&#xff0c;找一个能解决这个事情的对象&#xff0c;调用对象的方法来完成事情 2.函数式编程…

公证服务信息_使用多个公证员提高网络吞吐量

公证服务信息您是否需要高吞吐量的Corda网络&#xff1f; 网络的吞吐量是否稳定&#xff1f; 您是否已经从其他领域挤出了所有可能的表现&#xff1f; 如果您对这些问题的回答是“是”&#xff0c;那么我可能会为您提供一些有用的信息。 我列出了这些问题&#xff0c;以减少您过…

java判断手机号_java使用正则表达式判断手机号的方法示例

本文实例讲述了java使用正则表达式判断手机号的方法。分享给大家供大家参考&#xff0c;具体如下&#xff1a;要更加准确的匹配手机号码只匹配11位数字是不够的&#xff0c;比如说就没有以144开始的号码段&#xff0c;故先要整清楚现在已经开放了多少个号码段&#xff0c;国家号…

Spring JDBC的学习

文章目录介绍使用步骤常用方法示例代码介绍 所谓 Spring JDBC&#xff0c;是 Spring 框架对 JDBC 的简单封装。提供了一个 JdbcTemplate 对象简化 JDBC 的开发。 使用步骤 步骤&#xff1a; 1.导入相关的 jar 包 2.创建 JdbcTemplate 对象&#xff0c;依赖于数据源 DataSo…

编写脚本电脑怎么编写界面_在任何无法理解的情况下,请编写脚本

编写脚本电脑怎么编写界面脚本编写是使您的应用程序在运行时就可根据客户需求进行调整的最流行的方法之一。 与往常一样&#xff0c;此方法不仅带来好处&#xff0c;例如&#xff0c;在灵活性和可管理性之间存在众所周知的折衷方案。 本文不是从理论上讨论优缺点的文章之一&…

stack java实现_Stack (堆栈)使用JAVA实现

代码如下&#xff1a;import java.util.AbstractList;import java.util.Arrays;import java.util.Iterator;import java.util.List;import java.util.RandomAccess;public class Stack extends AbstractListimplements List, RandomAccess, Cloneable, java.io.Serializable{pr…

HTML特殊符号/特殊字符

注&#xff1a;实体名称大小写敏感 点击查看更多特殊字符

访客模式 无痕模式 区别_旧访客设计模式的新生活

访客模式 无痕模式 区别介绍 访客 [1、2]是众所周知的经典设计模式。 有很多资源对其进行了详细说明。 在不深入研究实现的情况下&#xff0c;我将简要提醒一下该模式的概念&#xff0c;解释其优点和缺点&#xff0c;并提出一些可以使用Java编程语言轻松应用于其的改进。 古典…

HTML的图片标签img的图片地址

使用相对路径&#xff0c;例如&#xff0c;当前目录中的子目录 image 中的图片 1.jpg&#xff0c;可以写成 ./image/1.jpg&#xff0c;其中 ./ 表示当前目录&#xff0c;可以省略不写。 <img src"image/1.jpg"/>实际上HTML文档数据写入到 Response 中时&#…

java swing 左上角图标_科学网—Matlab: 学习GUI(修改窗口左上角图标而不warning) - 刘磊的博文...

网上常用的方法&#xff1a;if ~isdeployednewIconjavax.swing.ImageIcon(.piciap.jpg);elsenewIconjavax.swing.ImageIcon(iap.jpg);endjFrame get(hObject,javaframe);jFrame.setFigureIcon(newIcon);运行后warning&#xff1a;Warning: figure JavaFrame property will be …

pbfunc外部扩展函数_从外部CorDapp扩展和覆盖流

pbfunc外部扩展函数Corda 4于上周&#xff08;2月21日&#xff09;发布&#xff0c;带来了大量的新功能&#xff0c;使Corda更加令人愉快。 老实说&#xff0c;我有点假设有很多新功能。 我快速浏览了变更日志&#xff0c;主要是看到我的贡献被引用&#xff0c;但是我记得看到很…

表单项标签的input标签的单选框(radio)

<input type"radio" name"gender" value"male"> 男 <input type"radio" name"gender" value"female"> 女1.单选框需要注意的是&#xff0c;如果是属于一组的选项&#xff0c;那么 name 属性的值必须相…

java 6 update 3_Java(TM) 6 Update(java运行环境) V 6.0.450.6 官方版

Java(TM) 6 Update是个JAVA辅助软件&#xff0c;它具备高度的安全性以及跨平台的特性&#xff0c;能让你的电脑或手机运行java程序&#xff0c;用户可使用Java(TM) 6 Update来搭建甚至运行整个ava程序&#xff0c;注意&#xff1a;卸载后JAVA环境的程序将无法运行。过去很可能会…

jep290涉及jdk版本_JDK 9 / JEP 280:字符串串联永远不会相同

jep290涉及jdk版本JEP 280 &#xff08;“ Indify String Concatenation”&#xff09;是与JDK 9一起实现的&#xff0c;根据其“摘要”部分&#xff0c;“更改了javac生成的静态String concatenation字节码序列&#xff0c;以使用对JDK库函数的invokedynamic调用。 ” 通过查看…

label标签/标记

label 标签用于指定表单项的文字描述信息&#xff0c;如下所示&#xff1a; <label for"username">用户名称&#xff1a;</label> <input id"username" name"username">label 标签 的 for 属性指定的值与 input 标签的 id 属…