Giả sử tắt máyHook là:
lớp ShutdownHolder mở rộng Chủ đề {
công khai void run() {
Trình ghi nhật ký nhật ký = LoggerFactory.getCoreLogger(ShutdownHolder.class);
thử {
logger.info("Móc tắt máy đang chạy...");
doS Something();
logger.info("Kết thúc móc tắt máy.");
} bắt(Ngoại lệ e) {
logger.severe("LỖI không mong muốn khi tắt máy", e);
}
}
}
Làm cách nào để tránh trình ghi nhật ký không đóng trước khi ShutdownHook kết thúc?
Ví dụ: phương thức doSomething() có thể gọi nhiều phương thức trên các lớp có thể truy cập khác để ghi vào nhật ký. Tôi không muốn bỏ qua tất cả các nhật ký này.
Vì vậy, ngoài một số mẹo phản ánh, rất tiếc là tôi không thấy cách nào dễ dàng để thực hiện việc này. Dưới 1.6 JDK, tắt Hook storage trong Bản sắcHashmap
, ánh xạ này không cung cấp thứ tự được đảm bảo. Trên thực tế, các hook tắt máy được gọi theo thứ tự ngẫu nhiên dựa trên cấu trúc bên trong của bản đồ.
Theo như sự phản ánh, tôi đã thử làm như sau, nhưng hookMap
là vô giá trị đối với tôi Nếu bạn có thể làm cho nó hoạt động thì có thể bạn có thể xóa Log4j Hook và gọi nó theo cách thủ công ở cuối Hook hoặc thứ gì đó.
Class> clazz = Class.forName("java.lang.ApplicationShutdownHooks");
Trường trường = clazz.getDeclaredField("hooks");
field.setAccessible(true);
@SuppressWarnings("không được chọn")
Map hookMap = (Map) field.get(null);
Nhưng, Tôi thực sự khuyên bạn nên thực hiện các thao tác khác ngoài việc đóng Hookkhácvận hành. hiện hữu chủ yếu
Còn việc gọi hook của riêng bạn trước khi kết thúc thì sao? Đối với chúng tôi, chúng tôi sử dụng rất nhiều mẫu Spring và WasteBean. Những hạt đậu nàyĐược gọi theo thứ tự ngược lại khi lớp được khởi tạo, vì vậy mọi thứ dựa vào trình ghi nhật ký vẫn có trình ghi nhật ký khi đóng.
Hy vọng điều này sẽ giúp.
Tôi là một lập trình viên xuất sắc, rất giỏi!