Java 使用retryWhen()重试可观察对象
我正在实现一个可观察的,在延迟5秒后重试错误。我正在使用网络改造。我面临的问题是,当API返回错误时,会有很多次重试。我只想在5秒后重试,但是重试的速度非常快(几乎一秒钟三次)。知道为什么吗Java 使用retryWhen()重试可观察对象,java,android,rx-java,observable,rx-java2,Java,Android,Rx Java,Observable,Rx Java2,我正在实现一个可观察的,在延迟5秒后重试错误。我正在使用网络改造。我面临的问题是,当API返回错误时,会有很多次重试。我只想在5秒后重试,但是重试的速度非常快(几乎一秒钟三次)。知道为什么吗 userAPI.getUsers() .filter { it.users.isNotEmpty() } .subscribeOn(Schedulers.io()) .retryWhen { errors -> errors.flatMap { errors.
userAPI.getUsers()
.filter { it.users.isNotEmpty() }
.subscribeOn(Schedulers.io())
.retryWhen { errors -> errors.flatMap { errors.delay(5, TimeUnit.SECONDS) } }
.observeOn(AndroidSchedulers.mainThread())
.subscribe({}, {})
其中userAPI.getUsers()
返回一个可观察的
API请求数量惊人:
08-13 12:31:31.308 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo
08-13 12:31:31.825 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo
08-13 12:31:32.370 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo
08-13 12:31:32.897 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo
08-13 12:31:33.436 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo
08-13 12:31:33.952 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo
08-13 12:31:34.477 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo
08-13 12:31:35.020 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo
08-13 12:31:35.609 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo
08-13 12:31:36.205 26277-26453/com.app.user.dummy D/OkHttp: --> GET https://userapi.com/foo
注:我已经浏览了Dan lew关于retryWhen和repeatWhen的博文。问题似乎在于你的flatmap函数lambda,即
.retryWhen({ errors -> errors.flatMap { errors.delay(5, TimeUnit.SECONDS) } })
(我认为缺少括号是一种打字错误)。结果是,传递给retryWhen的可观察对象立即终止,从而在出现错误时导致“疯狂”的重试率
试一试
问题似乎出在flatmap函数lambda中,即
.retryWhen({ errors -> errors.flatMap { errors.delay(5, TimeUnit.SECONDS) } })
(我认为缺少括号是一种打字错误)。结果是,传递给retryWhen的可观察对象立即终止,从而在出现错误时导致“疯狂”的重试率
试一试
请再次查看Dan Lew的博客文章,他在Uses标题下为您的用例描述了一个解决方案
source.retryWhen(errors->errors.flatMap(error->Observable.timer(5,TimeUnit.SECONDS)))
说明:
请注意可观察到的延迟
和可观察到的计时器
之间的区别,因为可观察到延迟
的文档说明
来自源可观察对象的错误通知不会延迟
在Retry中,当您的
错误
可观察立即订阅时(作为可观察。延迟
仅延迟onNext),然后源错误再次出现并立即发出错误,这将触发retryWhen,您将进入递归循环 请再次查看Dan Lew的博客文章,他在文章的Uses标题下为您的用例描述了一个解决方案
source.retryWhen(errors->errors.flatMap(error->Observable.timer(5,TimeUnit.SECONDS)))
说明:
请注意可观察到的延迟
和可观察到的计时器
之间的区别,因为可观察到延迟
的文档说明
来自源可观察对象的错误通知不会延迟
在Retry中,当您的
错误
可观察立即订阅时(作为可观察。延迟
仅延迟onNext),然后源错误再次出现并立即发出错误,这将触发retryWhen,您将进入递归循环 为什么会这样?“试试这个”答案通常没有真正的帮助,除非你解释什么是不同的,以及原始帖子没有正确执行flatMap()
的原因。用@johnowus所描述的方式修复这个错误会使问题消失。为什么会这样呢?“试试这个”答案通常没有真正的帮助,除非你解释什么是不同的,以及原始帖子没有正确执行flatMap()
的原因。以@johnwows描述的方式修复该错误应该可以解决问题。