web-dev-qa-db-ja.com

JSP /サーブレットWebアプリケーションのバックグラウンドタイマータスク

サブスクリプションから取得し、6時間ごとにサブスクリプションからDBへのフィードを保存したいと思います。このタスクを実行するために、バックグラウンドでタイマースレッドを使用したいと思います。

最善の方法は何ですか?通常のタイマースレッドまたはQuartzAPI?

21
MalTec

まず、これにはJSPを使用しません。ありません。

Java EE 5を使用している場合は、コンテナが提供するジョブスケジューリングAPIを使用してください。詳細は使用しているコンテナによって異なります。たとえば、JBoss AS5にはQuartzが同梱されています。 。または、 Spring などのジョブスケジューリングAPIを提供するJSP /サーブレット上でフレームワークを使用している場合は、それを使用する必要があります。

何もない場合(Tomcat 6のみを使用している場合など)、またはコンテナーやフレームワークから独立させたい場合は、 ServletContextListener を作成します。 ScheduledExecutorService 。詳細については、 この回答 をご覧ください。

または、EJB3.1をサポートするJava EE 6コンテナ(JBoss AS 6、GlassFish 3、したがってnotTomcat 7)を既に使用している場合)、最も簡単なのは、 _@Singleton_ メソッドを使用して _@Schedule_ EJBを作成することです。

_@Singleton
public class UpdateSubscriptions {

    @Schedule(hour="*/6", minute="0", second="0", persistent=false)
    public void run() {
        // Do your job here.
    }

}        
_

それでおしまい。これ以上の構成は必要ありません。


Update:コメントによると、Tomcat(6または7?)を使用しています。 6時間ごとにタスクを実行するwebappの起動中にスレッドを開始するには、 beforelinked answer に示されている例を使用し、 scheduleAtFixedRate() メソッド

_scheduler.scheduleAtFixedRate(new UpdateSubscriptions(), 0, 6, TimeUnit.HOURS);
_

クラスUpdateSubscriptionsRunnable を実装する必要があり、実際のジョブは run()で実行する必要があります。 リンクされた回答の例のように _@Override_

40
BalusC