2017-01-31 4 views
0

Après avoir utilisé un peu de l'API client java de Couchbase (2.4.1) je suis tombé sur cette exception:Qu'est-ce que l'option Couchbase 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. 

Je travaillais avec un ViewQuery en mode impératif, il échoue lors de l'obtention des lignes du résultat (ViewResult est correct comme totalRows() et le succès() ont des valeurs belles)

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

efficacement la mise en place autoreleaseAfter résout le problème, mais je ne sais pas s'il est sûr ou juste Esquive le problème.

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

Je suppose que ce mode ne ferme pas la connexion après une requête, il laisse en direct jusqu'à ce que le délai d'attente (5 secondes) est atteint.

Ferme-t-il automatiquement "plus tôt" si l'appel http est terminé (avec Spring MVC)? Il semble que le mode apporte le danger car il peut contenir plus de connexions mais est-ce vraiment important? Enfin, je pense que l'utilisation "correcte" de cette API est de passer par l'API observable de rxjava alors que la plupart de la documentation trouvée ne montre que des exemples impératifs. Le mode autorelease est-il obsolète (et va-t-il devenir obsolète) ou sera-t-il toujours pris en charge dans un proche avenir?

+0

hey benjamin :) peut-il y avoir plus de 2 secondes (délai d'autorelease par défaut) qui s'écoule entre votre code appelant 'executeViewQuery' et la partie où' result.allRows() 'est appelé? –

+0

@ SimonBaslé hey pal! :) En fait, la requête est très rapide et le calcul entre les services ne devrait pas prendre plus de 2 secondes. Déplacer tout mon code dans un seul service Spring résout ce problème (le service effectue la requête et l'analyse) et je n'ai plus besoin d'un délai d'attente plus long. Peut-être appeler toutes les méthodes ViewResult.debug(), ViewResult.totalRows(), ViewResult.error(), ViewResult.success() dans un autre service après client.query (...) provoque ce comportement (fermeture de la connexion au début), je je ne sais pas – zenbeni

Répondre

1

Lors de la recherche sur ce sujet, j'ai trouvé un autre cas here où un bug similaire est apparu dans Couchbase.

Par défaut, autoReleaseAfter() est défini sur 2000 ms par default. Je suppose que la fenêtre de temps par défaut n'est pas assez longue pour que votre abonné s'abonne à l'Observable, ce qui provoque la libération automatique du contenu de votre Observable pour éviter une fuite. Le réglage manuel à 5000 ms est assez long dans votre cas. Malheureusement, je ne sais pas si cela a des effets secondaires.

Je suis assez sûr que autoReleaseAfter() ne sera pas déprécier bientôt. Si tel était le cas, il sera noté dans le Couchbase source ou dans le docs (à la fin de la page, recherchez "Période de temps de libération automatique des ressources observables").

Je pense que vous devriez signaler ce bug aux développeurs de Couchbase.