2017-06-27 20 views
1

私はjedisを使ってredis serverに接続しています。 RedisのIP値は、別のファイルに設定されていると私はJedisPoolからリソースを取得中にスレッドが待機状態になっていました

private static JedisPool pool; 

public static void initRedisClient() throws Exception { 
    String redisConfigPath = "/conf/redis.properties"; 
    Properties docsRedisProp = RedisUtils.loadProperties(redisConfigPath); 
    pool = new JedisPool(docsRedisProp.getProperty("redisserver"));  
    } 
} 

そしてRedisのから複数のキーを取得するために私mget方法初期化時にファイルをロードしようとしている

public static List<String> mgetDataFromRedisCache(String[] keys) throws CacheException { 
     Jedis jedisCon = null; 
     try { 
      jedisCon = getJedis(); 
      jedisCon.select(1); 
      return jedisCon.mget(keys); 
     } catch (Exception e) { 
      LOGGER.warning("Exception while fetching data from Redis Client. EXCEPTION=" + e.getMessage()); 
      e.printStackTrace(); 
     } finally { 
      if (jedisCon != null) { 
       returnJedis(jedisCon); 
      } 
     } 
     return null; 
    } 

を次のように私が持っているときですプロパティファイルに不正なIP値が与えられている - それにアクセスするリクエストスレッドは、長時間待っています。プール内のリソースが利用できないため、私のリクエストがストールしてはならない。ここで

私はストールしたスレッドのスレッドダンプを装着しています(つまり、待ち状態にあったスレッドは)

###_http-nio-8443-exec-140" #104908 daemon prio=5 os_prio=0 tid=0x00007f247805f000 nid=0x4266 waiting on condition [0x00007f220a4df000] 
    java.lang.Thread.State: WAITING (parking) 
    at sun.misc.Unsafe.park(Native Method) 
    - parking to wait for <0x00000006fe438408> (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.retail.store.RedisClient.getJedis(RedisClient.java:53) 
    at com.retail.store.RedisClient.mgetDataFromRedisCache(RedisClient.java:82) 

どのように私はこれを達成できますか?どんな助けでも大歓迎です。ありがとうございます:-)

+0

行くのスレッドがこのトピックには何もあなたを見つけるでし避けることができますか? redisをspring-data-redis(クライアントとしてJedisも使用)と同じ問題に遭遇しています。 – woezelmann

+0

@woezelmann setting 'setMaxWaitMillis'が私を助けました。私の答えで私を説明した..それを見てください。それが役に立てば幸い !! – Natasha

答えて

0

適切なconstructorを使用して、短いタイムアウトでjedis接続を作成できます。

Jedis jedisCon = public Jedis(String host, int port, int timeout); 
+0

デフォルトのタイムアウト値は '2000'ミリ秒です.2秒です... – Natasha

+0

この2秒は、スレッドがアプリケーションサーバーで停止する原因になりますか? – Natasha

+0

アプリケーションサーバーにヒットするリクエストが多すぎる場合と同様に、この2秒が大きな影響を及ぼします。そのため、リクエストしているスレッドが停止することがありますか? – Natasha

1

redis server ipはプロパティファイルに保存され、実行時にロードされます。

プロパティファイルには、デフォルトのipが含まれています。しかし、私が自分の開発環境に同じものを配備すると、redis ipは変更されているはずですが、私はそうしていませんでした。私の開発セットアップは、指定されたipに接続できませんでした。

Jedisは、次のデフォルト設定

maximimumアクティブな接続を有し= 8

readtimeout = 2000

Maximum active connectionsプールを同時に保持できるアクティブな接続の最大数です。

read time out接続が確立され、確立された接続を介してデータを受信する準備ができているときに設定される最大時間はミリ秒です。

私たちの場合、接続は確立されておらず(最初の8つのスレッド)、決して殺されません - 接続はタイムアウトですはこれらの接続に設定されていません。 getをredisに呼び出す他のスレッドは、パークWAITの状態になります。

次のプールの構成を設定することにより(すなわち、接続を確立するための最大待機時間を設定)我々は長期待機状態に

JedisPoolConfig jedisConfig = new JedisPoolConfig(); 
jedisConfig.setMaxWaitMillis(maxWaitInMillis); 
関連する問題