hp rx8640_使用rx-java的异步抽象
hp rx8640
对我而言,使用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
hp rx8640
hp rx8640_使用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不支持抽象属性,如果您试图将类属性标记为抽象,则会得到编译错误. 在本教程中,将介绍两种定义抽象属性的方法,这些属性由子类设置, ...
最新文章
- Calico 的网络结构是什么?- 每天5分钟玩转 Docker 容器技术(68)
- android开发学习 ------- MongoDB数据库简单理解
- 写给那些正奔三的80后[转]
- 杭电多校(三)2019.7.29--暑假集训
- 单例模式之懒汉式/饿汉式/结合二者之优的模式
- 移动计算机怎么开机密码,win7忘记开机密码解决办法
- Python实现web动态服务器
- artTemplate -- 性能卓越的 js 模板引擎
- [No0000CE]检测非空格字符作为密码的密码强度
- HeadFirstJava
- ipad蓝牙键盘使用技巧_iPad提示,技巧和教程的完整列表
- 河南省第八届ACM程序设计竞赛(未完再续)
- 大学毕业4年-回顾和总结(9)-股权投资1年,给自己一个答卷(好狗狗、皇包车、职业梦、比呀比、易途8)(创业有风险,投资需谨慎)
- 微型计算机软件系统分为什么,微型计算机软件微型计算机软件主要包括哪些软件?...
- (转)大数据量分页存储过程效率测试附代码
- spreadsheetControl
- 罗生门:动荡时代下人性的恶与善
- dtree做权限控制
- TCGA官网下载和TCGAbiolinks下载的文件数量竟然不一样?
- 上海 集体户口转个人户口