带有couchbase的rxjava是否为非批量操作提供价值

里昂

新的Couchbase SDK使批量操作易于使用,性能更高,使用rx-java。但是使用rx对单个值进行运算是否有任何价值?

如果我们看一个简单的CAS /插入操作,即如果该值存在,请执行cas else执行插入操作并返回文档值

    final String id = "id";
    final String modified = "modified";
    final int numCasRetries = 3;

    Observable
        .defer(() -> bucket.async().get(id))
        .flatMap(document -> {
            try {
                if (document == null) {
                    JsonObject content = JsonObject.create();
                    content.put(modified,  new Date().getTime());
                    document = bucket.insert(JsonDocument.create(id, content));
                } else {
                    document.content().put(modified, new Date().getTime());
                    document = bucket.replace(document);
                }
                return Observable.just(document);
            } catch (CASMismatchException e) {
                return Observable.error(e);
            }
        })
        .retry((count, error) -> {
            // Only retry on CASMismatchException
            return ((error instanceof CASMismatchException)
                    && (count < numCASRetries));
        })
         .onErrorResumeNext(error -> {
            return Observable.error(new Exception(error));
        })
        .toBlocking()
        .single();

因此toBlocking将阻塞调用线程,直到结果可用为止。并且一次只能从Couchbase写入和读取一个值。所以我不明白为什么或者即使这段代码会比

    final String id = "id";
    final String modified = "modified";
    final int numCasRetries = 3;

    JsonDocument document = null;
    for (int i = 1; i <= numCasRetries; i++) {
        document = bucket.get(id);
        try {
            if (document == null) {
                JsonObject content = JsonObject.create();
                content.put(modified,  new Date().getTime());
                document = bucket.insert(JsonDocument.create(id, content));
            } else {
                document.content().put(modified, new Date().getTime());
                document = bucket.replace(document);
            } 
            return document;
        } catch (CASMismatchException e) {
            if (i == numCasRetries) {
                throw e;
            }
        }
    }

如果有什么话,我认为在这种情况下,rx方法的可读性较差。

西蒙·巴斯勒(Simon Basle)

对于最终需要阻止的单个文档操作,我倾向于同意您的第二个示例更加清晰。

当您大量使用异步处理时,尤其是当您需要高级错误处理,重试场景,异步流的组合时,RxJava会大放异彩。

上一代的Couchbase Java SDK(1.4.x)就是Future为此而提供的,它没有提供RxJava中所提供的优雅,强大和富于表现力的功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有couchbase的rxjava是否为非批量操作提供价值

来自分类Dev

Couchbase中的批量操作失败

来自分类Dev

Couchbase中的批量操作失败

来自分类Dev

是否有任何CMS为所有数据操作提供JSON

来自分类Dev

带有Spring Boot的SPA-为非API请求提供index.html

来自分类Dev

为带有标签的图标图像提供替代文本是否有意义?

来自分类Dev

带有arrayFilters的Node.js MongoDB批量操作UpdateOne

来自分类Dev

没有为属性 [CO] 提供转化价值

来自分类Dev

带有PKCS11Interop的AWS CloudHSM PKCS#11为Wrap操作CKR_ARGUMENTS_BAD提供错误

来自分类Dev

动态为CSS提供价值

来自分类Dev

动态为CSS提供价值

来自分类Dev

Cassandra是否为非幂等操作创建提示?

来自分类Dev

带有 kotlin 的 Rxjava

来自分类Dev

为带有对象的 foreach() 提供的 PHP 无效参数(SimpleXMLElement)

来自分类Dev

HealthKit提供的血糖价值为零

来自分类Dev

PyTorch为标量提供了不同的价值

来自分类Dev

HealthKit提供的血糖价值为零

来自分类Dev

EsHadoopException:无法为批量操作写入所有条目 Spark Streaming

来自分类Dev

Hazelcast是否支持批量设置或异步批量放置操作?

来自分类Dev

Hazelcast是否支持批量设置或异步批量放置操作?

来自分类Dev

MongoDB更新操作是否支持批量提交?

来自分类Dev

如何测试STDIN是否为批量终端?

来自分类Dev

如何测试STDIN是否为批量终端?

来自分类Dev

批量乘法结果是否为负值?

来自分类Dev

检查文本框是否有价值,使其他文本框为必需

来自分类Dev

检查文本框是否有价值,使其他文本框为必需

来自分类Dev

Delphi 是否为简单的常见操作提供编译器生成的代码?

来自分类Dev

带有应用引擎端点的批量插入

来自分类Dev

带有批量删除/更新的Django信号

Related 相关文章

  1. 1

    带有couchbase的rxjava是否为非批量操作提供价值

  2. 2

    Couchbase中的批量操作失败

  3. 3

    Couchbase中的批量操作失败

  4. 4

    是否有任何CMS为所有数据操作提供JSON

  5. 5

    带有Spring Boot的SPA-为非API请求提供index.html

  6. 6

    为带有标签的图标图像提供替代文本是否有意义?

  7. 7

    带有arrayFilters的Node.js MongoDB批量操作UpdateOne

  8. 8

    没有为属性 [CO] 提供转化价值

  9. 9

    带有PKCS11Interop的AWS CloudHSM PKCS#11为Wrap操作CKR_ARGUMENTS_BAD提供错误

  10. 10

    动态为CSS提供价值

  11. 11

    动态为CSS提供价值

  12. 12

    Cassandra是否为非幂等操作创建提示?

  13. 13

    带有 kotlin 的 Rxjava

  14. 14

    为带有对象的 foreach() 提供的 PHP 无效参数(SimpleXMLElement)

  15. 15

    HealthKit提供的血糖价值为零

  16. 16

    PyTorch为标量提供了不同的价值

  17. 17

    HealthKit提供的血糖价值为零

  18. 18

    EsHadoopException:无法为批量操作写入所有条目 Spark Streaming

  19. 19

    Hazelcast是否支持批量设置或异步批量放置操作?

  20. 20

    Hazelcast是否支持批量设置或异步批量放置操作?

  21. 21

    MongoDB更新操作是否支持批量提交?

  22. 22

    如何测试STDIN是否为批量终端?

  23. 23

    如何测试STDIN是否为批量终端?

  24. 24

    批量乘法结果是否为负值?

  25. 25

    检查文本框是否有价值,使其他文本框为必需

  26. 26

    检查文本框是否有价值,使其他文本框为必需

  27. 27

    Delphi 是否为简单的常见操作提供编译器生成的代码?

  28. 28

    带有应用引擎端点的批量插入

  29. 29

    带有批量删除/更新的Django信号

热门标签

归档