Как разрешить вход в любые классы из shutdownHook - PullRequest
1 голос
/ 03 января 2012

Предположим, что завершение работы:

 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 Ответ

1 голос
/ 04 января 2012

Так что кроме некоторых хакерских рефлексий, я не вижу простого способа сделать это, к сожалению.В соответствии с JDK 1.6 крючки отключения хранятся в 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.Эти компоненты вызываются в обратном порядке с момента создания экземпляров классов, так что все, что зависит от регистраторов, все еще имеет регистратор, когда он выключается.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...