web-dev-qa-db-fra.com

Comment planifier une tâche dans Tomcat

J'ai déployé une application Web dans Tomcat. J'ai un ensemble de code, qui vérifie la base de données pour certaines données et envoie ensuite un courrier aux utilisateurs en fonction de ces données. Quelqu'un peut-il suggérer comment planifier cela dans Tomcat.

20
dileepVikram

En fait, la meilleure façon de planifier une tâche dans Tomcat est d'utiliser ScheduledExecutorService. TimeTask ne doit pas être utilisé dans les applications J2E, ce n'est pas une bonne pratique.

Exemple avec la bonne façon:

créez un package différent de celui que vous contrôlez (package servlet), et créez une nouvelle classe Java sur ce nouveau package comme exemple:

// 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();
 }

}

Après cela, vous pouvez créer une autre classe Java (une par programme) comme suit:

public class HourlyJob implements Runnable {

@Override
public void run() {
    // Do your hourly job here.
    System.out.println("Job trigged by scheduler");
  }
}

Prendre plaisir :)

19
Benjamin Leconte

Cela dépend des bibliothèques que vous utilisez. Plusieurs bibliothèques peuvent le faire:

7
madhead

Vous pouvez utiliser un écouteur et 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);
    }
3