gpt4 book ai didi

rx-java - 在 rxjava 中重试缓冲区

转载 作者:行者123 更新时间:2023-12-05 05:10:29 27 4
gpt4 key购买 nike

一个热的 Observable 发射项目。我想将这些项目上传到服务器。有两个注意事项:

  1. 由于 io 操作的费用,我想对这些项目进行批处理并作为数组上传
  2. 由于 io 操作的不可靠性,我希望将失败的批处理上传添加到下一批处理。
Uploads succeed:
1 - 2 - 3 - 4 - 5
------------------
u(1,2,3) - u(4,5)

First upload fails:
1 - 2 - 3 - 4 - 5
------------------
u(1,2,3) - u(1,2,3,4,5)

我可以通过使用 buffer 运算符来满足第一个要求,但不知道如何满足第二个要求。

最佳答案

这是我在队列中存储失败的想法

public class StackOverflow {

public static void main(String[] args) {
// store any failures that may have occurred
LinkedBlockingQueue<String> failures = new LinkedBlockingQueue<>();

toUpload()
// buffer however you want
.buffer(5)
// here is the interesting part
.flatMap(strings -> {
// add any previous failures
List<String> prevFailures = new ArrayList<>();
failures.drainTo(prevFailures);
strings.addAll(prevFailures);

return Flowable.just(strings);
})
.flatMapCompletable(strings -> {
// upload the data
return upload(strings).doOnError(throwable -> {
// if its an upload failure:
failures.addAll(strings);
});
}).subscribe();
}

// whatever your source flowable is
private static Flowable<String> toUpload() {
return Flowable.fromIterable(Arrays.asList("a", "b", "c", "d", "e", "f", "g", "h", "i"));
}

// some upload operation
private static Completable upload(List<String> strings) {
return Completable.complete();
}
}

这里的一些边缘情况是事实,如果最后一个可流动缓冲组失败,这将不会重试那些。这可以通过 retryWhen 运算符来实现,但基本思想与使用队列相同

关于rx-java - 在 rxjava 中重试缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56596146/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com