2017-09-04 5 views
1

J'essaie de me connecter à Redis en utilisant Jedis dans mon application Java. J'instancie un objet JedisPool, et quand j'obtiens la ressource, il lance une exception disant qu'il ne peut pas retourner la ressource. Ce qui est bizarre, c'est que si je instancie un objet Jedis, il se connecte sans problème et je peux changer les données.java jedis (redis) ne peut pas se connecter

Voilà ma classe RedisDatabase:

package me.joeleoli.proxylink.database; 

import me.joeleoli.proxylink.ProxyLink; 
import redis.clients.jedis.Jedis; 
import redis.clients.jedis.JedisPool; 

public class RedisDatabase { 

    private JedisPool pool; 

    public RedisDatabase(String host, int port, String password) { 
     ProxyLink.getInstance().getLogger().info("Attempting to establish Redis connection " + host + ":" + port); 

     this.pool = new JedisPool(host, port); 

     try (Jedis jedis = this.pool.getResource()) { 
      if (password != null && !password.equals("")) { 
       jedis.auth(password); 
      } 

      jedis.select(0); 
      jedis.close(); 
     } 
    } 

    public JedisPool getPool() { 
     return this.pool; 
    } 

} 

Voici mon erreur:

22:16:15 [INFO] [ProxyLink] Attempting to establish Redis connection 127.0.0.1:6379 
22:16:15 [WARNING] Exception encountered when loading plugin: ProxyLink 
redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool 
    at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:106) 
    at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:12) 
    at redis.clients.jedis.Jedis.close(Jedis.java:3206) 
    at me.joeleoli.proxylink.database.RedisDatabase.<init>(RedisDatabase.java:23) 
    at me.joeleoli.proxylink.ProxyLink.onEnable(ProxyLink.java:71) 
    at net.md_5.bungee.api.plugin.PluginManager.enablePlugins(PluginManager.java:227) 
    at net.md_5.bungee.BungeeCord.start(BungeeCord.java:273) 
    at net.md_5.bungee.BungeeCordLauncher.main(BungeeCordLauncher.java:111) 
    at net.md_5.bungee.Bootstrap.main(Bootstrap.java:15) 
Caused by: redis.clients.jedis.exceptions.JedisException: Could not return the resource to the pool 
    at redis.clients.util.Pool.returnResourceObject(Pool.java:61) 
    at redis.clients.jedis.JedisPool.returnResource(JedisPool.java:103) 
    ... 8 more 
Caused by: java.lang.IllegalStateException: Object has already been returned to this pool or is invalid 
    at org.apache.commons.pool2.impl.GenericObjectPool.returnObject(GenericObjectPool.java:551) 
    at redis.clients.util.Pool.returnResourceObject(Pool.java:59) 
    ... 9 more 
+0

Qu'est-ce que votre proxylink, L'exception semble provenir de votre code dans proxylink – GuangshengZuo

+0

@Joel Evans, vous pouvez utiliser cette alternative [redission] (https://redisson.org/) pour votre projet comme une alternative – kaviranga

+0

@GuangshengZuo Pour l'instant, tout ce que ProxyLink fait est d'instancier la classe RedisDatabase. Donc, il n'y a aucun moyen d'interférer. –

Répondre

0

Le problème avec votre code est l'appel à jedis.close() au sein de l'essai avec des ressources bloc. Le bloc try-with-resource ferme votre ressource lorsque le bloc se ferme. Puisque vous avez déjà fermé la ressource, avant de quitter le bloc, vous finissez par appeler deux fois. Supprimez l'appel à jedis.close dans le bloc et utilisez simplement la fonctionnalité try-with-resource.