[解決済み] サーブレットベースのWebアプリケーションでバックグラウンドタスクを実行するには?
質問
Javaを使用していて、アプリケーション内でサーブレットを継続的に実行させたいのですが、その方法がわかりません。私のサーブレットは、データベースからのユーザーのカウントを毎日提供し、データベース全体からのユーザーの総カウントを提供するメソッドを持っています。だから私はそのためにサーブレットを継続的に実行したいのです。
どのように解決するのですか?
あなたの問題は、あなたが サーブレット . これは HTTP リクエストを処理するためのものであり、それ以上のものではありません。毎日一度だけ実行されるバックグラウンドタスクが必要なのです。
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.util.Timer
とか
java.lang.Thread
を使用することができます。これはトラブルの元です。同じ質問に対するこのJSF関連の回答で、詳しい説明があります。
タイマーを使用してスケジュールされたタスクのためにJSFマネージドBeanでスレッドを生成する
.
関連
-
[解決済み】クロススレッド操作が有効でない。作成されたスレッド以外のスレッドからアクセスされたコントロール
-
[解決済み] JSP/Servletを使用してサーバーにファイルをアップロードするにはどうすればよいですか?
-
[解決済み] Node.jsをバックグラウンドプロセスとして実行し、決して死なないようにする方法とは?
-
[解決済み】セマフォとモニター、何が違うの?
-
[解決済み】サーブレットベースのアプリケーションで、設定リソースファイルをどこに置き、どのように読み込むか?
-
[解決済み】Node.jsに対するHaskellの対応について教えてください。
-
[解決済み】糸と繊維の違いは何ですか?
-
[解決済み】Redisはシングルスレッドですが、同時I/Oはどのように行うのですか?
-
[解決済み] Java Web アプリケーションでアプリケーションサーバーの外側から静的データを提供する最も簡単な方法
-
[解決済み] JUnit を使ってサーブレットをテストする方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] スレッドコンテンションとは何ですか?
-
[解決済み] "フリースレッド "と "スレッドセーフ "の違いについて
-
[解決済み] デッドロックとは何ですか?
-
[解決済み] 初心者のためのアトミック操作とは?
-
[解決済み] Pythonでループ内の演算をマルチスレッド化する方法
-
[解決済み】スレッド間で共有されるリソースは何ですか?
-
[解決済み】セマフォとモニター、何が違うの?
-
[解決済み】Redisはシングルスレッドですが、同時I/Oはどのように行うのですか?
-
[解決済み] 「executeFetchRequestで「コレクションは列挙中に変異しました。
-
[解決済み] node.jsの並列タスクにはどっちがいいんだろう?ファイバー?Web-worker?それともThreads?