1

Tomcat で実行されているサーブレットで 22 分ごとにメソッドを実行したいと考えています。だから私はこのコードを使用しています:

Timer timer = new Timer();

timer.schedule(new TimerTask() {
    @Override
    public void run() {

        try {
            update();
        } catch (SQLException | NamingException | InterruptedException e1) {
            e1.printStackTrace();
        }
    }
}, 22 * 60 * 1000, 22 * 60 * 1000);

タイマーに関して常にエラーが発生しているため、これはひどい方法だと感じています。サーブレットの新しいバージョンをアップロードするたびに、以前のタイマーが停止するとは思いません。その後、データベース接続の警告が表示されます。すべてをリセットして最初からやり直せば問題ありません。

javax.naming.NameNotFoundException: Name comp is not bound in this Context
    at org.apache.naming.NamingContext.lookup(NamingContext.java:770)
    at org.apache.naming.NamingContext.lookup(NamingContext.java:153)
    at org.apache.naming.SelectorContext.lookup(SelectorContext.java:152)
    at javax.naming.InitialContext.lookup(InitialContext.java:411)
    at my.app.database.DatabaseManager.connect(DatabaseManager.java:44)
    at my.app.database.DatabaseManager.returnInfo(DatabaseManager.java:133)
    at my.app.genParse.Generate.updateHistory(Generate.java:89)
    at my.app.MyServer$1.run(MyServer.java:52)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

また、新しいバージョンで再起動する場合:

SEVERE: The web application [/myApp] appears to have started a thread named [Timer-7] but has failed to stop it. This is very likely to create a memory leak.

これを達成または回避するためのより良い方法は何ですか?

4

3 に答える 3

1

タイマー タスクを使用する代わりの方法については、こちらで説明しています。このScheduledThreadpoolExecutorクラスを使用すると、新しいバージョンをアップロードするときに複数のスレッドがまだ実行されているという問題を解決できる場合がありますが、確実にそうなるとは言えません。このクラスは、 javadocTimerで説明されているさまざまな理由から、クラスよりも優先されます。

于 2013-02-20T16:54:41.177 に答える
0

ServletContextListener を使用して、Web アプリケーションの開始および停止時にタイマーを開始および停止します。

于 2013-02-20T21:07:23.450 に答える