Ваша проблема в том, что вы неправильно понимаете цель сервлета . Он предназначен для обработки HTTP-запросов, не более того. Вам нужна только фоновая задача, которая запускается один раз в день.
EJB доступен? Использовать@Schedule
Если ваша среда поддерживает EJB (то есть настоящий сервер Java EE, такой как WildFly, JBoss, TomEE, Payara, GlassFish и т. Д.), Используйте @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.
}
}
Да вот и все. Контейнер автоматически заберет и управит им.
EJB недоступен? ИспользоватьScheduledExecutorService
Если ваша среда не поддерживает EJB (т. Е. Вы используете не настоящий сервер Java EE, а пустой контейнер сервлетов, такой как Tomcat, Jetty и т. Д.), Используйте 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.
}
}
Никогда не думайте об использовании java.util.Timer
/ java.lang.Thread
в среде на основе Java EE / Servlet
И последнее, но не менее важное: никогда не используйте напрямую java.util.Timer
и / или java.lang.Thread
в Java EE. Это рецепт неприятностей. Подробное объяснение можно найти в этом относящемся к JSF ответе на тот же вопрос: создание потоков в управляемом JSF компоненте для запланированных задач с использованием таймера .