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

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

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

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

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

为了并行调用REST服务,我们将在JAX-RS中使用新的反应式客户端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

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

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

相关文章

计算机上播放时没声音什么故障,事实:在笔记本电脑上播放歌曲时如果没有声音怎么办...

在笔记本电脑上播放时如果没有声音该怎么办&#xff1f;关于在笔记本电脑上播放时无声音的问题&#xff0c;有些网民仍然不知道该怎么办&#xff0c;所以让我告诉您如何在笔记本电脑上播放无声音时解决问题。希望我能为您服务&#xff01;播放歌曲时&#xff0c;笔记本电脑没有…

martingale、markov chain、Monte Carlo、MCMC

文章结构如下&#xff1a; 1: MCMC 1.1 MCMC是什么 1.2 为什么需要MCMC 2&#xff1a; 蒙特卡罗 2.1 引入 2.2 均匀分布&#xff0c;Box-Muller 变换 2.3 拒绝接受采样&#xff08;Acceptance-Rejection Sampling&#xff09; 2.4 接受拒绝采样的直观解释 2.5 接受拒绝采样方…

1835财务报表分析 (2)

单选题&#xff08;共20题&#xff0c;共60分&#xff09; 1. 下列信息中不属于所有者权益变动表反映的是 A 所有者权益总量的增减变动信息 B 所有者权益增减变动的重要结构性信息 C 直接计入所有者权益的利得和损失 D 企业经营规模和资产结构 参考答案&#xff1a;D&…

1835财务报表分析

单选题&#xff08;共20题&#xff0c;共60分&#xff09; 1. 下列信息中不属于所有者权益变动表反映的是 A 所有者权益总量的增减变动信息 B 所有者权益增减变动的重要结构性信息 C 直接计入所有者权益的利得和损失 D 企业经营规模和资产结构 参考答案&#xff1a;D&…

1849公共部门人力资源管理 (2)

客观题 选择题&#xff08;共20题&#xff0c;共40分&#xff09; 1. &#xff08; &#xff09;的完善程度决定了人力资源流动的规模、质量和效益。 A 人力资源流动政策 B 人力资源供求关系预测 C 人力资源规划 D 人力资源市场 参考答案&#xff1a;D&#xff1b;考…

全面认识Small Cell

发布时间&#xff1a;2013-12-17 作者&#xff1a;申建华&#xff0c;李春旭&#xff0c;谭伟&#xff08;中兴通讯&#xff09;Small Cell是一种低发射功率&#xff0c;小范围覆盖的基站设备。Small Cell作为3G/4G宏蜂窝的补充&#xff0c;能够使运营商以更低的代价为用户提供…

医学计算机ppt模板,计算机与医学.ppt

《计算机与医学.ppt》由会员分享&#xff0c;可在线阅读&#xff0c;更多相关《计算机与医学.ppt(22页珍藏版)》请在人人文库网上搜索。1、计算机与医学,北京大学 信息科学技术学院 2008年9月,2/22,计算机在医学方面能做些什么&#xff1f;,在任何一门学科的研究和实践中&#…

Java“地铁”表(JavaFX)

再次嗨&#xff0c;这次&#xff0c;TableView“ Metro”样式被添加到JMetro JavaFX主题。 这会将JMetro版本放大到3.1.0。 我之所以没有添加表格样式&#xff0c;是因为奇怪的是在Fluent设计系统&#xff08;以前是Metro&#xff09;中还没有表格的定义。 有一个名为DataGrid…

1838公共政策概论

客观题 单选题&#xff08;共20题&#xff0c;共40分&#xff09; 1. 美国学者戴维伊斯顿认为&#xff08; &#xff09; A 公共政策是由政治家&#xff0c;即具有立法权者制定的&#xff0c;而由行政人员执行的法律和法规。 B 公共政策是一种具有目标、价值与策略的大型…

razer鼠标测试软件,比HERO更强么,雷蛇FOCUS+引擎蝰蛇V2精准度测试

