Masalah Anda adalah bahwa Anda salah memahami tujuan servlet . Itu dimaksudkan untuk bertindak atas permintaan HTTP, tidak lebih. Anda hanya menginginkan tugas latar belakang yang dijalankan sekali setiap hari.
EJB tersedia? Menggunakan@Schedule
Jika lingkungan Anda kebetulan mendukung EJB (yaitu server Java EE nyata seperti WildFly, JBoss, TomEE, Payara, GlassFish, dll), gunakan @Schedule
saja. Berikut beberapa contohnya:
@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.
}
}
Ya, itu saja. Penampung akan secara otomatis mengambil dan mengelolanya.
EJB tidak tersedia? MenggunakanScheduledExecutorService
Jika lingkungan Anda tidak mendukung EJB (yaitu Anda tidak menggunakan server Java EE yang sebenarnya, tetapi penampung server barebone seperti Tomcat, Jetty, dll), maka gunakan ScheduledExecutorService
. Ini dapat dimulai dengan a ServletContextListener
. Inilah contoh awal:
@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();
}
}
Dimana kelas pekerjaan terlihat seperti ini:
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.
}
}
Jangan pernah berpikir untuk menggunakan java.util.Timer
/ java.lang.Thread
dalam lingkungan berbasis Java EE / Servlet
Last but not least, jangan pernah langsung menggunakan java.util.Timer
dan / atau java.lang.Thread
di Java EE. Ini resep untuk masalah. Penjelasan terperinci dapat ditemukan dalam jawaban terkait JSF ini pada pertanyaan yang sama: Memijahkan utas dalam kacang yang dikelola JSF untuk tugas terjadwal menggunakan pengatur waktu .