2011-02-02 2 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 년부터이며, 버그가 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) 

아이디어가 있습니까? 종료 훅은 매번 실행 얻을 보장 할 수 없습니다 :

+1

보스 5.1 SLF4J의 자체 사본이 포함되고, 왜 끔찍한'java.util.logging' 물건 대신에 사용하지? – skaffman

답변

3

Log4j가 종료되었으므로 로거를 사용하지 못할 수 있습니다. 이는 JVM 종료 후크가 실행되기 전에 분명히 발생합니다. 종료시에 뭔가를 기록해야한다면, 예를 들어 @PreDestroy을 사용하는 JBoss 메커니즘에 연결하는 것이 좋습니다.

귀하의 코드는 다음

@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에 후크를 만들고 추가해야하며 @PreDestroy에서 제거해야합니다. 이것은 나를 위해 일할 수 있습니다. 나는 그것을 시도해야한다. –

+0

나는이 해결책을 좋아한다. 하지만 당신이 제공 한 코드와 조금 다릅니다 :'@ PostConstruct'에서'runtime.addShutdownHook (hook)'을 호출 할 것입니다. @PreDestroy 안에서'removeShutdownHook (hook)'을 호출합니다. Shutdownhook은'doTimeOut()'이 실행되는 동안 시스템 종료를 청취해야하기 때문입니다. –

1

난 당신이 Shutdown Hooks in Java? How are they used?

요약 읽어 좋을 것. 그것들은 종료 메커니즘의 일부이며, 실제로 새로운 로거와 같은 새로운 객체를 생성 할 때 사용하지 않아야합니다.

타이머 클래스의 내부에서 로거를 private static final Logger 변수로 초기화 (일반적으로 완료 됨) 한 다음 종료 후크에서 해당 인스턴스를 참조하는 것이 좋습니다.

그러나 그렇다고하더라도 JBoss가이를 보장하기 위해 어떤 속임수를 사용하지 않는다면 100 % 확신 할 수는 없습니다.

+0

링크 감사합니다 –

관련 문제