Spring 5(以及Boot 2,将在数周内到货)是一次革命。 不是“ XML上的注释 ”或“ Java上的注释类 ”的革命。 这是一个真正的革命性框架,可以编写全新的应用程序类别。 近年来,我对此框架感到有些恐惧。 “ Spring Cloud是简化了Spring Boot使用的框架,Spring简化了Spring使用的框架,是简化了企业开发的框架。” start.spring.io (也称为“ 开始...点弹簧...点I ... O ”)列出了120个可以添加到服务中的不同模块(!)。 这几天的春天变成了一个庞大的伞式项目,我可以想象为什么有些人(仍然!)更喜欢Java EE(或者这些天所谓的东西)。

但是Spring 5带来了革命性的革命。 它不再只是阻止servlet API和各种Web框架的包装器。 在Project Reactor之上的Spring 5允许编写高性能,超快速和可伸缩的服务器,完全避免了servlet堆栈。 该死的,CLASSPATH上没有Jetty甚至servlet API! 在Spring 5 Web-flux的核心,我们将找到Netty ,这是一个用于编写异步客户端和服务器的低级框架。 最终,Spring成为React框架家族的一等公民。 Java开发人员可以实现快速服务,而不必离开自己的舒适区,也可以使用https://doc.akka.io/docs/akka-http/current/或https://www.playframework.com/ 。 Spring 5是用于构建高度可扩展且具有弹性的应用程序的完全被动的现代工具。 尽管如此,诸如控制器,bean,依赖注入之类的基本原理都是相同的。 而且,升级路径很顺利,我们可以逐步添加功能,而不是学习全新的外来框架。 足够多的谈话,让我们写一些代码。

在本文中,我们将编写一个简单的无头应用程序,该应用程序可以在ElasticSearch中大量索引文档。 我们的目标是即使服务器速度变慢,也只需要几个线程即可实现数千个并发连接。 但是,与Spring Data MongoDB不同, Spring Data ElasticSearch本身不支持非阻塞存储库。 好吧,后者似乎不再被维护,当前版本已经3年了。 许多文章定位Spring 5 +的MongoDB其仓库返回无阻塞流( FluxFlowable的RxJava)。 这一点会更高级。

ElasticSearch 6 Java API使用RESTful接口,并使用非阻塞HTTP客户端实现。 不幸的是,它使用回调而不是像CompletableFuture这样的理智的东西。 因此,让我们自己构建客户端适配器。

使用Fluxes和Monos的ElasticSearch客户端

本文的源代码可在react reactive-elastic-search分支上的github.com/nurkiewicz/elastic-flux上找到。

我们想通过返回FluxMono来构建一个支持Project Reactor的ElasticSearch Java客户端。 当然,如果基础流是完全异步的并且不消耗线程,则将获得最大的好处。 幸运的是,Java API就是这样。 首先,让我们将ElasticSearch的客户端设置为Spring Bean:

import org.apache.http.HttpHost;
import org.elasticsearch.client.RestClient;
import org.elasticsearch.client.RestHighLevelClient;@Bean
RestHighLevelClient restHighLevelClient() {return new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200)).setRequestConfigCallback(config -> config.setConnectTimeout(5_000).setConnectionRequestTimeout(5_000).setSocketTimeout(5_000)).setMaxRetryTimeoutMillis(5_000));
}

在现实生活中,我们显然会将其中的大多数参数化。 我们将为简单的JSON文档建立索引,目前,它们的内容并不重要:

@Value
class Doc {private final String username;private final String json;
}

我们将编写的代码包装RestHighLevelClient并通过返回Mono<IndexResponse>使它更高级Mono非常类似于CompletableFuture但有两个例外:

  • 很懒–只要您不订阅,就不会开始计算
  • CompletableFuture不同, Mono可以正常完成而不会发出任何值

第二个区别总是对我有些误导。 在RxJava 2.x中,有两种不同的类型: Single (总是带有值或错误)和Maybe (例如Mono )。 太糟糕的Reactor并没有做到这一点。 没关系,适配器层是什么样的? 普通的Elastic API如下所示:

