react api

服务通常可以通过异步处理进行优化,即使不改变其对外界的行为。

某些服务效率不高的原因是,它们需要等待其他服务提供结果才能继续下去。

让我们看一下如何在不等待外部REST服务的情况下调用它们,并独立进行多个并行调用,然后将其结果与Java EE 8中的响应管道结合起来。

如果我们的服务调用了多个微服务,并等待每个调用完成并返回结果,然后再执行另一个调用,那么使用响应式API进行重构是一个不错的选择。 为了提高服务效率,如果它们彼此不依赖,则可以并行执行对外部服务的所有调用。 这将减少等待所花费的时间,从而加快微服务的速度。

为了并行调用REST服务,我们将在JAX-RS中使用新的React式客户端API。 我们将其与RxJava库结合起来,以在可用时结合其结果。 这种结合将使我们能够编写简洁高效的代码。 另一个好处是,可以释放当前线程以进行进一步处理,同时等待远程调用的结果。

我们将建立一个管道,在结果到达时对其进行处理,最后将其合并为单个响应。 管道的第一部分将调用每个远程服务。 除了等待结果以外,我们将指定处理每个收到的结果并继续调用其他服务。 在JAX-RS客户端请求构建器上使用rx()方法可以使我们调用get()方法的版本,该版本将立即返回而不是等待结果。 为了处理结果到达时的结果,我们可以将方法处理程序链接到从get()方法的rx版本返回的CompletionStage上:

CompletionStage stage = temperatureServiceTarget.request().rx().get(Temperature.class).thenApply(temperature -> new Forecast(temperature));

上面的代码将调用温度服务,然后注册一个lambda表达式,以在到达温度时对其进行处理。 这会将温度映射到预测对象,稍后可以使用stage变量进行访问。

但是,我们希望使用的另一种变体get()方法连同RxJava可流动祈求从泽西岛项目获得Flowable的RxJava而不是CompletionStage 。 与CompletionStage相比, Flowable接口可以更轻松地将多个异步结果与更简单的代码组合在一起,并且效率更高。

使用以下代码,我们将调用外部服务并返回Flowable:

Flowable flowable = temperatureServiceTarget.register(RxFlowableInvokerProvider.class).request().rx(RxFlowableInvoker.class).get(Temperature.class).map(temperature -> new Forecast(temperature);

我们注册了其他RxFlowableInvokerProvider ,它允许以后请求RxFlowableInvoker 。 此调用然后给了我们Flowable从RxJava返回类型。 这些类不在JAX-RS API中,我们必须将它们与Jersey RxJava2库一起添加:

<dependency><groupId>org.glassfish.jersey.ext.rx</groupId><artifactId>jersey-rx-client-rxjava2</artifactId><version>2.26</version>
</dependency>

乍一看,我们似乎在做同一件事的同时使代码变得更加复杂。 但是, Flowable实例使我们能够轻松组合多个调用:

Flowable.concat(flowable1, flowable2).doOnNext(forecast -> {forecasts.add(forecast);}).doOnComplete(() -> {asyncResponse.resume(Response.ok(forecasts).build());}).doOnError(asyncResponse::resume).subscribe();
}

对于从任何流通量收到的每个预测,我们将其添加到预测列表中。 最后,我们发送预测列表作为响应或发送错误响应。 要注册侦听器,必须对subscribe()最后一次调用,否则将忽略它们。

您可能还已经注意到asyncResponse变量用于发送最终响应或发出错误信号。 这是一个JAX-RS异步响应实例,用于在数据可用时在以后的时间完成REST响应,而不会阻塞初始处理线程。 使用异步响应有助于在等待外部REST服务的结果时节省线程资源。 为了在REST端点中打开异步处理,我们将注入javax.ws.rs.container.AsyncResponse作为REST方法参数,以及@Suspended批注。 我们还将返回类型更改为void,因为我们将使用AsyncResponse实例构建响应:

@GET
@Produces(MediaType.APPLICATION_JSON)
public void getForecasts(@Suspended AsyncResponse asyncResponse) {...here come some asynchronous calls to REST services...asyncResponse.resume(...)
}

最终代码示例

以下代码将:

  • 在getForecasts方法中打开REST请求的异步处理
  • 在异步响应上设置5分钟超时
  • 对伦敦和北京执行两次温度服务,而无需等待结果
  • 将结果合并为一系列预测
  • 将序列中的每个预测添加到列表中
  • 处理完所有结果后发送完整列表
  • 发生异常时发送错误结果
  • 使用subscribe方法注册处理程序
private Flowable getTemperature(String location) {return temperatureTarget.register(RxFlowableInvokerProvider.class).resolveTemplate("city", location).request().rx(RxFlowableInvoker.class).get(Temperature.class).map(temperature -> new Forecast(location, temperature));
}@GET
@Produces(MediaType.APPLICATION_JSON)
public void getForecasts(@Suspended AsyncResponse asyncResponse) {List forecasts = new ArrayList<>();asyncResponse.setTimeout(5, TimeUnit.MINUTES);Flowable.concat(getTemperature("London"), getTemperature("Beijing")).doOnNext(forecast -> {forecasts.add(forecast);}).doOnComplete(() -> {asyncResponse.resume(Response.ok(forecasts).build());}).doOnError(asyncResponse::resume).subscribe();
}

