Sizin sorununuz, sunucu uygulamasının amacını yanlış anlamanızdır . HTTP isteklerine göre hareket etmek amaçlanmıştır, daha fazlası değil. Sadece günde bir kez çalışan bir arka plan görevi istiyorsunuz.
EJB mevcut mu? Kullanım@Schedule
Ortamınız EJB'yi (ör. WildFly, JBoss, TomEE, Payara, GlassFish, vb. Gibi gerçek bir Java EE sunucusu) destekliyorsa, @Schedule
bunun yerine kullanın. İşte bazı örnekler:
@Singleton
public class BackgroundJobManager {
@Schedule(hour="0", minute="0", second="0", persistent=false)
public void someDailyJob() {
}
@Schedule(hour="*/1", minute="0", second="0", persistent=false)
public void someHourlyJob() {
}
@Schedule(hour="*", minute="*/15", second="0", persistent=false)
public void someQuarterlyJob() {
}
@Schedule(hour="*", minute="*", second="*/5", persistent=false)
public void someFiveSecondelyJob() {
}
}
Evet, gerçekten hepsi bu. Konteyner otomatik olarak alacak ve yönetecektir.
EJB mevcut değil mi? KullanımScheduledExecutorService
Ortamınız EJB'yi desteklemiyorsa (yani gerçek bir Java EE sunucusu kullanmıyorsanız, Tomcat, Jetty, vb. Gibi bir barebone servlet kapsayıcısı kullanıyorsanız), o zaman kullanın ScheduledExecutorService
. Bu, bir ServletContextListener
. İşte bir başlangıç örneği:
@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();
}
}
Meslek sınıflarının şöyle göründüğü yer:
public class SomeDailyJob implements Runnable {
@Override
public void run() {
}
}
public class SomeHourlyJob implements Runnable {
@Override
public void run() {
}
}
public class SomeQuarterlyJob implements Runnable {
@Override
public void run() {
}
}
public class SomeFiveSecondelyJob implements Runnable {
@Override
public void run() {
}
}
Hiç kullanarak düşünme java.util.Timer
/ java.lang.Thread
Java EE / Servlet tabanlı ortamda
Son olarak, hiçbir zaman doğrudan java.util.Timer
ve / veya java.lang.Thread
Java EE'de kullanmayın. Bu bela için reçetedir. Aynı soruya ilişkin bu JSF ile ilgili yanıtta ayrıntılı bir açıklama bulunabilir: Bir zamanlayıcı kullanarak zamanlanmış görevler için JSF tarafından yönetilen bir çekirdekte ileti dizileri üretme .