dileepVikram
dileepVikram

Reputation: 932

How to schedule a task in Tomcat

I have a web application deployed in Tomcat. I have a set of code in it, that checks database for certain data and then sends a mail to users depending on that data. Can somebody suggest how to schedule this in Tomcat.

Upvotes: 28

Views: 37441

Answers (3)

You can use a listener and cron4j:

@WebListener
public class StartListener implements ServletContextListener {
    @Override
    public void contextInitialized(final ServletContextEvent servletContextEvent) {
        Scheduler scheduler = new Scheduler();
        scheduler.schedule("0 * * * *", new Task());
        scheduler.start();
        servletContextEvent.getServletContext().setAttribute("SCHEDULER", scheduler);
    }

Upvotes: 3

Benjamin Leconte
Benjamin Leconte

Reputation: 316

Actually, the best way to schedule task in Tomcat is to use ScheduledExecutorService. TimeTask should not be used in J2E applications, this is not a good practice.

Example with the right way :

create a package different that you controller one (servlet package), and create a new java class on this new package as example :

// your package
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import javax.servlet.annotation.WebListener;
@WebListener
public class BackgroundJobManager implements ServletContextListener {

private ScheduledExecutorService scheduler;

@Override
public void contextInitialized(ServletContextEvent event) {
    scheduler = Executors.newSingleThreadScheduledExecutor();
   // scheduler.scheduleAtFixedRate(new DailyJob(), 0, 1, TimeUnit.DAYS);
    scheduler.scheduleAtFixedRate(new HourlyJob(), 0, 1, TimeUnit.HOURS);
   //scheduler.scheduleAtFixedRate(new MinJob(), 0, 1, TimeUnit.MINUTES);
   // scheduler.scheduleAtFixedRate(new SecJob(), 0, 15, TimeUnit.SECONDS);
}

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

}

After that you can create other java class (one per schedule) as follow :

public class HourlyJob implements Runnable {

@Override
public void run() {
    // Do your hourly job here.
    System.out.println("Job trigged by scheduler");
  }
}

Enjoy :)

Upvotes: 29

madhead
madhead

Reputation: 33392

It depends on libraries you use. Several libraries can do that:

Upvotes: 8

Related Questions