2011-02-02 51 views
4

我在JBoss 5.1中有一個EJB3-Timer。 編輯: ShutdownHook應該設置一個標誌,doTimeOut()可以終止正常(否則它會完成作業,並且停止關機直到此計時器完成)。爲什麼JBoss 5.1中的ShutdownHook中的java.util.Logger不總是打印到server.log?

@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被標記爲已關閉:

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

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

由anonymousLogger拋出的異常是一個空指針:

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) 

有什麼想法?

+1

的JBoss 5.1包括它自己的SLF4J副本,爲什麼不使用,而不是可怕的`java.util.logging`東西? – skaffman 2011-02-02 08:55:25

回答

3

由於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 
    } 
} 
+0

您的意思是,我應該在@PostConstruct中創建並添加Hook,並在@PreDestroy中將其刪除?這可以爲我工作。我必須嘗試一下。 – 2011-02-02 09:10:28

1

我建議你閱讀Shutdown Hooks in Java? How are they used?

摘要:關閉掛鉤,不能保證每次得到執行。它們是關機機制的一部分,你不應該真的使用它們來創建新的對象,例如新的記錄器。

我建議初始化定時器類內的記錄器作爲private static final Logger變量(因爲它通常完成),然後在您的關閉鉤子中引用該實例。但即使如此,你也不會100%確定它會運行(除非JBoss正在使用一些技巧來保證這一點)。

+0

感謝您的鏈接 – 2011-02-02 09:11:02

相關問題