आपकी समस्या यह है कि आप सर्वलेट के उद्देश्य को गलत समझते हैं । यह HTTP अनुरोधों पर कार्रवाई करने का इरादा है, इससे ज्यादा कुछ नहीं। आप केवल एक पृष्ठभूमि कार्य चाहते हैं जो दैनिक आधार पर एक बार चलता है।
ईजेबी उपलब्ध है? उपयोग@Schedule
यदि आपका वातावरण EJB (जैसे कि WildFly, JBoss, TomEE, Payara, GlassFish, इत्यादि जैसे वास्तविक जावा EE सर्वर) का समर्थन करने के लिए होता है, तो @Schedule
इसके बजाय उपयोग करें । यहाँ कुछ उदाहरण हैं:
@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.
}
}
हाँ, यह वास्तव में है। कंटेनर स्वचालित रूप से पिकअप और इसे प्रबंधित करेगा।
ईजेबी अनुपलब्ध? उपयोगScheduledExecutorService
यदि आपका वातावरण EJB का समर्थन नहीं करता है (अर्थात आप एक वास्तविक जावा ईई सर्वर का उपयोग नहीं कर रहे हैं, लेकिन एक टॉम्बैट, जेट्टी, इत्यादि जैसे नंगे कोने सर्वलेटकेंटर), तो उपयोग करें ScheduledExecutorService
। यह एक द्वारा शुरू किया जा सकता है ServletContextListener
। यहां एक किकऑफ उदाहरण दिया गया है:
@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();
}
}
नौकरी वर्ग इस तरह दिखते हैं:
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.
}
}
जावा EE / सर्वलेट आधारित वातावरण में java.util.Timer
/ का उपयोग करने के बारे में कभी मत सोचोjava.lang.Thread
अंतिम लेकिन कम से कम, जावा ईई में कभी भी सीधे उपयोग java.util.Timer
और / या नहीं java.lang.Thread
। यह परेशानी का नुस्खा है। इसी सवाल पर जेएसएफ से संबंधित जवाब में एक विस्तृत विवरण पाया जा सकता है: एक जेएसएफ में स्प्रेडिंग थ्रेड्स टाइमर का उपयोग करके अनुसूचित कार्यों के लिए प्रबंधित बीन ।