Rx java rxjava中的重试缓冲区
一个热的可观测物体发射出物体。我想将这些项目上载到服务器。 有两个考虑因素:Rx java rxjava中的重试缓冲区,rx-java,rx-java2,buffering,Rx Java,Rx Java2,Buffering,一个热的可观测物体发射出物体。我想将这些项目上载到服务器。 有两个考虑因素: 由于io操作的费用,我想批处理这些项目并作为数组上载 由于io操作的不可靠性,我希望将失败的批上载预先添加到下一批 我可以使用buffer操作符处理第一个问题,但不知道如何满足第二个要求 我的想法是将故障存储在队列中 公共类堆栈溢出{ 公共静态void main(字符串[]args){ //存储可能发生的任何故障 LinkedBlockingQueue失败=新建LinkedBlockingQueue(); 图普洛德()
我可以使用
buffer
操作符处理第一个问题,但不知道如何满足第二个要求 我的想法是将故障存储在队列中
公共类堆栈溢出{
公共静态void main(字符串[]args){
//存储可能发生的任何故障
LinkedBlockingQueue失败=新建LinkedBlockingQueue();
图普洛德()
//你想怎么缓冲就怎么缓冲
.缓冲区(5)
//这是有趣的部分
.flatMap(字符串->{
//添加任何以前的故障
List prevFailures=新建ArrayList();
失败。拖入(失败前);
strings.addAll(prevFailures);
返回可流动。仅(字符串);
})
.flatMapCompletable(字符串->{
//上传数据
返回上载(字符串).doOnError(可丢弃->{
//如果上传失败:
failures.addAll(字符串);
});
}).subscribe();
}
//不管你的源头是什么
专用静态可流动toUpload(){
返回Flowable.fromIterable(数组.asList(“a”、“b”、“c”、“d”、“e”、“f”、“g”、“h”、“i”);
}
//一些上传操作
私有静态可完成上传(列表字符串){
返回Completable.complete();
}
}
这里的一些边缘情况表明,如果最后一个可流动缓冲组失败,则不会重试这些操作。这可以通过
retryWhen
操作符来实现,但基本思想与使用队列的基本思想相同这可能会起作用,但我不会接受它作为答案,因为它违反了很多关于观察值和合成的理解。你说的违反是什么意思?如果你在寻找唯一的答案,我想不出答案
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)