在鼠标引擎上&#xff0c;罗技HERO曾经一枝独秀&#xff0c;虽然赛睿有TrueMove、冰豹有Owl-Eye夜枭&#xff0c;但都不具备低功耗的特性&#xff0c;只能归类为传统游戏类引擎。作为体量接近罗技的一线品牌&#xff0c;雷蛇成为了一些人期待与之抗衡的希望&#xff0c;在毒蝰/…

1839行政领导学 (2)

客观题 判断题&#xff08;共5题&#xff0c;共10分&#xff09; 1. 领导活动是一种社会活动&#xff0c;因此领导素质只有后天性特征。&#xff08; &#xff09; T √ F 参考答案&#xff1a;F&#xff1b;考生答案&#xff1a;F&#xff1b;试题分数&#xff1a;…

计算机公式or,AND、OR函数详解_Excel公式教程

【语法1】AND(logical1,[logical2],…)执行逻辑与运算&#xff1a;所有参数都是TRUE&#xff0c;则返回TRUE&#xff1b;只要有一个参数是FALSE&#xff0c;即返回FALSE。【语法2】OR(logical1,[logical2],…)执行逻辑或运算&#xff1a;所有参数都是FALSE&#xff0c;则返回FA…

rest spring_Spring REST:异常处理卷。 3

rest spring这是该系列中有关Spring REST异常处理的最后一篇文章。 最后&#xff0c;这次我将讨论在表单处理期间可能发生的REST异常的处理。 因此&#xff0c;在本教程中&#xff0c;您将看到与REST&#xff0c;表单和异常处理有关的所有内容。 客户端呢&#xff1f; JQuery将…

1838公共政策概论 (2)

客观题 单选题&#xff08;共20题&#xff0c;共40分&#xff09; 1. 美国学者戴维伊斯顿认为&#xff08; &#xff09; A 公共政策是由政治家&#xff0c;即具有立法权者制定的&#xff0c;而由行政人员执行的法律和法规。 B 公共政策是一种具有目标、价值与策略的大型…

计算机季度函数,季度怎么分月份(根据月份函数生成季度)

小伙伴们好&#xff0c;咱们知道&#xff0c;Excel中的日期计算函数非常丰富&#xff0c;有用于计算年份的YEAR函数&#xff0c;有计算月份的MONTH函数&#xff0c;有计算星期的WEEKDAY函数等等。小伙伴们好&#xff0c;咱们知道&#xff0c;Excel中的日期计算函数非常丰富&…

1839行政领导学

客观题 判断题&#xff08;共5题&#xff0c;共10分&#xff09; 1. 领导活动是一种社会活动&#xff0c;因此领导素质只有后天性特征。&#xff08; &#xff09; T √ F 参考答案&#xff1a;F&#xff1b;考生答案&#xff1a;F&#xff1b;试题分数&#xff1a;…

泊松分布和指数分布

一、泊松分布 1.1 泊松分布的定义 日常生活中&#xff0c;大量事件是有固定频率的。 某医院平均每小时出生3个婴儿某公司平均每10分钟接到1个电话某超市平均每天销售4包xx牌奶粉某网站平均每分钟有2次访问 它们的特点就是&#xff0c;我们可以预估这些事件的总数&#xff0…

Gradle多项目构建–类似父pom的结构

当您来自Maven背景时&#xff0c;很可能已经习惯了父pom结构。 现在&#xff0c;在进行gradle时&#xff0c;情况有所不同。 想象一下有一个包含接口和各种其他实现的项目的场景。 这将是我们的项目结构。 multi-project-gradle -- specification -- core -- implementati…

移动办公计算机,最适合移动办公的三款掌上电脑点评

最适合移动办公的三款掌上电脑点评2020-03-31 16:35:554点赞22收藏25评论办公经常使用的是台式电脑或者常规的笔记本&#xff0c;笔记本因其体积较小且轻薄&#xff0c;更适合移动办公&#xff0c;但毕竟十几寸的体积&#xff0c;好几斤的重量&#xff0c;随身携带还是不便&…

正态分布的

正态分布&#xff08;台湾作常态分布&#xff0c;英语&#xff1a;normal distribution&#xff09;又名高斯分布&#xff08;英语&#xff1a;Gaussian distribution&#xff09;&#xff0c;是一个非常常见的连续概率分布。正态分布在统计学上十分重要&#xff0c;经常用在自…