下面我们就来演示如何通过RxJava2来轻松实现上面的三点需求,通过这篇文章,我们将学习retryWhen操作符的具体用法,retryWhen和repeatWhen经常被大家用来比较,如果对repeatWhen...实现retryWhen的关键在于如何定义它的Function参数: Function的输入是一个ObservableThrowable>,输出是一个泛型ObservableSource。...2.2 retryWhen 和 repeatWhen 对比 在 RxJava2 实战知识梳理(5) - 简单及进阶的轮询操作 中我们已经对repeatWhen进行了介绍,让我们再来看一下它的原理图...2.3 根据 Throwable 的类型选择响应的重试策略 由于上游可以通过onError(Throwable throwable)中的异常通知retryWhen,那么我们就可以根据异常的类型来决定重试的策略...就像我们在上面例子中做的那样,我们通过flatMap操作符获取到异常的类型,然后根据异常的类型选择动态地决定延迟重试的时间,再用Timer操作符实现延迟重试;当然,对于一些异常,我们可以直接选择不重试,
在我们的日常开发中离不开I/O操作,尤其是网络请求,但并不是所有的请求都是可信赖的,因此我们必须为APP添加请求重试功能。...一个合理的重试策略应该是:遇到网络异常时应该等待一段时间后再重试,若遇到的异常次数越多,等待(退避)的时间就应该越长。...从上面的弹珠图中,我们可以了解到,这两个操作符的区别仅仅是针对不同的“终止事件”来会触发重订阅:.repeat()接收到onCompleted后触发重订阅;而.retry()则是接收到OnError后触发重订阅...回到本篇文章的主题上,我们需要的是在遭遇I/O异常时,发起重试,而不是请求成功时,很明显的.retry()胜出! Retry?RetryWhen!...因此.retry()以及它的重载函数已经不能满足我们的需求了,好在RxJava为我们提供了另一个非常有用的操作符.retryWhen(),我们可以通过判断异常类型,来决定是否发起重试(重订阅)。
功能说明 功能需求说明 注:关于 Rxjava中的retryWhen() 操作符的使用请看文章Android RxJava:功能性操作符 全面讲解 功能逻辑 实例说明 在本例子中:采用Get方法对...()进行重试 // 注:主要异常才会回调retryWhen()进行重试 observable.retryWhen(new FunctionThrowable...> 设置重试次数,则不重试 // 通过发送error来停止重试(可在观察者的onError()中获取信息)...e) { // 获取停止重试的信息 Log.d(TAG, e.toString());...; 等到第3次重试后恢复网络连接,即无发生网络异常错误,此时重试成功 4.
试想如果你要实现一个延迟数秒的重订阅该如何去做?或者想通过观察错误来决定是否应该重订阅呢?...简化后,它包括三个部分: Func1像个工厂类,用来实现你自己的重试逻辑。 输入的是一个ObservableThrowable>。 输出的是一个Observable。...这里有个例子展示了我们应该在哪些场景下订阅source,比如,只有在Throwable是IOException的情况下请求重订阅,否则不(重订阅)。...经验之谈 这里有一些关于.repeatWhen()和.retryWhen()的要点,我们应该牢记于心。...重试三次,并且每一次的重试时间都是5 ^ retryCount,仅仅通过一些操作符的组合就帮助我们实现了指数退避算法(译者注:可参考二进制指数退避算法)。
在源 Observable 遇到错误时,立即停止源 Observable 的数据发送,并用新的 Observable 对象进行新的数据发送。...> { Observable.just(100) }) .subscribe(observerInt) 发射了 0,1 后,会发射 onError,此时使用新的 Observable...super Throwable> predicate) // 两个控制条件都满足时重试 public final Observable retry(long times, PredicateThrowable> predicate) // 参数第一个泛型是重试次数,第二个是错误信息,返回 true 时重试 public final Observable retry(BiPredicate...,返回 true 以停止重试 }.subscribe(observerInt) ob.retryWhen { // 返回的 Observable 还活着就重试 Observable.interval
由于互联网的蓬勃发展,科技技术的不断迭代更新,中国的互联网行业已经步入的世界的前列,因为,我们常常能看到,在各种各样的报道中,程序员都会誉为未来最有发展潜力的职业之一。...如何延长程序员的生命周期 1、写好代码 写好代码,是我们工作的本分,所以,写代码就是程序员的实践,我们需要写代码的过程中,明白什么是优秀的代码,什么是垃圾代码,然后让自己的代码易读易懂,高效,无错。...只要你在看你之前写过的代码时,你觉得羞愧了,那说明你在进步了。 2、别仅仅是代码 我们经常会听到,“Java程序员赚钱比.NET多”,“PHP是世界上最好的语言”。...如果有一天,你在介绍自己的时候,能够加上“XX公司80%的收入,与我的代码有关”这样的话,那将更容易让人理解到你创造的价值。 了解如何创造价值,雇佣你的目的,是让你创造价值,而不仅仅是写代码。...我们经常说,创业一年,等于读了一个3年的MBA,所以,如果你还年轻,经历一下未尝不可。
针对网关非 Get 请求的重试 在之前的系列里面Spring Cloud升级之路 - Hoxton - 5....实现微服务调用重试,我们针对 OpenFeign 和 Spring Cloud Gateway 都设置了重试。 对于 OpenFeign: Get请求:任何非200 响应码,任何异常,都会重试。...的集合内,如果在,看本次请求的 retry_iteration 这个 Attribute 是第几次(从0开始),是否超过了重试次数,如果没超过,就重试,如果超过,停止重试。...retry_iteration 这个 Attribute 是第几次(从0开始),是否超过了重试次数,如果没超过,就重试,如果超过,停止重试。...method, k -> { Map retryConfigMap = apiGatewayRetryConfig.getRetry(); //通过微服务名称,获取重试配置
重试 不是所有的错误都需要立马反馈给用户,比如说在弱网络环境下调用某个接口出现了超时的现象,也许再请求一次接口就能获得数据。那么重试就相当于多给对方一次机会。...在这里,我们使用retryWhen操作符,它将错误传递给另一个被观察者来决定是否要重新给订阅这个被观察者。 听上去有点拗口,直接上代码吧。...如果网络请求失败的话,会调用retryWhen操作符。RetryWithDelay实现了Function接口,RetryWithDelay是一个重试的机制,包含了重试的次数和重试时间隔的时间。...return Flowable.error(throwable); } } }); } } 如果运气好重试成功了,那用户在无感知的情况下可以继续使用产品...在接口定义的返回类型中,我一般喜欢用Maybe、Completable来代替Observable,不了解它们的同学可以看之前的文章RxJava的Single、Completable以及Maybe 我们知道
前言 重试,我相信大家并不陌生。在我们调用Http接口的时候,总会因为某种原因调用失败,这个时候我们可以通过重试的方式,来重新请求接口。...今天我们来简单的了解下Spring Cloud Gateway中的重试机制和使用。...extends Throwable>> exceptions = toList(IOException.class); // ..... } retries:重试次数,默认值是3次 series...,默认值是java.io.IOException 代码测试 就写个接口,在接口中记录请求次数,然后抛出一个异常模拟500,通过网关访问这个接口,如果你配置了重试次数是3,那么接口中会输出4次结果才是对的...) -> { // 获取已经重试的次数,默认值为-1 int iteration = exchange.getAttributeOrDefault
需求场景 在事件发送 & 接收的整个生命周期过程中进行操作 如发送事件前的初始化、发送事件后的回调请求等 对应操作符使用 do() 作用 在某个事件的生命周期中调用 类型 do()操作符有很多个...// 参数 = 重试次数 // 作用:出现错误后,判断是否需要重新发送数据(若需要重新发送& 持续遇到错误,则持续重试)...作用:出现错误后,判断是否需要重新发送数据(具备重试次数限制 // 参数 = 设置重试次数 & 判断逻辑 具体使用 // 作用:出现错误时,让被观察者重新发送数据...()); // 获取当前重试次数 Log.e(TAG, "当前重试次数 = "+integer);...>>() { @Override // 在Function函数中,必须对输入的 Observable进行处理,这里我们使用的是flatMap
3.4 在事件的生命周期中操作 需求场景 在事件发送 & 接收的整个生命周期过程中进行操作 如发送事件前的初始化、发送事件后的回调请求等 对应操作符使用 do() 作用 在某个事件的生命周期中调用...// 参数 = 重试次数 // 作用:出现错误后,判断是否需要重新发送数据(若需要重新发送& 持续遇到错误,则持续重试)...作用:出现错误后,判断是否需要重新发送数据(具备重试次数限制 // 参数 = 设置重试次数 & 判断逻辑 具体使用 // 作用:出现错误时,让被观察者重新发送数据...()); // 获取当前重试次数 Log.e(TAG, "当前重试次数 = "+integer);...>>() { @Override // 在Function函数中,必须对输入的 Observable进行处理,这里我们使用的是flatMap
Scheduler scheduler); 举例: timer() public static Observable timer(long delay, TimeUnit unit); 创建一个在指定延迟时间后发射一条数据...> notificationHandler, Scheduler scheduler); 举例: 3 重试 retry() public final Observable retry(); 在执行...,直到达到重试次数上限,超出次数后发出最新的 onError() 通知。...extends Throwable>, ? extends Observable> notificationHandler); 有条件的执行重试。...使用场景:将从网络获取的数据(NetData 对象)转换为数据库相关对象(DBData对象)并使用 Observable 发送。
=\ com.github.jojotech.spring.cloud.webflux.auto.WebClientAutoConfiguration 在 spring.factories 定义了自动装载的自动配置类...--粘合 project-reactor 与 resilience4j,这个在异步场景经常会用到--> io.github.resilience4j<...增加相关组件: 增加重试器: //由于还是在前面弄好的 spring-cloud 环境下,所以还是可以这样获取配置对应的 retry Retry retry; try { retry = retryRegistry.retry...circuitBreaker.releasePermission(); } } } @Override protected void hookOnError(Throwable...Operator 中增加类似于 FeignClient 中的负载均衡的数据更新,使得负载均衡更加智能 在下面一节我们会详细说明我们是如何实现的有断路器以及重试逻辑和负载均衡数据更新的 WebClient
把业务逻辑放到 onEach 操作符内,在 onEach 之后是 catch 操作符,最后是 collect()。...操作符 像 RxJava 一样,Flow 也有重试的操作符。...public fun Flow.retry( retries: Long = Long.MAX_VALUE, predicate: suspend (cause: Throwable...操作符的参数是谓词,当谓词返回 true 时才会进行重试。...再比如,在借助这些操作符做一些日志的打印。
extends Throwable> clazz : retryConfig.getExceptions()) { if (clazz.isInstance(context.exception...repeat与retry的区别是repeat是在onCompleted的时候会重试,而retry是在onError的时候会重试。这里由于不一定是异常的时候才可能重试,所以加了repeat。...extends Throwable>> exceptions = toList(IOException.class); //.........小结 RetryGatewayFilter借助了reactor-addons的retry组件进行了重试,主要使用了Mono的repeatWhen及retryWhen方法,前者在onCompleted的时候触发...,后者在onError的时候触发。
操作符用法详解 四、RxJava concatMap 操作符用法详解 五、RxJava onErrorResumeNext 操作符实现 app 与服务器间 token 机制 六、RxJava retryWhen...操作符实现错误重试机制 七、RxJava 使用 debounce 操作符优化 app 搜索功能 八、RxJava concat 操作处理多数据源 九、RxJava zip 操作符在 Android...十五、RxJava 线程的自由切换 ---- 一、抛出问题 现在几乎所有的 App 都有搜索功能 , 一般情况我们监听 EditText 控件,当值发生改变去请求搜索接口....二、如何解决问题 使用强大的 RxJava 的 debounce 操作符可以解决这个问题。...但是,还有一个问题,上面说的导致搜索结果的错乱,上面的代码还是没有解决,比如停止输入 400 毫秒后, 那么肯定会开始请求 Search 接口, 但是用户又会输入新的关键字,这个时候上个请求还没有返回,
then()); }).doOnError(e -> e.printStackTrace()) .subscribe(); 上面这个TcpClient,在server....asString().next().log().then()); }).doOnError(e -> e.printStackTrace()) .retryWhen...extends Throwable>... nonRetriableExceptions) { Predicate> predicate = context -> { Throwable exception = context.exception()...extends Throwable> clazz : nonRetriableExceptions) { if (clazz.isInstance(exception))
领取专属 10元无门槛券
手把手带您无忧上云