1.x到2.x的迁移:可观察与可观察:RxJava FAQ

标题不是错误。 rx.Observable 1.x的io.reactivex.Observable与2.x的io.reactivex.Observable完全不同。 盲目升级rx依赖关系并重命名项目中的所有导入将进行编译(稍作更改),但不能保证相同的行为。 在项目的早期, Observable in 1.x中没有背压的概念,但后来包含了背压。 这到底是什么意思? 假设我们有一个流,每1毫秒产生一个事件,但是处理一个这样的项目需要1 。 您会发现从长远来看,它不可能以这种方式工作:

import rx.Observable;  //RxJava 1.x
import rx.schedulers.Schedulers;Observable.interval(1, MILLISECONDS).observeOn(Schedulers.computation()).subscribe(x -> sleep(Duration.ofSeconds(1)));

MissingBackpressureException在几百毫秒内MissingBackpressureException 。 但是这个异常是什么意思呢? 好吧,基本上,这是一个安全网(或如果有的话,请进行健全性检查),以防止损害应用程序。 RxJava自动发现生产者溢出了消费者,并主动终止了流以避免进一步的损害。 那么,如果我们只是在这里和那里搜索并替换少量进口商品,该怎么办?

import io.reactivex.Observable;     //RxJava 2.x
import io.reactivex.schedulers.Schedulers;Observable.interval(1, MILLISECONDS).observeOn(Schedulers.computation()).subscribe(x -> sleep(Duration.ofSeconds(1)));

例外不见了! 我们的吞吐量也是如此……一段时间后,应用程序停止运行,一直处于无休止的GC循环中。 您会看到,RxJava 1.x中的Observable在各处都有断言(绑定队列,检查等),确保您没有在任何地方溢出。 例如,默认情况下,1.x中的observeOn()运算符的队列限制为128个元素。 当在整个堆栈上正确实现背压时, observeOn()运算符会要求上游传递不超过128个元素来填充其内部缓冲区。 然后,与此调度程序分开的线程(工作人员)从该队列中拾取事件。 当队列几乎变空时, observeOn()运算符会要求更多( request()方法)。 当生产者不遵守背压请求并发送比允许的更多的数据时,此机制就会破裂,从而使消耗者有效溢出。 observeOn()运算符内的内部队列已满,而interval()运算符仍在发出新事件-因为这就是interval()要做的事情。

在1.x中Observable到的发现了这种溢出,并通过MissingBackpressureException快速失败。 字面上的意思是: 我尽了最大努力使系统保持健康状态,但是我的上游不尊重背压-缺少背压实现 。 但是,在2.x中Observable到的没有这种安全机制。 希望你会成为一个好公民,生产缓慢或消费快速的人。 当系统运行Observable ,两个Observable的行为相同。 但是,在1.x负载下,快速失败,而2.x则缓慢而痛苦地失败。

这是否意味着RxJava 2.x向后退? 恰恰相反! 在2.x中,有一个重要的区别:

  • Observable不在乎背压,这极大地简化了其设计和实现。 根据定义,它应用于建模不支持背压的流,例如用户界面事件
  • Flowable确实支持背压,并已采取所有安全措施。 换句话说,计算管道中的所有步骤都确保您不会溢出使用者。

2.x在可以支持背压的流(简单地说“ 如果需要可以减慢 ”)和不支持背压的流之间进行了重要区分。 从类型系统的角度来看,很清楚,我们正在处理哪种源及其保证。 那么我们应该如何将interval()示例迁移到RxJava 2.x? 比您想像的容易:

Flowable.interval(1, MILLISECONDS).observeOn(Schedulers.computation()).subscribe(x -> sleep(Duration.ofSeconds(1)));

这么简单。 您可能会问自己一个问题,为什么Flowable可以有一个interval()运算符,按照定义,它不能支持背压? 假设所有interval()均以恒定速率传递事件后,它就不会放慢速度! 好吧,如果您看一下interval()的声明,您会注意到:

@BackpressureSupport(BackpressureKind.ERROR)

