RxJava:保留在引发异常之前插入在沙发数据库中的对象的部分对象列表

时间:2018-07-23 14:49:04

标签: rx-java couchbase rx-java2 couchbase-java-api

 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));

要求:

  1. 在特定类型的沙发床中批量插入文档。
  2. 创建另一个文档,该文档仅包含我们在第一步中插入的文档的ID
  3. 如果第一步在某个ID上失败,我们将停止插入,那么第二个文档应仅包含那些ID,直到出现异常为止,这些ID都会插入
  4. 通话是同步的

我是RxJava的新手。我写了上面的react代码,但是似乎我还不太清楚一些概念。 我的想法是,最后的forEach将始终获取发出的项目,如果发生异常,我将捕获该项目,然后在以后使用insertdIds列表创建第二个文档。但是,列表中总是包含所有不符合我要求的ID。

任何人都可以解释代码有什么问题以及如何实现上述要求吗?

1 个答案:

答案 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));

本质上:您必须移动单个括号。