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

gitlab10.x迁移

标题不是错误。 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更改无关,区别更加深刻。

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

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

gitlab10.x迁移

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

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

相关文章

ubuntu安装与配置mysql_ubuntu下mysql的安装与配置

安装MySQL sudo apt-get install mysql-server 这个应该很简单了,而且我觉得大家在安装方面也没什么太大题目,所以也就未几说了,下面我们来讲讲配置。 配置MySQL 留意,在Ubuntu下MySQL缺省是只安装MySQLsudo apt-get install mysq…

Servlet 处理多种请求应用

一个 Servlet 如何处理多种请求? 1.使用后缀匹配模式 2.在 service 方法中获取请求资源路径,分析资源路径来决定作何处理 示例代码如下: package priv.lwx.javaex.web_demo_02.web.servlet;import javax.servlet.http.HttpServlet; import javax.serv…

小程序搜索框_微信小程序搜索及优化相关知识科普

生活中我们常常会用到微信小程序,但很多人不知道该如何搜索、找到小程序;而有些已经做了自己的小程序的商家,也不懂怎么提升自己的微信小程序搜索效果。所以下面就跟大家科普下这两个问题。1.怎么搜索微信小程序打开微信,点击右上…

java 函数式编程 示例_功能Java示例 第1部分–从命令式到声明式

java 函数式编程 示例功能编程(FP)的目的是避免重新分配变量,避免可变的数据结构,避免状态并全程支持函数。 如果将功能性技术应用于日常Java代码,我们可以从FP中学到什么? 在这个名为“ Functional Java …

su联合推拉插件_[实习小记一一SU建模]

鉴于本菜鸡在实习阶段一直在SU建模,那就讲讲我在SU建模的心路历程吧。本菜鸡之前还是SU小白时(俗称白斩鸡,并且现在也很白),只会死命地用推拉。来到公司初探SU,第一个高层建筑便花费我半个月的时间(我突然想起有一篇日记特别好笑我是个SU人&a…

Linux 命令之 tar 命令-打包和备份的归档工具(附压缩/解压工具)

文章目录一、命令介绍二、命令语法三、常用选项四、命令示例(一)对指定的目录进行打包(即备份归档),不压缩(二)对指定目录下的内容(不含目录本身)进行打包(即…

纹理和基元_通过粘性仙人掌基元进行延迟加载和缓存

纹理和基元您显然知道什么是延迟加载 ,对吗? 而且您无疑知道缓存 。 据我所知,Java中没有一种优雅的方法来实现它们中的任何一个。 这是我在Cactoos原语的帮助下为自己找到的。 Matteo Garrone的《 Reality》(2012年)…

oracle 造数据脚本_Oracle数据库shell脚本--统计所有数据库用户信息及明细

概述今天主要分享一下两个shell脚本,主要是为了查看所有数据库用户及其表空间,统计某个指定用户的明细,下面一起来看看吧~数据库连接脚本use script settdb.sh for DB login details registry#!/bin/bashtmp_username$SH_USERNAMEtmp_passwor…

学维修电脑要多久_学厨师要多久才出师

学厨师一般要学多久?以苏州新东方学厨师为例:厨师培训可以分为长期、短期。中餐、西餐、西点长期专业学习时间1-3年不等;短期专业从7天到8个月不等,主要是按学习内容来划分,比如学苏式汤面,只需要半个月左右…

Linux 命令之 rpm -- RPM 软件包的管理工具

文章目录一、命令介绍二、语法结构三、常用选项用于查询和检查包用于安装、升级和删除包用于执行其他功能四、命令示例(一)查询和检查包1. 查看一个已安装包的信息(版本、用途等)2. 查看与指定程序相关的所有安装文件3. 查看一个已…

react核心虚拟dom_使用虚拟时间测试基于时间的React堆核心流

react核心虚拟domReactor Core实现了Reactive Streams规范,并处理了(可能无限的)数据流。 如果您感兴趣,请查看它提供的出色文档 。 在这里,我假设对Reactor Core库的Flux和Mono类型有一些基本的了解,并且将…

图书管理系统python语言-Python简易版图书管理系统

本文实例为大家分享了python图书管理系统的具体代码,供大家参考,具体内容如下 """ 图书管理系统 """ import random # books{书名:剩余数量, 书名:剩余数量} import time books {"防脱发指南": 5, "颈椎康…

docker 打包mysql_基于docker部署mysql的数据持久化问题

本人最近在使用docker部署mysql时,在持久化mysql数据时遇到了一个有趣的问题,将排查过程及思考记录在这里,以备后查。先简单描述下我遇到的问题:在mysql容器中创建了两个数据库,然后使用docker commit想要保存容器的修…

Linux 命令之 ls -- 列出指定目录下的内容

文章目录一、命令介绍二、语法格式三、常用选项四、参考示例(一)显示工作目录下(当前目录)所有的文件和目录(二)显示工作目录下所有的文件和目录(三)显示文件的详细信息,…

kotlin dsl_Spring Webflux – Kotlin DSL –实现的演练

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

cad调了比例因子没反应_「室内设计」大神们都在用的9个CAD制图技巧,你会用几个?...

1、快捷特性面板如何调取?2、 如何快速恢复上一次删除物体?3、 如何快速关闭监视注释器?4、如何快速处理重复碎线?5、如何解决虚线在模型空间和布局空间显示不一致的问题?6、 如何快速更改图块名称?7、 PL线…

ubuntu 12下的apache+php+mysql_老司机传授Ubuntu下Apache+PHP+MySQL环境搭建攻略

一、首先安装MySql:对于MySql来讲在整个过程中是相对独立的安装,并且我的ubuntu在以前做开发的时候就已经安装了MySql,所以以下只给出安装步骤:1、安装MySql的服务:sudo apt-get install mysql-server要注意的是安装过…

Linux 命令之 mv -- 移动文件/重命名文件

文章目录命令介绍语法格式常用选项命令示例(一)文件重命名(二)目录重命名(三)移动目录(四)移动目录且重命名(五)将一个目录下的内容移动到另外一个目录下&…

jax-rs jax-ws_迟来总比没有好:SSE或服务器发送的事件现在已在JAX-RS中

jax-rs jax-ws服务器发送的事件 (或简称为SSE )是非常有用的协议,它允许服务器通过HTTP将数据推送到客户端。 这是我们的Web浏览器支持的年龄,但是令人惊讶的是, JAX-RS规范在很长一段时间内都忽略了这一点。 尽管Jers…

根据录入的计算公式计算_小规模纳税人增值税计算公式是什么,什么人能被称为小规模纳税人?- 理财技巧...

摘要: 想必大家都知道小规模纳税人在增值税的缴纳上能够享受到不少的优惠措施和政策,最终可以少交不少钱!那么什么人能被称为小规模纳税人呢?小规模纳税人增值税计算公式又是什么呢?下面赢家财富网就带大家详细了解一下…