为什么JBoss 5.1中的ShutdownHook中的java.util.Logger并不总是打印到server.log?

我在JBoss 5.1中有一个EJB3-Timer。 编辑: ShutdownHook应设置一个标志,doTimeOut()可以正常终止(否则它将完成作业,并且在此计时器完成之前停止关闭)。
@Stateless
class Timer {
    private static Thread hook;
    static {
       hook = new ShutdownHook();
    }
    @Timeout
    public void doTimeOut(){
       //some code
    }

    private class ShutdownHook implements Runnable(){

        Logger.getLogger(ShutdownHook.class.getName()).log(Level.INFO, "MyBEAN.ShutdownHook execute hook " + hook); // Not always printed to log
        Logger.getAnonymousLogger().log(Level.INFO, "MyBEAN.ShutdownHook execute hook " + hook); // throwns Exception
        System.out.println("MyBEAN.ShutdownHook execute hook " + hook);
        [...] // some code
    }
}
我发现这两个帖子,但它们是从2005年开始的,bug被标记为CLOSED: http://www.pankaj-k.net/archives/2005/08/jboss_shutdown.html http://jira.jboss.com/jira/browse/JBAS-2087 anonymousLogger抛出的异常是NullPointer:
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)
有任何想法吗?     
已邀请:
由于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
    }
}
    
我建议你阅读Java中的Shutdown Hooks?它们是如何使用的? 简介:无法保证每次都执行shutdown hooks。它们是关闭机制的一部分,您不应该真正使用它们来创建新对象,例如您的案例中的新记录器。 我建议将计时器类中的记录器初始化为
private static final Logger
变量(通常是这样),然后在关闭钩子中引用该实例。 但即便如此,你也不会100%确定它会被运行(除非JBoss使用一些技巧来保证)。     

要回复问题请先登录注册