Votre problème est que vous ne comprenez pas le but du servlet . Il est destiné à agir sur les requêtes HTTP, rien de plus. Vous voulez juste une tâche d'arrière-plan qui s'exécute une fois par jour.
EJB disponible? Utilisation@Schedule
Si votre environnement prend en charge EJB (c'est-à-dire un vrai serveur Java EE tel que WildFly, JBoss, TomEE, Payara, GlassFish, etc.), utilisez à la @Schedule
place. Voici quelques exemples:
@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.
}
}
Oui, c'est vraiment tout. Le conteneur le récupérera et le gérera automatiquement.
EJB indisponible? UtilisationScheduledExecutorService
Si votre environnement ne prend pas en charge EJB (c'est-à-dire que vous n'utilisez pas un vrai serveur Java EE, mais un conteneur de servlet simple tel que Tomcat, Jetty, etc.), utilisez ScheduledExecutorService
. Cela peut être initié par un ServletContextListener
. Voici un exemple de lancement:
@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();
}
}
Où les classes d'emplois ressemblent à ceci:
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.
}
}
Ne pensez jamais à utiliser java.util.Timer
/ java.lang.Thread
dans un environnement basé sur Java EE / Servlet
Last but not least, n'utilisez jamais directement java.util.Timer
et / ou java.lang.Thread
dans Java EE. C'est la recette des ennuis. Une explication détaillée peut être trouvée dans cette réponse relative à JSF sur la même question: Générer des threads dans un bean géré JSF pour les tâches planifiées à l'aide d'un minuteur .