[英]Glassfish 3: 3rd party jar not logging to server.log via java.util.logger
[英]Why does a java.util.Logger in a ShutdownHook within JBoss 5.1 not always prints to 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。 它們是關閉機制的一部分,您不應該真正使用它們來創建新對象,例如您的案例中的新記錄器。
我建議將timer類中的記錄器初始化為private static final Logger
變量(通常這樣做),然后在shutdown hook中引用該實例。
但即便如此,你也不會100%確定它會被運行(除非JBoss使用一些技巧來保證)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.