Rx java 出错后在同一项目上重试

Rx java 出错后在同一项目上重试,rx-java,Rx Java,我试图用RXJava构建一个健壮的处理管道,但遇到了一个问题 以下是一个例子: public static void main(String[] args) { AtomicInteger div = new AtomicInteger(-1); Observable.just(1, 1, 1).map(item -> 1 / div.getAndIncrement()) .retry().subscribe(item -> System.ou

我试图用RXJava构建一个健壮的处理管道,但遇到了一个问题

以下是一个例子:

public static void main(String[] args) {
    AtomicInteger div = new AtomicInteger(-1);
    Observable.just(1, 1, 1).map(item -> 1 / div.getAndIncrement())
            .retry().subscribe(item -> System.out.println(item));
}
本例中的输出是4项,因为不可观察的流会被重放,但这并不相关,所以为了简单起见,请忽略它。我添加了一些注释,说明计算结果和重新订阅的点:

-1 // 1 / -1
// 1/0 (error) - resubscribes to observable
1 // 1 / 1
0 // 1 / 2
0 // 1 / 3
这是因为
重试
操作符(与所有重试操作符一样)在传递错误通知后会导致重新订阅

我的预期产出是:

-1 // 1 / -1
// 1/0 (error) - resubscribe but resume erroneous item (1)
1 // 1 / 1
0 // 1 / 0
当传递错误通知时,重新订阅过程应该在流中包含错误项(对同一项重试)——因为错误是外部的,并且没有嵌入到已处理的项中(因此重新处理是有意义的)

这是一个外部错误(如数据库连接)的例子,我希望未处理的项目能够延迟重新处理。我知道使用标准的重试操作符可以重新订阅,但他们都放弃了错误的项目

我还考虑过在try-catch中包装我的所有处理,我怀疑可能会出现错误,但在我的处理代码中添加了样板代码,我不愿意这样做

因此,我的问题是:是否有一种标准方法可以重试失败的项目

我已经考虑过这样做(未经测试):

并抑制错误

但这似乎是不自然的,在我的用例中是昂贵的(为每个项目创建一个可观察的对象)

是否有运算符或运算符组合可以导致重试将错误项传递回可观察项的开头,而不会“中断”或将该项包装到不同的可观察项中


这也是我习惯使用的重试样式。

这在RxJava中通常是不可能的。如果某个元素的处理失败,则没有从该位置恢复的内置方式。您所能做的最好的事情就是尝试捕获有问题的函数回调,然后手动重试。第二个最好的方法是使用
flatMap
,其中可能存在问题的计算是可以单独重试的内部
可观察的

source.flatMap(v ->
    Observable.just(v).map(v -> v / counter.getAndIncrement()).retry()
)

谢谢这就是我所怀疑的。@akarnokd我想编辑我传递给concat的列表,这取决于我是否得到错误,即未经授权的内容,所以我修改并重试,但我在迭代时尝试修改时得到ConcurrentModificationException。你有解决办法吗。完整问题:谢谢
source.flatMap(v ->
    Observable.just(v).map(v -> v / counter.getAndIncrement()).retry()
)