2017-07-11 3 views
0

私は、jedisコネクタの助けを借りて、redisを接続しています。プロパティファイルにredis ip値があり、jedisの助けを借りて初期化されます。 redis.getを実行するスレッドは、長時間待っています。ここにサンプルスレッドダンプがありますjedisコネクタ経由で間違ったIPでredis接続しようとしたときに、この長時間のスレッド待機が発生する理由は何ですか?

"pool-5-thread-999" #1119 prio=5 os_prio=0 tid=0x00007fa4307ff800 nid=0x4a23 waiting on condition [0x00007fa3d581c000] 
    java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x00000000a6a006b8> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject) 
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175) 
    at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(AbstractQueuedSynchronizer.java:2039) 
    at org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:524) 
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:438) 
    at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361) 
    at redis.clients.util.Pool.getResource(Pool.java:40) 
    at redis.clients.jedis.JedisPool.getResource(JedisPool.java:84) 
    at com.xyz.redis.MyRedisClient.getJedis(MyRedisClient.java:53) 
    at com.xyz.redis.MyRedisClient.getDataFromRedis(MyRedisClient.java:99) 

この例外は実際に何を意味していますか?

これは、redisからデータをフェッチするために使用されるredis get getDataFromRedisメソッドです。

public static String getDataFromRedis(String key) throws Exception { 
     System.out.println("Entering into get data from redis : "+key); 
     Jedis jedisCon = null; 
     try { 
      jedisCon = getJedis(); 
      jedisCon.select(1); 
      return jedisCon.get(key); 
     } catch (Exception e) { 
      System.out.println("Exception while getting data from redis : " + e.getMessage()); 
      e.printStackTrace(); 
     } finally { 
      if (jedisCon != null) { 
       returnJedis(jedisCon); 
      } 
     } 
     return null; 
    } 

そして、ここではサンプルgetJedis()コードスニペット

private static Jedis getJedis() { 
     if (pool == null) { 
      try{ 
       initRedisClient(); 
      }catch(Exception ex){ 
       System.out.println("Exception while Initializing RedisClient" + ex);  
      } 
     } 
     return pool.getResource(); 
    } 

されており、ここで私が間違ったIPとpool.getResource()でプールからgetResource()にしようとすると、だから、初期の一部

public static void initRedisClient() throws Exception { 
    try { 
     String propertiesFilePath = "/Users/Ritchie/conf/redis.properties"; 
     Properties redisProps = MyUtils.loadProperties(propertiesFilePath); 
     JedisPool pool = new JedisPool(redisProps.getProperty("redisserver"));  
    } catch(Exception ex) { 
     System.out.println("Thus the occurred exception is : "+ex); 
    } 

ですプールは長時間待機しています。

不正なIPで登録されたプールからリソースを取得しようとすると、スレッドが長時間待機する理由はなぜですか?

答えて

1

JedisPoolConnectionためJedisソースコードは、あなたが提供する「IPアドレス」が、実際に名前でホストの検索を行うために使用されていることを示しています。ホストが存在せず、LAN上で使用可能な場合、このルックアップには15秒以上のタイムアウトがあります。

REDISサーバーが稼働していないLAN内のマシンから「無効な」IPアドレスを使用してみてください。あなたは今この延長されたタイムアウトを見るべきではありません。

関連する問題