2017-07-18 1 views
1

Ich bin verwirrt: Eine Verwendung: try(Pipeline pipeline = jedisPool.getResource().pipelined()) Wird es die Pipeline und die Jedis-Instanz schließen? Oder einfach die Pipeline schließen?Versuchen Sie mit verketteten Ressourcen in JedisPool

Ich benutze dies mit Multi-Threads, und ich habe den Fehler wie folgt. Ich bin verwirrt, dass der Fehler durch das Auslaufen der Instanz in JedisPool verursacht wird (wegen der Try-with-Resource-Verwendung) oder weil ein Deadlock (für das JedisPool in Multithread nicht gut ist)?

sun.misc.Unsafe.park(Native Method) 
java.util.concurrent.locks.LockSupport.park(LockSupport.java:186) 
java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2043) 
org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:583) 
org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:442) 
org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:363) 
redis.clients.util.Pool.getResource(Pool.java:49) 
redis.clients.jedis.JedisPool.getResource(JedisPool.java:226) 
io.codis.jodis.RoundRobinJedisPool.getResource(RoundRobinJedisPool.java:214) 

Antwort

1

Try-mit-Ressourcen schließen einzigen Variable, in Ihrem Fall Pipeline pipeline. Mehr erfahren Sie in docs https://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html

lesen Sie es mit Beispiel überprüfen:

MyResource Klasse:

class MyResource implements AutoCloseable { 

    public SubResource getSubResource() { 
     return new SubResource(); 
    } 

    @Override 
    public void close() throws Exception { 
     System.out.println("Resource closed"); 
    } 
} 

SubResource Klasse:

class SubResource implements AutoCloseable{ 
    @Override 
    public void close() throws Exception { 
     System.out.println("SubResource closed"); 
    } 
} 

Main Klasse:

class Main { 

    public static void main(String[] args) { 
     try (SubResource s = new MyResource().getSubResource()) { 
      System.out.println("Before closing"); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     System.out.println("After closing"); 
    } 
} 

Execution Ergebnis:

Before closing 
SubResource closed 
After closing 
+0

wow ~ das ist erstaunlich ~ ich gefragt haben, wie die verketteten Ressource testen geschlossen ist, thx viel! – wttttt

Verwandte Themen