使用rx-java的异步抽象
对我而言,使用Rx-java的最大好处之一就是无论底层调用是同步还是异步,因此代码看起来都完全相同,因此该条目的标题也是如此。
考虑一个非常简单的客户端代码用例,它执行三个缓慢运行的调用并将结果合并到一个列表中:
String op1 = service1.operation();
String op2 = service2.operation();
String op3 = service3.operation();
Arrays.asList(op1, op2, op3)
由于呼叫是同步的,因此花费的时间会增加。 为了模拟慢速调用,以下是每个方法调用中的实现类型:
public String operation() {logger.info("Start: Executing slow task in Service 1");Util.delay(7000);logger.info("End: Executing slow task in Service 1");return "operation1"
}
因此,在这些实现中使用rx-java的第一个尝试是简单地让这些长时间运行的操作返回通用类型Observable ,一个糟糕的实现看起来像这样:
public Observable<string> operation() {logger.info("Start: Executing slow task in Service 1");Util.delay(7000);logger.info("End: Executing slow task in Service 1");return Observable.just("operation 1");
}
因此,调用方实现将更改为以下内容:
Observable<String> op1 = service1.operation();
Observable<String> op2 = service2.operation();
Observable<String> op3 = service3.operation();Observable<List<String>> lst = Observable.merge(op1, op2, op3).toList();
查看调用者如何使用merge方法组合结果。
但是,此时每个服务调用的调用仍是同步的,为了使调用中断,可以通过以下方式使服务调用使用线程池:
public class Service1 {private static final Logger logger = LoggerFactory.getLogger(Service1.class);public Observable<String> operation() {return Observable.<String>create(s -> {logger.info("Start: Executing slow task in Service 1");Util.delay(7000);s.onNext("operation 1");logger.info("End: Executing slow task in Service 1");s.onCompleted();}).subscribeOn(Schedulers.computation());}
}
subscriptionOn使用指定的Scheduler运行实际操作。
该方法的优点在于,该服务的调用代码根本没有更改,那里的实现与以前完全相同,而服务调用现在是异步的。 如果您有兴趣进一步探索这个样本, 这里是一个GitHub库一起工作的例子。
翻译自: https://www.javacodegeeks.com/2015/02/async-abstractions-using-rx-java.html
使用rx-java的异步抽象相关推荐
- Rx Java 异步编程框架
Rx Java 文章目录 Rx Java 名词定义 举个例子 基本概念 Backpressure Upstream, Downstream Objects in motion Assembly tim ...
- java jpa 异步编程_异步处理时的JPA
java jpa 异步编程 几年前,在Java世界中,几乎显而易见的是,每个"企业"类项目都需要JPA与数据库进行通信. JPA是Joel Spolsky描述的" 泄漏抽 ...
- 在Java中异步编程,同事非要用rxJava,被我一顿吐槽!
在Java中异步编程,不一定非要使用rxJava, Java本身的库中的CompletableFuture可以很好的应对大部分的场景. 这篇文章介绍 Java 8 的 CompletionStage ...
- java后台异步任务执行器TaskManager
java后台异步任务执行器TaskManager 此方式基于MVC方式: 一,使用任务: 1 @Resource 2 private TaskManager taskManager; 3 4 publ ...
- java的面向抽象原则
java的面向抽象原则 - 未使用抽象原则 圆面积的计算 Circle.javapublic class Circle {double r;Circle(double r){this.r = r;}p ...
- 简单学习Java中的抽象语法树(AST)
概述 抽象语法树(AST)是一种数据结构,代表了一种编程语言的抽象语法.它通常在编译器中用来解析源代码和生成机器代码. 在Java中,AST通常由一个解析器创建,该解析器读取源代码并创建一个树状结构, ...
- Java依赖于抽象不依赖于具体,依赖倒置原则(Dependecy-Inversion Principle)
依赖倒置原则(Dependence Inversion Principle,DIP)的原始定义: 高层模块不应该依赖底层模块,两者都应该依赖其抽象: 抽象不应该依赖细节: 细节应该依赖抽象. 抽象:即 ...
- java http异步调用_HttpClient的异步调用,你造吗?
一.前言 HttpClient提供了两种I/O模型:经典的java阻塞I/O模型和基于Java NIO的异步非阻塞事件驱动I/O模型. Java中的阻塞I/O是一种高效.便捷的I/O模型,非常适合并发 ...
- java属性定义_在java中定义抽象属性
抽象关键字通常应用于类和方法,以便将某些行为的实现委托给子类. Java不支持抽象属性,如果您试图将类属性标记为抽象,则会得到编译错误. 在本教程中,将介绍两种定义抽象属性的方法,这些属性由子类设置, ...
- rx 异步执行耗时_使用rx-java的异步抽象
rx 异步执行耗时 对我而言,使用Rx-java的一大好处是,无论底层调用是同步还是异步,因此代码看起来都完全相同,因此该条目的标题也是如此. 考虑一个非常简单的客户代码用例,它执行三个缓慢运行的调用 ...
最新文章
- vue axios 返回参数 响应参数
- Windows下Maven的安装与配置
- 第2课:关闭被黑客扫描的端口
- CSS教程--CSS背景
- Mybatis注解配置与xml配置不能同时使用
- 地图距离算法_基于权重的地图匹配技术
- oracle用哪个用户创建表空间,Oracle用定名创建表空间和用户
- log4j的详细介绍
- MongoDB数据库读书笔记
- Spark编程基础(林子雨)第四章实验
- 数据仓库之事实表和维度表
- 计算机电子电路原理图,学看电路原理图入门知识积累 - 全文
- php 百家姓,最新“百家姓”排名
- 等保三级密码复杂度是多少?多久更换一次?
- 【C++】使用cmake通过源代码安装第三方库
- 【短期投资理财 一】信用卡入门操作
- 新版win10的恢复语言栏设置
- hdu 4622 Reincarnation(后缀树组求子串个数)
- 04 vue3 scss 组件component kepp-alive缓存子组件 nextTick
- 【python ++ opencv + pytorch 】车牌提取、分割、识别
热门文章
- ❤️ 爆肝一个月!JAVA零基础入门总结(下)❤️
- 遍历线索化二叉树+图解
- android菱形imageview,ios – 在UICollectionView中,UIImageView应该是圆形视图而不是菱形...
- arm芯片厂家排名_国产芯片目前至少有10种,其中有3种,达到了世界顶尖水平
- 基于maven的SpringMVC+Spring+MyBatis+Log4j2的pom配置
- eclipse maven 项目发布到tomcat 报错 Failed to scan JAR [file:/C:/xxxxx.jar] from WEB-INF/lib
- MySQL基础---增删改查语法
- java 函数式编程 示例_功能Java示例 第8部分–更多纯函数
- jep290涉及jdk版本_JDK 14 / JEP 305模式匹配“ Smart Casts”实例
- spring 计划任务_与Spring的计划任务一起按时运行