4

在使用了一些 Couchbase (2.4.1) 的 java 客户端 API 之后,我遇到了这个异常:

Error in scheduled task java.lang.IllegalStateException: 
The Content of this Observable is already released. 
Subscribe earlier or tune the CouchbaseEnvironment#autoreleaseAfter() setting.

我在命令模式下使用 ViewQuery,从结果中获取行时失败(ViewResult 是正确的,因为 totalRows() 和 success() 有很好的值)

ViewResult result = service.executeViewQuery(...);
List<ViewRow> rows = result.allRows();

有效设置 autoreleaseAfter 解决了问题,但我不知道它是否安全或只是回避问题。

CouchbaseEnvironment env = DefaultCouchbaseEnvironment
            .builder()
            .autoreleaseAfter(5000)
            .build();

我猜这种模式不会在查询后关闭连接,它让它一直存在,直到达到超时(5 秒)。

如果 http 调用完成(使用 Spring MVC),它会自动“提前”关闭吗?似乎这种模式带来了危险,因为它可以容纳更多的连接,但这真的很重要吗?

最后,我觉得这个 API 的“正确”使用是通过 rxjava Observable API,而发现的大多数文档只显示了命令式示例。自动释放模式是否已过时(并且将被弃用)还是在不久的将来仍会受到支持?

4

1 回答 1

4

在研究这个主题时,我在这里发现了另一个案例,在 Couchbase 中出现了类似的错误。

默认情况下,autoReleaseAfter() 设置为 2000 毫秒。我猜默认时间窗口不足以让您的订阅者订阅 Observable,这会导致您的 Observable 的内容被自动发布以防止泄漏。在您的情况下,手动将其设置为 5000 毫秒就足够长了。不幸的是,我不知道它是否有任何副作用。

我很确定 autoReleaseAfter() 不会很快弃用。如果是这种情况,它会在Couchbase 源代码文档中注明(在页面末尾,搜索“Automatic Observable Resource Release Time Period”)。

我认为您应该将此错误报告给 Couchbase 开发人员。

于 2017-01-31T13:46:34.237 回答