Observable
.from(couchbaseDocuments)
.subscribeOn(Schedulers.io())
.flatMap(docToInsert->asyncBucket.insert(docToInsert))
.retryWhen(RetryBuilder.anyOf(TemporaryFailureException.class).delay(Delay.exponential(TimeUnit.MILLISECONDS, 5)).max(3).build())
.map(doc->convertToJava(JsonObject.fromJson(doc.content()),CouchbaseEntity.class).getId())
.toBlocking()
.forEach(id->insertedIds.add(id));
要求:
我是RxJava的新手。我写了上面的react代码,但是似乎我还不太清楚一些概念。 我的想法是,最后的forEach将始终获取发出的项目,如果发生异常,我将捕获该项目,然后在以后使用insertdIds列表创建第二个文档。但是,列表中总是包含所有不符合我要求的ID。
任何人都可以解释代码有什么问题以及如何实现上述要求吗?
答案 0 :(得分:1)
retry
方法将重新订阅上游Observable
。
在您的情况下,这意味着订阅couchbaseDocuments
,并可能尝试重新插入已经成功插入的文档。
您可能希望只重试失败的插入内容,而不是重试整个流:
Observable
.from(couchbaseDocuments)
.subscribeOn(Schedulers.io())
.flatMap(docToInsert->asyncBucket.insert(docToInsert).retryWhen(...))
.map(doc->convertToJava(JsonObject.fromJson(doc.content()),CouchbaseEntity.class).getId())
.toBlocking()
.forEach(id->insertedIds.add(id));
本质上:您必须移动单个括号。