client.indexAsync(indexRequest, new ActionListener() {@Overridepublic void onResponse(IndexResponse indexResponse) {//got response}@Overridepublic void onFailure(Exception e) {//got error}
});

您可以看到问题所在: callback hell 。 与其将自定义ActionListener公开为该逻辑的参数,不如将其包装在Mono

import org.elasticsearch.action.ActionListener;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.common.xcontent.XContentType;import reactor.core.publisher.Mono;
import reactor.core.publisher.MonoSink;private Mono<IndexResponse> indexDoc(Doc doc) {return Mono.create(sink -> {IndexRequest indexRequest = new IndexRequest("people", "person", doc.getUsername());indexRequest.source(doc.getJson(), XContentType.JSON);client.indexAsync(indexRequest, new ActionListener<IndexResponse>() {@Overridepublic void onResponse(IndexResponse indexResponse) {sink.success(indexResponse);}@Overridepublic void onFailure(Exception e) {sink.error(e);}});});
}

我们必须创建包装了JSON文档的IndexRequest ,并通过RESTful API发送它。 但这不是重点。 我们正在使用Mono.create()方法,它有一些缺点,但稍后会介绍更多。 Mono是懒惰的,因此仅调用indexDoc()还不够,没有对ElasticSearch发出HTTP请求。 但是,每次有人订阅此单元素源时,都会执行create()内部的逻辑。 关键行是sink.success()sink.error() 。 它们将结果从ElasticSearch(来自后台异步线程)传播到流中。 在实践中如何使用这种方法? 非常简单!

Doc doc = //...
indexDoc(doc).subscribe(indexResponse -> log.info("Got response"));

当然,React流处理的真正能力来自于组合多个流。 但是我们迈出了第一步:将基于回调的异步API转换为通用流。 如果您不愿意使用MongoDB,它会在存储库中内置对诸如MonoFlux类的React式类型的支持。 Cassandra和Redis也是如此 。 在下一篇文章中,我们将学习如何生成一些虚假数据并对其进行索引。

翻译自: https://www.javacodegeeks.com/2018/01/spring-reactor-elasticsearch-callbacks-reactive-streams.html

Spring,Reactor和ElasticSearch:从回调到React流相关推荐

  1. Spring,Reactor和ElasticSearch:从回调到反应流

    Spring 5(以及Boot 2,在数周之内到货)是一次革命. 不是" XML上的注释 "或" Java上的注释类 "的革命. 这是一个真正的革命性框架,可以 ...

  2. io.realm:rea_使Java具有响应性的框架和工具包:RxJava,Spring Reactor,Akka和Vert.x概述...

    io.realm:rea 如今,人们需要具有高用户体验的高响应性,交互式应用程序,这通常意味着要处理异步性,尤其是当应用程序涉及高负载,实时数据和多用户时. 由于Java是一种固有的语言,它固有地支持 ...

  3. Spring Boot 整合 Elasticsearch,实现 function score query 权重分查询

    运行环境:JDK 7 或 8,Maven 3.0+ 技术栈:SpringBoot 1.5+,ElasticSearch 2.3.2 本文提纲 一.ES 的使用场景 二.运行 springboot-el ...

  4. Elasticsearch学习(3) spring boot整合Elasticsearch的原生方式

    前面我们已经介绍了spring boot整合Elasticsearch的jpa方式,这种方式虽然简便,但是依旧无法解决我们较为复杂的业务,所以原生的实现方式学习能够解决这些问题,而原生的学习方式也是E ...

  5. Elasticsearch实战篇——Spring Boot整合ElasticSearch

    2019独角兽企业重金招聘Python工程师标准>>> 当前Spring Boot很是流行,包括我自己,也是在用Spring Boot集成其他框架进行项目开发,所以这一节,我们一起来 ...

  6. 使Java具有响应性的框架和工具包:RxJava,Spring Reactor,Akka和Vert.x概述

    如今,人们需要具有高用户体验的高响应性,交互式应用程序,这通常意味着处理异步性,尤其是当这些应用程序涉及高负载,实时数据和多用户时. 由于Java是一种固有的支持命令式编程风格的面向对象语言,因此异步 ...

  7. Spring Reactor教程

    在RESTful服务的世界中,实际上实际上是在幕后进行许多工作,我们通常必须在应用程序中进行很多处理,而实际上并不会影响需要发送给真实用户的响应. 可以被动地做出这些业务决策,以便它们对与应用程序交互 ...

  8. 使用Spring Reactor Core进行分散收集

    我在使用Netflix Rx-Java库方面有良好的工作经验,并且以前曾写过关于使用Rx-Java和Java 8 CompletableFuture解决分散式问题的博客. 在这里,我想探索使用Spri ...

  9. 218.94.78.76:20001/index.php,详解spring中使用Elasticsearch的实例教程

    本篇文章主要介绍了详解spring中使用Elasticsearch的代码实现,具有一定的参考价值,有兴趣的可以了解一下 在使用Elasticsearch之前,先给大家聊一点干货. 1. ES和solr ...

最新文章

  1. NoSQL介绍、memcached介绍、安装memcached、 查看memcached状态
  2. 直线职权::参谋职权::职能职权
  3. postman response json 格式化_postman第7讲-核心功能六:Tests(断言)
  4. JQuery图表插件之Flot
  5. AI:2020年6月23日北京智源大会演讲分享之AI创业专题论坛——10:00-10:30张亚勤教授《智能产业新浪潮》
  6. Spring Boot——一种包含分页和排序参数的接收方法DEMO
  7. Executor家族的辨析
  8. GALV_maptravel研究分析(1)
  9. JavaScript操作BOM简单案例
  10. glass fish_Glass Fish 4.0.1中的Jersey SSE功能
  11. CAN总线技术 | 物理层02 - CAN总线的异步串行通讯
  12. Claris FileMaker Pro更新至19.2.1.14中文版
  13. oracle into关键字,oracle - INTO保留关键字不能用作标识符 - 堆栈内存溢出
  14. 几种常见的图像模糊处理
  15. 测试TF card 的读写速度
  16. 使用pycharm编写python爬虫时出现乱码的解决方案UnicodeEncodeError: ‘gbk‘ codec can‘t encode character ‘\U0001f601‘ in
  17. spring data jpa 使用@Query 动态参数查询案例分析
  18. Office application 版本
  19. 计算机睡眠和休眠的区别win10,win10睡眠和休眠有何不同_win10休眠和睡眠的区别...
  20. cmd下批量pingIP地址

热门文章

  1. CodeForces 516E Drazil and His Happy Friends(数学+最短路)
  2. Loj#2769-「ROI 2017 Day 1」前往大都会【最短路树,斜率优化】
  3. UOJ#244-[UER#7]短路【贪心】
  4. jzoj2136-(GDKOI2004)汉诺塔【找规律,模拟】
  5. ssl1341-Asteroids【最大匹配,最小点覆盖,图论】
  6. codeforces773 D. Perishable Roads(思维+最短路)
  7. codeforces F.F. Teodor is not a liar! 最长不降子序列
  8. Java 并发总结——AQS
  9. 一篇文章了解RPC框架原理
  10. MySQL week()函数