对我而言,使用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的异步抽象相关推荐

  1. Rx Java 异步编程框架

    Rx Java 文章目录 Rx Java 名词定义 举个例子 基本概念 Backpressure Upstream, Downstream Objects in motion Assembly tim ...

  2. java jpa 异步编程_异步处理时的JPA

    java jpa 异步编程 几年前,在Java世界中,几乎显而易见的是,每个"企业"类项目都需要JPA与数据库进行通信. JPA是Joel Spolsky描述的" 泄漏抽 ...

  3. 在Java中异步编程,同事非要用rxJava,被我一顿吐槽!

    在Java中异步编程,不一定非要使用rxJava, Java本身的库中的CompletableFuture可以很好的应对大部分的场景. 这篇文章介绍 Java 8 的 CompletionStage ...

  4. java后台异步任务执行器TaskManager

    java后台异步任务执行器TaskManager 此方式基于MVC方式: 一,使用任务: 1 @Resource 2 private TaskManager taskManager; 3 4 publ ...

  5. java的面向抽象原则

    java的面向抽象原则 - 未使用抽象原则 圆面积的计算 Circle.javapublic class Circle {double r;Circle(double r){this.r = r;}p ...

  6. 简单学习Java中的抽象语法树(AST)

    概述 抽象语法树(AST)是一种数据结构,代表了一种编程语言的抽象语法.它通常在编译器中用来解析源代码和生成机器代码. 在Java中,AST通常由一个解析器创建,该解析器读取源代码并创建一个树状结构, ...

  7. Java依赖于抽象不依赖于具体,依赖倒置原则(Dependecy-Inversion Principle)

    依赖倒置原则(Dependence Inversion Principle,DIP)的原始定义: 高层模块不应该依赖底层模块,两者都应该依赖其抽象: 抽象不应该依赖细节: 细节应该依赖抽象. 抽象:即 ...

  8. java http异步调用_HttpClient的异步调用,你造吗?

    一.前言 HttpClient提供了两种I/O模型:经典的java阻塞I/O模型和基于Java NIO的异步非阻塞事件驱动I/O模型. Java中的阻塞I/O是一种高效.便捷的I/O模型,非常适合并发 ...

  9. java属性定义_在java中定义抽象属性

    抽象关键字通常应用于类和方法,以便将某些行为的实现委托给子类. Java不支持抽象属性,如果您试图将类属性标记为抽象,则会得到编译错误. 在本教程中,将介绍两种定义抽象属性的方法,这些属性由子类设置, ...

  10. rx 异步执行耗时_使用rx-java的异步抽象

    rx 异步执行耗时 对我而言,使用Rx-java的一大好处是,无论底层调用是同步还是异步,因此代码看起来都完全相同,因此该条目的标题也是如此. 考虑一个非常简单的客户代码用例,它执行三个缓慢运行的调用 ...

最新文章

  1. vue axios 返回参数 响应参数
  2. Windows下Maven的安装与配置
  3. 第2课:关闭被黑客扫描的端口
  4. CSS教程--CSS背景
  5. Mybatis注解配置与xml配置不能同时使用
  6. 地图距离算法_基于权重的地图匹配技术
  7. oracle用哪个用户创建表空间,Oracle用定名创建表空间和用户
  8. log4j的详细介绍
  9. MongoDB数据库读书笔记
  10. Spark编程基础(林子雨)第四章实验
  11. 数据仓库之事实表和维度表
  12. 计算机电子电路原理图,学看电路原理图入门知识积累 - 全文
  13. php 百家姓,最新“百家姓”排名
  14. 等保三级密码复杂度是多少?多久更换一次?
  15. 【C++】使用cmake通过源代码安装第三方库
  16. 【短期投资理财 一】信用卡入门操作
  17. 新版win10的恢复语言栏设置
  18. hdu 4622 Reincarnation(后缀树组求子串个数)
  19. 04 vue3 scss 组件component kepp-alive缓存子组件 nextTick
  20. 【python ++ opencv + pytorch 】车牌提取、分割、识别

热门文章

  1. ❤️ 爆肝一个月!JAVA零基础入门总结(下)❤️
  2. 遍历线索化二叉树+图解
  3. android菱形imageview,ios – 在UICollectionView中,UIImageView应该是圆形视图而不是菱形...
  4. arm芯片厂家排名_国产芯片目前至少有10种,其中有3种,达到了世界顶尖水平
  5. 基于maven的SpringMVC+Spring+MyBatis+Log4j2的pom配置
  6. eclipse maven 项目发布到tomcat 报错 Failed to scan JAR [file:/C:/xxxxx.jar] from WEB-INF/lib
  7. MySQL基础---增删改查语法
  8. java 函数式编程 示例_功能Java示例 第8部分–更多纯函数
  9. jep290涉及jdk版本_JDK 14 / JEP 305模式匹配“ Smart Casts”实例
  10. spring 计划任务_与Spring的计划任务一起按时运行