gpt4 book ai didi

java - 如何允许从 shutdownHook 登录任何类

转载 作者:太空宇宙 更新时间:2023-11-04 08:25:08 26 4
gpt4 key购买 nike

假设 shutdownHook 为:

 class ShutdownHolder extends Thread {  

public void run() {
Logger logger = LoggerFactory.getCoreLogger(ShutdownHolder.class);
try {
logger.info("Shutdown hook is running...");
doSomething();
logger.info("Shutdown hook end.");
} catch(Exception e) {
logger.severe("Unexpected ERROR during shutdown", e);
}
}
}

如何避免在 ShutdownHook 结束之前记录器没有关闭?

例如,doSomething() 方法可以调用其他可访问类上的多个方法来写入日志。我不想跳过所有这些日志。

最佳答案

因此,除了一些反射黑客之外,不幸的是,我没有看到一个简单的方法来做到这一点。在 1.6 JDK 下,关闭 Hook 存储在 IdentityHashmap 中,该映射不提供保证的顺序。实际上,关闭钩子(Hook)是根据该映射的内部结构以随机顺序调用的。

就反射而言,我尝试执行以下操作,但 hookMap 对我来说为 null。如果您可以让它工作,那么您也许可以删除 log4j Hook 并在 Hook 末尾手动调用它或其他东西。

Class<?> clazz = Class.forName("java.lang.ApplicationShutdownHooks");
Field field = clazz.getDeclaredField("hooks");
field.setAccessible(true);
@SuppressWarnings("unchecked")
Map<Thread, Thread> hookMap = (Map<Thread, Thread>) field.get(null);

但是,我强烈建议您执行除关闭 Hook 之外的其他操作。在 main 完成之前调用您自己的钩子(Hook)怎么样?对于我们来说,我们大量使用 Spring 和 DisposableBean 模式。这些bean以与实例化类时相反的顺序调用,因此任何依赖于记录器的东西在关闭时仍然具有记录器。

希望这有帮助。

关于java - 如何允许从 shutdownHook 登录任何类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8715217/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com