Как запустить фоновую задачу в веб-приложении на основе сервлетов?
Я использую Java, и я хочу, чтобы сервлет постоянно работал в моем приложении, но я не понимаю, как это сделать. Мой сервлета метод, который дает количество пользователей из базы данных на ежедневной основе, а также общее количество пользователей из базы данных. Поэтому я хочу, чтобы сервлет постоянно работал для этого.
5 ответов:
ваша проблема в том, что вы неправильно понимаете цель сервлет. Он предназначен для работы с HTTP-запросами, не более того. Вы хотите просто фоновую задачу, которая выполняется один раз в день.
EJB в наличии? Используйте
@Schedule
если ваша среда поддерживает EJB (например, WildFly, JBoss AS/EAP, TomEE, 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. } }
Да, это действительно все. Контейнер будет автоматически пикап и управлять им.
EJB недоступен? Используйте
ScheduledExecutorService
если ваша среда не поддерживает EJB (т. е. не настоящий сервер Java EE, например Tomcat, Jetty и т. д.), Используйте
ScheduledExecutorService
. Это может быть инициировано aServletContextListener
. Вот пример старта:@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); } @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. } }
никогда не думайте об использовании
java.util.Timer
/java.lang.Thread
в Java Ээникогда не используйте напрямую
java.util.Timer
и/илиjava.lang.Thread
в Java EE. Это рецепт для неприятностей. Подробное объяснение можно найти в этом ответе, связанном с JSF, на тот же вопрос: создание потоков в управляемом компоненте JSF для запланированных задач с помощью таймера.
Я бы предложил использовать библиотеку, такую как quartz, чтобы запускать задачу через регулярные промежутки времени. Что на самом деле делает сервлет ? Он посылает вам отчет ?
вы можете использовать cron4j.http://www.sauronsoftware.it/projects/cron4j/manual.php
реализовать два класса и называют
startTask()
inmain
.public void startTask() { // Create a Runnable Runnable task = new Runnable() { public void run() { while (true) { runTask(); } } }; // Run the task in a background thread Thread backgroundThread = new Thread(task); // Terminate the running thread if the application exits backgroundThread.setDaemon(true); // Start the thread backgroundThread.start(); } public void runTask() { try { // do something... Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } }