Rx java RxJava:保留在抛出异常之前插入couchbase数据库的对象的部分列表

Rx java RxJava:保留在抛出异常之前插入couchbase数据库的对象的部分列表,rx-java,couchbase,rx-java2,couchbase-java-api,Rx Java,Couchbase,Rx Java2,Couchbase Java Api,请求: 在couchbase中批量插入特定类型的文档 创建另一个文档,其中只包含我们在第一步中插入的文档的ID 如果第一步在我们停止插入的某个id处失败,那么第二个文档应该只有在异常发生之前插入的id 呼叫是同步的 我是RxJava新手。我写了上面的react代码,但是似乎我还没有清楚地理解一些概念。 我的想法是,最后的forEach将始终获取发出的项,如果发生异常,我将捕获它,然后使用insertedIds列表创建第二个文档。然而,列表中总是有所有不符合我要求的ID 有谁能解释一下代码有什么问

请求:

  • 在couchbase中批量插入特定类型的文档
  • 创建另一个文档,其中只包含我们在第一步中插入的文档的ID
  • 如果第一步在我们停止插入的某个id处失败,那么第二个文档应该只有在异常发生之前插入的id
  • 呼叫是同步的
  • 我是RxJava新手。我写了上面的react代码,但是似乎我还没有清楚地理解一些概念。 我的想法是,最后的forEach将始终获取发出的项,如果发生异常,我将捕获它,然后使用insertedIds列表创建第二个文档。然而,列表中总是有所有不符合我要求的ID


    有谁能解释一下代码有什么问题,以及我如何达到上述要求吗?

    重试
    方法将重新订阅上游
    可观察的

    在您的情况下,这意味着订阅
    couchbaseDocuments
    ,并可能尝试重新插入已成功插入的文档

    与其再次重试整个流,不如重试失败的插入:

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

    基本上:您必须移动一个括号。

    谢谢,我认为它是有效的。如果我使用subscribe,还有一个问题而不是forEach,它会有同样的效果吗?。使用subscribe,我还获得了onError方法,可以在其中处理异常。是的。使用subscribe更为惯用。如果查看源代码,forEach调用subscribe。您的retryWhen将吞下任何错误,但不会重新显示。是的,您可以在OneError中处理未捕获的异常,但是您将看不到在retryWhen中处理的任何异常,只有未处理的异常,例如,来自重试代码本身的重试、convertToJava或其他异常。好的,我刚刚检查了subscribe for BlockingObservable标记为@Beta。原因是什么?更新到RxJava1的最新版本,或者最好是RxJava2。
     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));