简而言之,这告诉我们,每当无法再保证背压时,RxJava都会处理它并抛出MissingBackpressureException 。 这正是我们运行Flowable.interval()程序时发生的事情–它快速失败,而不是破坏整个应用程序的稳定性。

因此,总结起来,每当您从1.x看到Observable时,您可能想要的是从2.x开始的Flowable 。 至少,除非您的流按定义不支持背压。 尽管名称相同,但这两个主要版本中的Observable很大不同。 但是,一旦您进行搜索并Observable 替换Flowable您将注意到迁移并不是那么简单。 这与API更改无关,区别更加深刻。

在2.x中没有直接等效于Observable.create()简单Flowable.create() 。 过去我过度使用Observable.create()工厂方法是一个错误。 create()允许您以任意速率发出事件,而完全忽略了背压。 2.x拥有一些友好的功能来处理背压请求,但它们需要仔细设计流。 这将在下一个常见问题解答中介绍。

翻译自: https://www.javacodegeeks.com/2017/08/1-x-2-x-migration-observable-vs-observable-rxjava-faq.html

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

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

相关文章

linux 线程 拷贝,linux下实现多线程拷贝命令

实现多线程拷贝命令,如:./multithread_copy srcfile destfile N(拷贝线程个数)难点:内存映射mmap。给每一个线程合理的分配任务。多线程的实现。具体的实现代码如下:/********************************************************************…

vivado安装_Vivado下载与安装指南

Vivado下载与安装指南目前,vivado已推出2019.1版本,实验室所安装的为2018.3版本,由于软件向下兼容的特性,建议安装2018版本,若安装2019版本,请自带笔记本,安装过程与之前没有差别,这…

linux中kafka主题修改分区,kafka_2.11-2.0.0的部署与配置修改

1 [yunmini01 config]$ pwd2 /app/kafka/config3 [yunmini01 config]$ vim server.properties4 ############################# Server Basics #############################5 # 每一个broker在集群中的唯一标示★★★6 # 比如mini01 为0 mini02 为1 mini03 为27 broker.id089…

python中字符串乘法_python leetcode 字符串相乘实例详解

给定两个以字符串形式表示的非负整数 num1 和 num2 ,返回 num1 和 num2 的乘积,它们的乘积也表示为字符串形式。示例 1:输入: num1 "2", num2 "3"输出: "6"示例 2:输入: num1 "123", num2 "456&quo…

嵌入式基于linux电机控制器,基于嵌入式Linux的移动机器人控制系统

使用select机制监控是否语音识别结果,在超出等待时间后,会退出等待并重新初始化语音模块LD3320,释放公共资源,这样也使得系统能够及时响应LD3320的MP3播放功能,避免了在长时间没有语音识别结果时,系统进入卡…

jdk8运行jdk7的代码_即使在jdk中也有错误的代码

jdk8运行jdk7的代码Java 7,TreeSet和NullPointerException。 最近,我尝试用Java 7编译一个用Java 6开发的项目。在执行测试过程中发生了很多有趣的事情,在Java 6中使用Java 7平稳运行的测试失败了! 因此,我必须理解为什…

zen of python什么意思_如何理解「The Zen of Python」?

import thisThe Zen of Python, by Tim PetersPython之禅 ,by Tim PetersBeautiful is better than ugly.优美好于丑陋(Python 以优美的代码为其风格,不要写丑陋的代码)Explicit is better than implicit.明了好于隐晦(Python的每一行代码、每一个变量、…

linux用pipe创建的文件类型,linux文件类型之 管道

inux管道管道是Linux中很重要的一种通信方式,是把一个程序的输出直接连接到另一个程序的输入,常说的管道多是指无名管道,无名管道只能用于具有亲缘关系的进程之间,这是它与有名管道的最大区别。有名管道叫namedpipe或者FIFO(先进先出),可以用函数mkfifo(…

Spring Webflux – Kotlin DSL –实现的演练

在先前的博客文章中,我描述了Spring Web Framework中的响应式编程支持Spring Webflux如何使用基于Kotlin的DSL使用户能够以非常直观的方式描述路由。 在这里,我想探索一些底层实现。 描述一组端点的样本DSL看起来像这样: package sample.ro…

python 正则表达式提取数据_Python爬虫教程-19-数据提取-正则表达式(re)

本篇主页内容:match的基本使用,search的基本使用,findall,finditer的基本使用,匹配中文,贪婪与非贪婪模式Python爬虫教程-19-数据提取-正则表达式(re)正则表达式:一套规则,可以在字符串文本中进…

c语言作业请输入一个运算符,C语言书面作业1(有答案版)..doc

C语言书面作业1(有答案版).书面作业1(数据类型、变量、输入/输出、运算符与表达式、选择结构、循环结构)一、判断题:在正确的说法前面填写T,在错误的说法前面填写F(每题1分)[得分: ]()()()()标识符中可以出现下划线但它不可以放在标识符的开头…

windows server 驱动精灵_还在用Windows文件共享?我来教你一键摆脱Windows海量小文件使用和备份的噩梦...

每当我问到客户,“你用什么存储产品作为文件共享?”经常听到的一个答案(自豪滴)是,“文件共享需要存储么?我们用Windows就可以做到。”Windows就是个百宝箱,什么都能往里装,就像你家冰箱一样。众所周知&…

c语言编写日历作业,c语言实现一个简单日历

满足三个需求:1.输入一个年份,输出是在屏幕上显示该年的日历。假定输入的年份在1940-2040年之间。2.输入年月,输出该月的日历。3.输入年月日,输出距今天还有多少天,星期几,是否是公历…

将EntityManager.refresh添加到所有Spring数据存储库

在我以前的文章《从Spring Data JPA访问EntityManager》中,我展示了如何扩展单个Spring Data JPA存储库以访问EntityManager.refresh方法。 这篇文章演示了如何将EntityManager.refresh添加到所有Spring Data Repository。 源代码 第一步是定义您的界面- package …

pb 应用 迁移 linux_功能化生物炭应用研究取得系列进展

土壤营养元素流失、重金属污染是当前全球面临的突出环境问题。生物炭因其具有比表面积较大、吸附性能高和成本低等优点而在环境修复领域日益受到广泛关注,被作为水处理吸附剂、土壤修复改良剂广泛应用于农业土壤改良和环境中重金属的修复和钝化。但通常情况下&#…

Java命令行界面(第26部分):CmdOption

由于Tweet,我了解了本系列中第26个基于Java的功能强大的库,该库用于解析命令行参数 。 CmdOption在其GitHub主页上被描述为“一个通过注释配置的,用于Java 5应用程序的简单注释驱动的命令行解析器工具包。” 该项目的副标题是“命令行解析从未…

vector c++ 赋值_面对拷贝赋值时发生的自我赋值的正确态度时接受而不是防止

C.62: Make copy assignment safe for self-assignmentC.62:保证拷贝赋值对自我赋值安全Reason(原因)If x x changes the value of x, people will be surprised and bad errors will occur (often including leaks).如果xx改变了x的值,人们会觉得很奇怪&#xff0…

c语言字符流缓冲区,深入理解C语言的IO及缓冲操作

http://www.shangxueba.com/jingyan/1837313.html2014与文件I/O围绕文件描述符操作不同,标准I/O的操作是围绕流进行的。流:对于流,《C和指针》里有一段解释得很好:ANSI C进一步对I/O的概念进行了抽象。就C程序而言,所有…

maven插件依赖_当Maven依赖插件位于

maven插件依赖问题: 我们进行了一个集成测试,该测试创建了一个Spring ClassPathXmlApplicationContext ,同时这样做导致NoSuchMethodError爆炸。 事实证明,我们对Spring构件的依赖版本存在冲突。 这本身不是一个不寻常的问题-使用…

华为编程规范_华为 Java 编程规范出炉,究竟和官方文档有何不同?

来源:blog.csdn.net/chenleixing/article/details/441739851、引言这个标准是衡量代码本身的缺陷,也是衡量一个研发人员本身的价值。华为作为一家全球化的 IT 公司,十几万员工,无论是人事管理,还是代码管理&#xff0c…