假设一个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()方法可以调用其他可访问类上的几个方法,也可以写入日志。我不想跳过所有这些日志。
发布于 2012-01-05 01:15:37
因此,除了一些反射技巧之外,不幸的是,我看不到一种简单的方法来做到这一点。在1.6JDK下,关闭钩子存储在IdentityHashmap中,这不提供保证的顺序。实际上,关闭钩子是以随机顺序调用的,这取决于映射的内部结构。
在反射方面,我尝试执行以下操作,但hookMap对我来说是空的。如果你能让它工作,那么你也许可以移除log4j钩子,并在钩子的末尾或其他地方手动调用它。
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);然而,我强烈建议做一些不同于关闭钩子的事情。在main完成之前调用你自己的钩子怎么样?对我们来说,我们大量使用Spring和DisposableBean模式。这些bean的调用顺序与类被实例化时的顺序相反,因此依赖于记录器的任何东西在关闭时仍然具有记录器。
希望这能有所帮助。
https://stackoverflow.com/questions/8715217
复制相似问题