Jedis - Когда использовать returnBrokenResource()

Когда именно мы должны использовать этот метод. On JedisConnectionException, исключение JedisDataException или любое исключение JedisException. Для Jedis нет хорошей документации API для моих знаний.

try {
    Jedis jedis = JedisFactory.getInstance();
    Pipeline pipe = jedis.pipelined();
    Response<Set<Tuple>> idWithScore = pipe.zrangeWithScores(cachekey, from, to);
    **// some statement which may cause some other exception**
    Response<String> val = pipe.get(somekey);
    pipe.exec();
    pipe.sync();
}catch (JedisConnectionException e) {
    JedisFactory.returnBrokenResource(jedis);
}catch(Exception e){
    **// What API I should use here?, how to find whether to use returnBrokenResource(jedis) or returnResource(jedis)**
}finally{
    JedisFactory.returnResource(jedis);
}

Ответ 1

Предполагается использовать returnBrokenResource, когда состояние объекта невосстановимо. Объект Jedis представляет соединение с Redis. Он становится непригодным, когда физическое соединение нарушено или когда синхронизация между клиентом и сервером теряется.

С Jedis эти ошибки представлены исключением JedisConnectionException. Поэтому я бы использовал returnBrokenResource для этого исключения, а не для других.

JedisDataException больше связано с плохим использованием Jedis API или ошибками Redis на стороне сервера.

JedisException для всего остального (обычно возникает после ошибки нижнего уровня, независимой от Jedis).

Ответ 2

Для опоздавших!

returnBrokenResource(), returnResource() устарели. Просто используйте jedis.close() в безопасном блоке.

finally {
  if (jedis != null) {
    jedis.close();
  }
}

Если Jedis был заимствован из пула, он будет возвращен в пул с правильным методом, поскольку он уже определяет, что произошло исключение JedisConnectionException. Если Джедис не заимствован из пула, он будет отключен и закрыт.

Ответ 3

пример кода для этого в соответствии с документацией jedis

public String get(String keyName)
{
    Jedis redis = null;
    try
    {
        redis = redisPool.getResource();
        return redis.get(keyName);
    }
    catch (JedisConnectionException e) 
    {
        if (redis != null) 
        {
            redisPool.returnBrokenResource(redis);
            redis = null;
        }
        throw e;
    }
    finally
    {
        if (redis != null)
        {
            redisPool.returnResource(redis);
        }
    }
}