2017-01-31 5 views
0

Nach einem wenig von der Java-Client-API von Couchbase mit (2.4.1) ich in diese Ausnahme lief:Was ist die Option "AutoBase Environment AutoreleaseAfter"?

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

ich einen ViewQuery in imperativen Modus wurde verwenden, schlägt es, wenn die Zeilen aus dem Ergebnis zu erzielen (Viewresult ist die richtige totalRows() und Erfolg() haben schöne Werte)

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

effektiv Einrichtung autoreleaseAfter das Problem löst, aber ich weiß nicht, ob es sicher ist oder einfach nur nebenSchritt das Problem.

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

Ich denke, dieser Modus nicht schließt die Verbindung nach einer Abfrage, es es zu leben, bis das Timeout läßt (5 Sekunden) erreicht wird.

Schließt es automatisch "früher", wenn der http-Aufruf beendet ist (mit Spring MVC)? Es scheint, dass der Modus Gefahr bringt, da er mehr Verbindungen halten kann, aber spielt es wirklich eine Rolle?

Schließlich denke ich, dass die "richtige" Verwendung dieser API ist, über Rxjava Observable API zu gehen, während die meisten der gefundenen Dokumentation nur imperative Beispiele zeigen. Ist der Autorelease-Modus veraltet (und wird veraltet) oder wird er in naher Zukunft noch unterstützt?

+0

hey benjamin :) könnte es sein, dass mehr als 2s (default autorelease timeout) zwischen dem code-Aufruf "executeViewQuery" und dem Teil, wo 'result.allRows()' aufgerufen wird, vergehen? –

+0

@ SimonBaslé hey Kumpel! :) Tatsächlich ist die Abfrage sehr schnell und die Berechnung zwischen den Diensten sollte nicht länger als 2 Sekunden dauern. Das Verschieben meines gesamten Codes in nur einen Spring-Dienst löst dieses Problem (der Dienst führt die Abfrage und das Parsen aus) und ich brauche kein erhöhtes Zeitlimit mehr. Vielleicht ruft man alle Methoden ViewResult.debug(), ViewResult.totalRows(), ViewResult.error(), ViewResult.success() in einen anderen Dienst auf, nachdem client.query (...) dieses Verhalten verursacht (die Verbindung vorzeitig schließen), I Ich weiß es nicht. – zenbeni

Antwort

1

Bei der Untersuchung dieses Themas fand ich einen anderen Fall here, wo ein ähnlicher Fehler in Couchbase erschien.

Standardmäßig ist autoReleaseAfter() von default auf 2000 ms eingestellt. Ich nehme an, dass das Standardzeitfenster nicht lang genug für Ihren Abonnenten ist, um das Observable zu abonnieren, was dazu führt, dass der Inhalt Ihres Observable automatisch veröffentlicht wird, um ein Leck zu verhindern. Die manuelle Einstellung auf 5000 ms ist in Ihrem Fall lang genug. Leider weiß ich nicht, ob es irgendwelche Nebenwirkungen hat.

Ich bin mir ziemlich sicher, dass autoReleaseAfter() wird nicht bald ablehnen. Wenn dies der Fall wäre, wäre es in der Couchbase source oder in der docs (am Ende der Seite, Suche nach "Automatische Beobachtbare Ressource Release Time Period").

Ich denke, Sie sollten diesen Bug den Couchbase-Entwicklern melden.

Verwandte Themen