running periodic task at server side for servlet JSP MVC website [duplicate]

随声附和 提交于 2020-01-09 04:22:07

问题


I have developed a web application using using servlet and JSP. I am not using any framework per se, instead using my own home brewed MVC framework. I am using MySQL as a backend.

I want to do the following:

  1. Clean up some data from the data base every hour
  2. Generate and store statistics about data every 15 minutes in an XML file somewhere

The problem is: currently all my code runs as a result of the request received from a client.

How do I run periodic task(s) at the server side?

One solution I have right now is to creare a thread in the controller's init function. Are there any other options?


回答1:


You can use ServletContextListener to execute some initialization on webapp's startup. The standard Java API way to run periodic tasks would be a combination of Timer and TimerTask. Here's a kickoff example:

public void contextInitialized(ServletContextEvent event) {
    Timer timer = new Timer(true);
    timer.scheduleAtFixedRate(new CleanDBTask(), 0, oneHourInMillis);
    timer.scheduleAtFixedRate(new StatisticsTask(), 0, oneQuartInMillis);
}

where the both tasks can look like:

public class CleanDBTask extends TimerTask {
    public void run() {
        // Implement.
    }
}

Using Timer is however not recommended in Java EE. If the task throws an exception, then the entire Timer thread is killed and you'd basically need to restart the whole server to get it to run again. The Timer is also sensitive to changes in system clock.

The newer and more robust java.util.concurrent way would be a combination of ScheduledExecutorService and just a Runnable. Here's a kickoff example:

private ScheduledExecutorService scheduler;

public void contextInitialized(ServletContextEvent event) {
    scheduler = Executors.newSingleThreadScheduledExecutor();
    scheduler.scheduleAtFixedRate(new CleanDBTask(), 0, 1, TimeUnit.HOURS);
    scheduler.scheduleAtFixedRate(new StatisticsTask(), 0, 15, TimeUnit.MINUTES);
}

public void contextDestroyed(ServletContextEvent event) {
    scheduler.shutdownNow();
}



回答2:


you can use any schedular to schedule your process like quartz, spring scheduler

http://static.springsource.org/spring/docs/2.5.x/reference/scheduling.html has a good support for these stuffs with any implementation.



来源:https://stackoverflow.com/questions/2248971/running-periodic-task-at-server-side-for-servlet-jsp-mvc-website

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!