首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何允许从shutdownHook登录任何类

如何允许从shutdownHook登录任何类
EN

Stack Overflow用户
提问于 2012-01-04 00:21:50
回答 1查看 227关注 0票数 1

假设一个shutdownHook为:

代码语言:javascript
复制
 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()方法可以调用其他可访问类上的几个方法,也可以写入日志。我不想跳过所有这些日志。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-05 01:15:37

因此,除了一些反射技巧之外,不幸的是,我看不到一种简单的方法来做到这一点。在1.6JDK下,关闭钩子存储在IdentityHashmap中,这不提供保证的顺序。实际上,关闭钩子是以随机顺序调用的,这取决于映射的内部结构。

在反射方面,我尝试执行以下操作,但hookMap对我来说是空的。如果你能让它工作,那么你也许可以移除log4j钩子,并在钩子的末尾或其他地方手动调用它。

代码语言:javascript
复制
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的调用顺序与类被实例化时的顺序相反,因此依赖于记录器的任何东西在关闭时仍然具有记录器。

希望这能有所帮助。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8715217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档