私は、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で登録されたプールからリソースを取得しようとすると、スレッドが長時間待機する理由はなぜですか?