Я использую Java и хочу, чтобы в моем приложении постоянно работал сервлет, но я не понимаю, как это сделать. У моего сервлета есть метод, который дает количество пользователей из базы данных на ежедневной основе, а также общее количество пользователей из всей базы данных. Поэтому я хочу, чтобы сервлет работал для этого постоянно.
97
Ответы:
Ваша проблема в том, что вы неправильно понимаете цель сервлета . Он предназначен для обработки HTTP-запросов, не более того. Вам нужна только фоновая задача, которая запускается один раз в день.
EJB доступен? Использовать
@Schedule
Если ваша среда поддерживает EJB (то есть настоящий сервер Java EE, такой как WildFly, JBoss, TomEE, Payara, GlassFish и т. Д.), Используйте
@Schedule
вместо этого. Вот некоторые примеры:Да вот и все. Контейнер автоматически заберет и управит им.
EJB недоступен? Использовать
ScheduledExecutorService
Если ваша среда не поддерживает EJB (т. Е. Вы используете не настоящий сервер Java EE, а пустой контейнер сервлетов, такой как Tomcat, Jetty и т. Д.), Используйте
ScheduledExecutorService
. Это может быть инициировано файломServletContextListener
. Вот начальный пример:Где классы вакансий выглядят так:
Никогда не думайте об использовании
java.util.Timer
/java.lang.Thread
в среде на основе Java EE / ServletИ последнее, но не менее важное: никогда не используйте напрямую
java.util.Timer
и / илиjava.lang.Thread
в Java EE. Это рецепт неприятностей. Подробное объяснение можно найти в этом относящемся к JSF ответе на тот же вопрос: создание потоков в управляемом JSF компоненте для запланированных задач с использованием таймера .источник
ScheduledExecutorService
: обязательно зафиксируйте все исключения в своем исполнителе. Если исключение ускользает из вашегоrun
метода, исполнитель молча прекращает выполнение. Это функция, а не ошибка. Прочтите документ и изучите его, погуглив.scheduler.shutdownNow()
не будет правильно вызван в соответствии с примером. Если это не вызвано, то поток расписания действительно продолжит работу.Я бы посоветовал использовать такую библиотеку, как quartz, для регулярного выполнения задачи. Что на самом деле делает сервлет? Он отправляет вам отчет?
источник
Реализовать два класса и вызвать
startTask()
вmain
.источник
Вы можете использовать cron4j. http://www.sauronsoftware.it/projects/cron4j/manual.php
источник
В производственной системе, в которой может работать несколько контейнеров, не относящихся к jee. Используйте другой планировщик предприятия, например Quartz scheduler, который можно настроить для использования базы данных для задач maamgememt.
источник