Redisson: Menutup klien dalam metode penyelesaian

Saya sedang menulis adaptor untuk klien redission untuk digunakan dalam aplikasi kita, saya tidak yakin apakah itu desain yang bagus untuk menutup klien di blok finalisasi. Di bawah ini adalah kodenya. tolong beritahu saya

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;
}

EDIT : Saya tertarik mengetahui desain yang tepat untuk menutup objek koneksi akhir statis di aplikasi web. Saya tidak dapat menutupnya di blok metode terakhir karena klien akan digunakan oleh banyak metode di banyak kelas


person BeingVikram    schedule 27.04.2018    source sumber
comment
Kemungkinan duplikat Membersihkan kode di finalize() atau akhirnya()?   -  person CannedMoose    schedule 27.04.2018


Jawaban (1)


Anda tidak boleh mengandalkan metode finalize() untuk mematikan klien - Anda harus menutupnya di tempat lain. finalize() hanya akan dipanggil ketika objek dikumpulkan dari sampah, yang mungkin lama setelah klien seharusnya dimatikan (dan mungkin tidak akan pernah, tergantung pada siklus hidup program dan opsi gc.)

Oleh karena itu, banyak orang yang membuang metode finalize() sepenuhnya.

Jika Anda membiarkannya di sana, perlakukan saja sebagai cadangan untuk menangkap kesalahan pengkodean di bagian hulu. Pertama periksa apakah klien sedang dimatikan, dan jika tidak, pastikan ada pesan peringatan yang tercetak yang menunjukkan Anda memiliki bug yang perlu Anda atasi!

person Michael Berry    schedule 27.04.2018
comment
Satu-satunya tempat lain yang saya tahu di mana saya dapat menutup klien adalah metode konteksDestroyed dari ServletContextListener. Dalam artikel ini, penulis mengatakan bahwa objek statis terkait dengan siklus hidup JVM. Saya ingin mengikat objek klien ke siklus hidup aplikasi web saya, bukan ke siklus hidup JVM - person BeingVikram; 27.04.2018