Redisson: закрытие клиента в методе финализации

Я пишу адаптер для клиента переиздания для использования в нашем приложении, я не уверен, что это хороший дизайн, чтобы закрыть клиент в блоке финализации. Ниже приведен код. Пожалуйста, дай мне знать

private static final RedissonClient client;

static {
    File configFile = Paths.get(Constants.ConfigDir, "cache- 
config.yml").toFile();
    try {
        client = Redisson.create(Config.fromYAML(configFile));
    } catch (IOException e) {
        throw new UnableToCreateCacheClientException(e.getMessage() + e.getStackTrace(), e.getCause());
    }
}

@Override
protected void finalize() throws Throwable {
    super.finalize();
    client.shutdown();
}

public static RedissonClient getClient() {
    return client;
}

РЕДАКТИРОВАТЬ: мне интересно знать правильный дизайн, чтобы закрыть статический конечный объект соединения в веб-приложении. Я не могу закрыть его в блоке finally метода, потому что клиент будет использоваться несколькими методами в нескольких классах.


person BeingVikram    schedule 27.04.2018    source источник
comment
Возможный дубликат Очистить код в finalize() или finally()?   -  person CannedMoose    schedule 27.04.2018


Ответы (1)


Вы не должны полагаться на то, что метод finalize() закроет клиент — вы должны обязательно закрыть его в другом месте. finalize() будет вызываться только тогда, когда объект будет удален сборщиком мусора, что может произойти спустя много времени после завершения работы клиента (а может и никогда, в зависимости от жизненного цикла программы и параметров gc).

По этой причине многие просто полностью избавятся от метода finalize().

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

person Michael Berry    schedule 27.04.2018
comment
Единственное другое известное мне место, где я могу закрыть клиент, — это метод contextDestroyed ServletContextListener. В этой статье автор говорит, что статические объекты связаны с жизненным циклом JVM. Я хотел привязать клиентский объект к жизненному циклу моего веб-приложения, а не к жизненному циклу JVM. - person BeingVikram; 27.04.2018