在使用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();
有效设置自动释放问题解决了问题,但我不知道它是安全还是只是侧面解决问题。
CouchbaseEnvironment env = DefaultCouchbaseEnvironment
.builder()
.autoreleaseAfter(5000)
.build();
我猜这种模式在查询后不会关闭连接,它会让它一直存在,直到达到超时(5秒)。
如果http调用结束(使用Spring MVC),它是否会“更早”关闭?似乎模式带来了危险,因为它可以容纳更多的连接,但它真的重要吗?
最后我觉得这个API的“正确”使用是通过rxjava Observable API,而大多数文档只显示了必要的例子。自动释放模式是否已过期(并将被弃用)或者它是否会在不久的将来得到支持?
答案 0 :(得分:4)
在研究这个主题时,我发现了另一个案例here,Couchbase中出现了类似的错误。
按default autoReleaseAfter()设置为2000毫秒。我想默认时间窗口不够长,您的订阅者订阅Observable会导致Observable的内容被自动释放以防止泄漏。在您的情况下,手动将其设置为5000毫秒足够长。不幸的是,我不知道它是否有任何副作用。
我很确定autoReleaseAfter()不会很快弃用。如果是这种情况,则会在Couchbase source或docs中注明(在页面末尾,搜索&#34;自动可观察资源发布时间段&#34;)。
我认为您应该将此错误报告给Couchbase开发人员。