Redisson: закрытие клиента в методе финализации - PullRequest
0 голосов
/ 27 апреля 2018

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

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 метода, потому что клиент будет использоваться несколькими методами в нескольких классах

1 Ответ

0 голосов
/ 27 апреля 2018

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

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

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

...