翻译自: https://www.javacodegeeks.com/2018/06/speed-services-reactive-api.html

react api

react api_使用Java EE 8中的React式API加速服务相关推荐

  1. 使用Java EE 8中的反应式API加速服务

    服务通常可以通过异步处理进行优化,即使不改变其对外界的行为. 某些服务效率不高的原因是,它们需要等待其他服务提供结果才能继续下去. 让我们看一下如何在不等待外部REST服务的情况下调用它们,并独立进行 ...

  2. Java EE 7中的WebSocket客户端API

    在本文中,让我们探索谈论较少的Web Socket Client API,以及如何在Java EE 7容器本身中利用它. Web套接字服务器API规则 JSR 356的服务器端API(Java的Web ...

  3. 在 Java EE 组件中使用 Camel Routes

    2019独角兽企业重金招聘Python工程师标准>>> 摘要:你可以通过集成 Camel 和 WildFly 应用服务器(使用 WildFly-Camel 子系统)在 Java EE ...

  4. java ee各类组件_在Java EE组件中使用骆驼路线

    java ee各类组件 从现在开始我一直在与Camel合作,我真的很喜欢它的简单性. 在Java EE之上使用它一直是一个挑战,我最近发表了一篇关于如何做到这一点的演讲,而在Java EE中引导Cam ...

  5. 在Java EE组件中使用骆驼路线

    从现在开始我一直在与Camel合作,我真的很喜欢它的简单性. 在Java EE之上始终使用它一直是一个挑战,而我最近发表的有关如何做到这一点的演讲之一以及Java EE中引导Camel的不同方法实际上 ...

  6. Java EE 7中包含哪些JSR?

    我开始填写所有应该加入Java EE 7的Java规范请求的表. 由于平台版本仍在确定中,因此某些细节很难确定. 完整的Java EE 7 EJB产品具有以下标准组件和API: 名称 版 描述 JSR ...

  7. js ajax 访问java函数,将url分配给Java EE项目中的ajax(js)函数

    我正在Ajax中尝试使用我的第一个项目,并且在分配指向要从服务器中获取的文件的绝对URL时遇到问题.将url分配给Java EE项目中的ajax(js)函数 这是我的函数: function fetc ...

  8. Java EE应用程序的单片到微服务重构

    您是否曾经想过将现有的Java EE整体应用程序重构为基于微服务的应用程序需要做什么? 该博客解释了一个简单的购物车示例如何转换为基于微服务的应用程序,以及围绕它的一些担忧. 整体和基于微服务的应用程 ...

  9. Oracle把Java EE的未来押在Rest API上了?

    Oracle正在向REST 和 JSON倾斜以使Java EE 适应微服务和云的现代趋势. \\ 作为一种提供Web服务通信的机制,似乎REST从很久以前就抢过了SOAP的风头.SOAP 因其复杂性已 ...

最新文章

  1. 通过nginx访问web,出现ERR_CONTENT_LENGTH_MISMATCH解决方法
  2. 计算机pc软盘不能数字,老人把遗嘱存5寸软盘难坏家人 老电脑终未读出
  3. odoo self.ensure_one()
  4. STM32 - 定时器的设定 - 基础- 0D - Timer synchronization chaining - 主从模式下 - 定时器同步和级联控制 - 级联启动定时器
  5. ubuntu10.4的更新源因过期无法更新的解决方法
  6. python中什么是主要数据类型_python中基本数据类型是什么
  7. 5句话搞定ES5作用域
  8. CCF NOI1050 矩阵乘法
  9. android create命令,phonegap运行android – create命令失败,退出代码8 – linux
  10. latex 图片和标题一起旋转
  11. 5.12 CopyNet和 Pointer-Generator Net 复制机制和指针-生成器网络
  12. 网络工程师HCIE-RS-layer2(原理+实验)
  13. 自动超频_超频的几种方式
  14. 虾米关停之际,抖音快手借道音乐暗战TME
  15. php同步今日头条,135编辑器可直接同步今日头条,新功能同时上线!
  16. R shiny 交互式表格
  17. 在脉脉匿名频道上看了这些公司的评价后,这里有几个结论
  18. skinsdog 狗网官网CSGO饰品皮肤开箱网站可直接取回
  19. 串口通信(SBUF代码原理详解)
  20. java 重载条件

热门文章

  1. [APIO2014] 序列分割(斜率优化dp)
  2. CF666E-Forensic Examination【广义SAM,线段树合并】
  3. P3599-Koishi Loves Construction【构造,数论】
  4. P5664-Emiya家今天的饭【dp】
  5. 【深搜】 棋盘 【NOIp普及组 2017 第三题】 (luogu 3956/ssl 2851)
  6. 31、JAVA_WEB开发基础之servlet(2)
  7. 详解Vue中watch的高级用法
  8. 这些保护Spring Boot 应用的方法,你都用了吗?
  9. 在eclipse中关于Spring和Hibernate 的XML配置如何提示类的包路径的办法
  10. Redis入门(一)之安装