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

แก้ไข: ฉันสนใจที่จะทราบการออกแบบที่เหมาะสมเพื่อปิดออบเจ็กต์การเชื่อมต่อสุดท้ายแบบคงที่ในเว็บแอป ฉันไม่สามารถปิดมันในบล็อกสุดท้ายของวิธีการได้เนื่องจากไคลเอนต์จะถูกใช้งานหลายวิธีในหลายคลาส


person BeingVikram    schedule 27.04.2018    source แหล่งที่มา


คำตอบ (1)


คุณไม่ควร พึ่งพา ในวิธีการ finalize() ที่จะปิดไคลเอ็นต์ - คุณควรแน่ใจว่าได้ปิดที่อื่นแล้ว Finalize() จะถูกเรียกเฉพาะเมื่อออบเจ็กต์ถูกรวบรวมขยะ ซึ่งอาจใช้เวลานานหลังจากที่ไคลเอนต์ควรถูกปิดระบบ (และอาจไม่เคยเลย ขึ้นอยู่กับวงจรชีวิตของโปรแกรมและตัวเลือก gc)

ด้วยเหตุนี้ หลายๆ คนจึงจะกำจัดเมธอด Finalize() ออกไปโดยสิ้นเชิง

หากคุณปล่อยทิ้งไว้ ให้ถือว่ามันเป็นข้อมูลสำรองเพื่อตรวจจับข้อผิดพลาดในการเขียนโค้ดที่ต้นทาง อันดับแรกให้ตรวจสอบก่อนว่าไคลเอนต์ปิดตัวลงหรือไม่ และหากไม่เป็นเช่นนั้น ตรวจสอบให้แน่ใจว่าได้พิมพ์ข้อความเตือนที่ระบุว่าคุณมีจุดบกพร่องที่คุณต้องแก้ไข!

person Michael Berry    schedule 27.04.2018
comment
อีกที่เดียวที่ฉันรู้ว่าฉันสามารถปิดไคลเอนต์ได้ที่ไหนคือวิธี contextDestroyed ของ ServletContextListener ในบทความ นี้ ผู้เขียนกล่าวว่าออบเจ็กต์แบบคงที่เชื่อมโยงกับวงจรชีวิตของ JVM ฉันต้องการผูกออบเจ็กต์ไคลเอ็นต์กับวงจรการใช้งานของเว็บแอปของฉัน ไม่ใช่กับวงจรการใช้งานของ JVM - person BeingVikram; 27.04.2018