TomcatにWebアプリケーションがデプロイされています。データベースに特定のデータがないかチェックし、そのデータに応じてユーザーにメールを送信する一連のコードがあります。誰かがTomcatでこれをスケジュールする方法を提案できますか?.
実際、Tomcatでタスクをスケジュールする最良の方法は、ScheduledExecutorServiceを使用することです。 TimeTaskはJ2Eアプリケーションでは使用しないでください。これは良い方法ではありません。
正しい方法の例:
コントローラーとは異なるパッケージ(サーブレットパッケージ)を作成し、例として、この新しいパッケージに新しいJavaクラスを作成します。
// your package
import Java.util.concurrent.Executors;
import Java.util.concurrent.ScheduledExecutorService;
import Java.util.concurrent.TimeUnit;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class BackgroundJobManager implements ServletContextListener {
private ScheduledExecutorService scheduler;
@Override
public void contextInitialized(ServletContextEvent event) {
scheduler = Executors.newSingleThreadScheduledExecutor();
// scheduler.scheduleAtFixedRate(new DailyJob(), 0, 1, TimeUnit.DAYS);
scheduler.scheduleAtFixedRate(new HourlyJob(), 0, 1, TimeUnit.HOURS);
//scheduler.scheduleAtFixedRate(new MinJob(), 0, 1, TimeUnit.MINUTES);
// scheduler.scheduleAtFixedRate(new SecJob(), 0, 15, TimeUnit.SECONDS);
}
@Override
public void contextDestroyed(ServletContextEvent event) {
scheduler.shutdownNow();
}
}
その後、次のように他のJavaクラス(スケジュールごとに1つ))を作成できます。
public class HourlyJob implements Runnable {
@Override
public void run() {
// Do your hourly job here.
System.out.println("Job trigged by scheduler");
}
}
楽しい :)
リスナーと cron4j を使用できます。
@WebListener
public class StartListener implements ServletContextListener {
@Override
public void contextInitialized(final ServletContextEvent servletContextEvent) {
Scheduler scheduler = new Scheduler();
scheduler.schedule("0 * * * *", new Task());
scheduler.start();
servletContextEvent.getServletContext().setAttribute("SCHEDULER", scheduler);
}