4

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
    }
}

この 2 つの投稿を見つけましたが、これらは 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)

何か案は?

4

2 に答える 2

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
    }
}
于 2011-02-02T08:52:32.587 に答える
1

Shutdown Hooks in Javaを読むことをお勧めしますか? それらはどのように使用されますか?

概要: シャットダウン フックは、毎回実行されるとは限りません。それらはシャットダウンメカニズムの一部であり、実際にそれらを使用して新しいロガーなどの新しいオブジェクトを作成するべきではありません。

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

しかし、それでも、それが実行されることを 100% 確信できるわけではありません (JBoss が何らかのトリックを使用してそれを保証している場合を除きます)。

于 2011-02-02T08:41:51.643 に答える