Ihr Problem ist, dass Sie den Zweck des Servlets falsch verstehen . Es ist beabsichtigt, auf HTTP-Anfragen zu reagieren, nicht mehr. Sie möchten nur eine Hintergrundaufgabe, die einmal täglich ausgeführt wird.
EJB verfügbar? Verwenden@Schedule
Wenn Ihre Umgebung EJB unterstützt (dh einen echten Java EE-Server wie WildFly, JBoss, TomEE, Payara, GlassFish usw.), verwenden Sie @Schedule
stattdessen. Hier sind einige Beispiele:
@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.
}
}
Ja, das ist wirklich alles. Der Container nimmt ihn automatisch auf und verwaltet ihn.
EJB nicht verfügbar? VerwendenScheduledExecutorService
Wenn Ihre Umgebung EJB nicht unterstützt (dh Sie verwenden keinen echten Java EE-Server, sondern einen Barebone-Servlet-Container wie Tomcat, Jetty usw.), verwenden Sie ScheduledExecutorService
. Dies kann durch a eingeleitet werden ServletContextListener
. Hier ist ein Kickoff-Beispiel:
@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();
}
}
Wo die Jobklassen so aussehen:
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.
}
}
Denken Sie niemals daran, java.util.Timer
/ java.lang.Thread
in einer Java EE / Servlet-basierten Umgebung zu verwenden
Last but not least, niemals direkt java.util.Timer
und / oder java.lang.Thread
in Java EE verwenden. Dies ist ein Rezept für Ärger. Eine ausführliche Erklärung finden Sie in dieser JSF-bezogenen Antwort auf dieselbe Frage: Laichen von Threads in einer von JSF verwalteten Bean für geplante Aufgaben mithilfe eines Timers .