100

Java を使用していて、アプリケーションでサーブレットを継続的に実行したいのですが、その方法がわかりません。私のサーブレットには、データベース全体からのユーザーの合計数だけでなく、データベースからのユーザー数も毎日カウントするメソッドがあります。そのため、サーブレットを継続的に実行し続けたいと考えています。

4

5 に答える 5

221

問題は、サーブレットの目的を誤解していることです。HTTP リクエストに基づいて動作することを目的としており、それ以上のものではありません。1 日に 1 回実行されるバックグラウンド タスクだけが必要です。

EJB は利用できますか? 使用する@Schedule

環境がたまたま EJB (つまり、WildFly、JBoss、TomEE、Payara、GlassFish などの実際の Java EE サーバー) をサポートしている場合は、@Schedule代わりに使用してください。ここではいくつかの例を示します。

@Singleton
public class BackgroundJobManager {

    @Schedule(hour="0", minute="0", second="0", persistent=false)
    public void someDailyJob() {
        // Do your job here which should run every start of day.
    }

    @Schedule(hour="*/1", minute="0", second="0", persistent=false)
    public void someHourlyJob() {
        // Do your job here which should run every hour of day.
    }

    @Schedule(hour="*", minute="*/15", second="0", persistent=false)
    public void someQuarterlyJob() {
        // Do your job here which should run every 15 minute of hour.
    }

    @Schedule(hour="*", minute="*", second="*/5", persistent=false)
    public void someFiveSecondelyJob() {
        // Do your job here which should run every 5 seconds.
    }

} 

はい、本当にそれだけです。コンテナが自動的にピックアップして管理します。

EJB が利用できない? 使用するScheduledExecutorService

お使いの環境が EJB をサポートしていない場合 (つまり、実際の Java EE サーバーではなく、Tomcat、Jetty などのベアボーン サーブレット コンテナーを使用している場合) は、ScheduledExecutorService. これは によって開始できますServletContextListener。キックオフの例を次に示します。

@WebListener
public class BackgroundJobManager implements ServletContextListener {

    private ScheduledExecutorService scheduler;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        scheduler = Executors.newSingleThreadScheduledExecutor();
        scheduler.scheduleAtFixedRate(new SomeDailyJob(), 0, 1, TimeUnit.DAYS);
        scheduler.scheduleAtFixedRate(new SomeHourlyJob(), 0, 1, TimeUnit.HOURS);
        scheduler.scheduleAtFixedRate(new SomeQuarterlyJob(), 0, 15, TimeUnit.MINUTES);
        scheduler.scheduleAtFixedRate(new SomeFiveSecondelyJob(), 0, 5, TimeUnit.SECONDS);
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {
        scheduler.shutdownNow();
    }

}

ジョブクラスは次のようになります。

public class SomeDailyJob implements Runnable {

    @Override
    public void run() {
        // Do your daily job here.
    }

}
public class SomeHourlyJob implements Runnable {

    @Override
    public void run() {
        // Do your hourly job here.
    }

}
public class SomeQuarterlyJob implements Runnable {

    @Override
    public void run() {
        // Do your quarterly job here.
    }

}
public class SomeFiveSecondelyJob implements Runnable {

    @Override
    public void run() {
        // Do your quarterly job here.
    }

}

java.util.Timer/java.lang.Threadを Java EE / サーブレット ベースの環境で使用することを考えないでください

最後になりましたが、Java EE でand/orを直接使用しないでください。これはトラブルのレシピです。詳細な説明は、同じ質問に関するこの JSF 関連の回答にありますjava.util.Timerjava.lang.Thread

于 2011-01-14T13:45:39.570 に答える
4

定期的にタスクを実行するために、クォーツのようなライブラリを使用することをお勧めします。サーブレットは実際に何をしますか? それはあなたにレポートを送りますか?

于 2011-01-14T13:08:04.263 に答える
2

cron4j を使用できます。http://www.sauronsoftware.it/projects/cron4j/manual.php

于 2011-12-22T08:13:51.010 に答える
0

複数の non-jee コンテナーが実行されている可能性がある実稼働システム。タスク maamgememt にデータベースを使用するように構成できる Quartz スケジューラーのようなエンタープライズ スケジューラーを使用しないでください。

于 2016-02-21T15:31:16.113 に答える