Почему java.util.Logger в ShutdownHook в JBoss 5.1 не всегда печатает на server.log? - PullRequest
4 голосов
/ 02 февраля 2011

У меня есть EJB3-таймер в JBoss 5.1. edit: ShutdownHook должен установить флаг, что doTimeOut () может завершиться изящно (в противном случае он завершит работу, и остановка будет остановлена, пока не закончится этот таймер).1005 * Я нашел эти два сообщения, но они с 2005 года, и ошибка помечена как ЗАКРЫТА:

http://www.pankaj -k.net / archives / 2005/08 / jboss_shutdown.html

http://jira.jboss.com/jira/browse/JBAS-2087

Исключение, выброшенное анонимным регистратором, является нулевым указателем:

2011-02-02 09:16:33,120 ERROR [STDERR] Exception in thread "Thread-33" 
2011-02-02 09:16:33,122 ERROR [STDERR] java.lang.NullPointerException
2011-02-02 09:16:33,122 ERROR [STDERR]  at org.apache.log4j.CategoryKey.<init>(CategoryKey.java:31)
2011-02-02 09:16:33,122 ERROR [STDERR]  at org.apache.log4j.Hierarchy.getLogger(Hierarchy.java:261)
2011-02-02 09:16:33,122 ERROR [STDERR]  at org.apache.log4j.Hierarchy.getLogger(Hierarchy.java:242)
2011-02-02 09:16:33,122 ERROR [STDERR]  at org.apache.log4j.LogManager.getLogger(LogManager.java:188)
2011-02-02 09:16:33,122 ERROR [STDERR]  at org.apache.log4j.Logger.getLogger(Logger.java:104)
2011-02-02 09:16:33,122 ERROR [STDERR]  at org.jboss.logbridge.LogBridgeHandler.publish(LogBridgeHandler.java:71)
2011-02-02 09:16:33,122 ERROR [STDERR]  at java.util.logging.Logger.log(Unknown Source)
2011-02-02 09:16:33,122 ERROR [STDERR]  at java.util.logging.Logger.doLog(Unknown Source)
2011-02-02 09:16:33,122 ERROR [STDERR]  at java.util.logging.Logger.log(Unknown Source)
2011-02-02 09:16:33,122 ERROR [STDERR]  at com.demo.MyBEAN$ShutdownHook.run(MyBEAN.java:202)

Есть идеи?

Ответы [ 2 ]

3 голосов
/ 02 февраля 2011

Регистратор может быть недоступен, так как Log4j завершил работу, что, очевидно, происходит до запуска перехвата JVM. Если вам нужно что-то зарегистрировать при завершении работы, я предлагаю вам подключиться к механизмам JBoss, например, используя @PreDestroy.

Ваш код становится

@Stateless
class Timer {

    @Timeout
    public void doTimeOut(){
       //some code
    }

    @PreDestroy
    public void onShutdown() {

        Logger.getLogger(Timer.class.getName()).log(Level.INFO, "MyBEAN.ShutdownHook execute hook " + hook);
        [...] // some code
    }
}
1 голос
/ 02 февраля 2011

Я бы посоветовал вам прочитать Завершение работы в Java? Как они используются?

Краткое описание: не гарантируется, что завершающие хуки будут выполняться каждый раз. Они являются частью механизма выключения, и вы не должны использовать их для создания новых объектов, таких как новые регистраторы в вашем случае.

Я бы предложил инициализировать регистратор внутри класса таймера как переменную private static final Logger (как это обычно делается), а затем обратиться к этому экземпляру в вашем хуке завершения работы.

Но даже тогда вы не будете на 100% уверены, что он запустится (если JBoss не использует какую-то хитрость, чтобы гарантировать это).

...