2011-02-02 9 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 
    } 
} 

私はこの2つのポストを見つけたが、彼らは2005年からであり、バグがCLOSEDとしてマークされています

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

答えて

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の中では、 'doHostShutdownHook(hook)'を呼び出します.Shootdownhookは 'doTimeOut()'の実行中にシステムシャットダウンを待ち受けます。 –

1

は、私はあなたがShutdown Hooks in Java? How are they used?

まとめ読みをお勧めしたいです。それらはシャットダウンメカニズムの一部であり、実際には新しいロガーなどの新しいオブジェクトを作成するために使用するべきではありません。

タイマークラスの内部でprivate static final Logger変数(通常は実行されている)としてロガーを初期化し、そのシャットダウンフックでそのインスタンスを参照することをお勧めします。

でも、それでも実行されることは100%保証されません(JBossがそれを保証するためにいくつかのトリッキーを使用しない限り)。

+0

リンクありがとう –

関連する問題