【问题标题】:What's the right way to use toBlocking() in Couchbase Java SDK?在 Couchbase Java SDK 中使用 toBlocking() 的正确方法是什么?
【发布时间】:2016-02-12 17:04:59
【问题描述】:

这里是 Couchbase 新手,使用 Couchbase Server v4.0.0 和 Java SDK v2.2.3。我有以下代码用于运行查询

Observable
            .defer(new Func0<Observable<AsyncN1qlQueryResult>>() {
                @Override
                public Observable<AsyncN1qlQueryResult> call() {
                    return bucket.async().query(query);
                }
            })
            .flatMap(new Func1<AsyncN1qlQueryResult, Observable<AsyncN1qlQueryRow>>() {
                @Override
                public Observable<AsyncN1qlQueryRow> call(AsyncN1qlQueryResult result) {
                    return result.rows();
                }
            })
            .map(new Func1<AsyncN1qlQueryRow, JsonObject>() {
                @Override
                public JsonObject call(AsyncN1qlQueryRow row) {
                    return row.value();
                }
            })
            .toList()
            .toBlocking()
            .firstOrDefault(null);

query 预计会返回两个结果,我可以保证它没有任何问题。但是,如果我让它运行,这个表达式的计算结果为 null。我怀疑我切换到阻塞 observables 的方式或者延迟可能有问题。

一个有趣的观察是,如果我在调试模式下运行它并在return bucket.async().query(query); 行设置断点并每次使用调试器跳过它,我总是会得到一个包含 2 个元素的列表。 (只是另一个证明查询不是罪魁祸首的证据。)

有人能看出我的习语有什么问题吗?

【问题讨论】:

  • 可以用doOnNext打印每一步的结果吗?
  • 我看不出代码有什么问题,除了在 2.2.x 中你真的不需要初始延迟。
  • 如果您删除firstOrDefault 并返回一个列表,您会得到什么?你的清单是空的吗?还可以查看AsyncN1qlQueryResult 对象的内部——您可以在N1qlMetrics 对象中的flatMap 访问有关您的结果的数据。

标签: java couchbase rx-java reactive-programming


【解决方案1】:

虽然我不知道您的 N1QL,但请检查以下内容:

  1. 你不应该以Observable.defer()开头;只需从asyncBucket.query() 开始,因为asyncBucket.query(q)syncBucket.async().query(q) 已经以延迟方式实现。
  2. singleOrDefault()toList() 一起使用时是相关的。 (但是,在这种情况下可能无关紧要。)

【讨论】:

    猜你喜欢
    • 2017-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-06
    • 1970-01-01
    • 2012-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多