Rx java 在couchbase java sdk 2.7.15上使用异步存储桶升级文档

Rx java 在couchbase java sdk 2.7.15上使用异步存储桶升级文档,rx-java,couchbase,couchbase-java-api,Rx Java,Couchbase,Couchbase Java Api,我有以下代码,使用可观察对象将POJO集合(转换为json文档)升级到couchbase: public <T> long batchUpsert(Iterable<T> items, Function<T, JsonDocument> docCreator, Bucket couchbaseBucket) { AtomicLong counter = new AtomicLong(); AsyncBucket asyncBuck

我有以下代码,使用可观察对象将POJO集合(转换为json文档)升级到couchbase:

    public <T> long  batchUpsert(Iterable<T> items, Function<T, JsonDocument> docCreator, Bucket couchbaseBucket) {

    AtomicLong counter = new AtomicLong();

    AsyncBucket asyncBucket = couchbaseBucket.async();
    Observable<JsonDocument> observableFromDocs =
            Observable
                    .from(items)
                    .map(elem -> docCreator.apply(elem))
                    .filter(elem -> elem!=null)//skip creating problematic docs. logging their info for troubleshooting
                    .flatMap(elem -> upsertDocument(elem, asyncBucket))
                    .retryWhen(
                            RetryBuilder.anyOf(BackpressureException.class, Exception.class)
                                    .doOnRetry((Integer integer, Throwable throwable, Long aLong, TimeUnit timeUnit) ->
                                            log.error("Retrying load. Attempt {} For exception {}", integer,throwable.toString())
                                    )
                                    .delay(Delay.exponential(TimeUnit.MILLISECONDS, RETRY_DELAY_CEILING))
                                    .max(MAX_RETRIES)
                                    .build()
                    );

    observableFromDocs.subscribe(
            (elem)-> {},
            elem -> log.error("Document insertion failure", elem),
            () -> {counter.incrementAndGet();log.debug("Completed ASYNC load ");});

    return counter.get();
}
public long batchUpsert(Iterable项、函数docCreator、Bucket couchbasebook){
AtomicLong计数器=新的AtomicLong();
AsyncBucket AsyncBucket=couchbaseBucket.async();
可观察的可观察的=
可观察
.来自(项目)
.map(elem->docCreator.apply(elem))
.filter(elem->elem!=null)//跳过创建有问题的文档。记录它们的信息以进行故障排除
.flatMap(elem->upsertDocument(elem,asyncBucket))
retryWhen先生(
RetryBuilder.anyOf(backpressureeexception.class,Exception.class)
.doOnRetry((整数、可丢弃、长时间、时间单位)->
log.error(“为异常{}重试加载.尝试{}”,整数,throwable.toString())
)
.delay(delay.index(TimeUnit.ms,重试延迟上限))
.max(最大重试次数)
.build()
);
observeFromDocs.subscribe(
(elem)->{},
元素->日志错误(“文档插入失败”,元素),
()->{counter.incrementAndGet();log.debug(“已完成异步加载”);};
返回计数器get();
}
这段代码运行良好,创建了文档,并对upsert进行了异步调用,但没有文档被upsert到couchbase,它以静默方式失败,没有异常被记录,几乎就像线程在内部死亡一样,有人能指出我做错了什么吗?我正要拔头发……:)


我现在验证了1个项目的集合失败,有人能告诉我为什么会发生这种情况吗?

我认为您的代码不能等待所有异步操作完成,所以这种情况是导致问题的原因 官方sdk有一个批处理操作的示例,该示例说明wait last operation和call block