如何在Tomcat中安排任务
我在Tomcat中部署了一个Web应用程序。 我有一组代码,用于检查数据库中的某些数据,然后根据该数据向用户发送邮件。 有人可以建议如何在Tomcat中安排这个。
实际上,在Tomcat中安排任务的最佳方法是使用ScheduledExecutorService。 不应在J2E应用程序中使用TimeTask,这不是一个好习惯。
正确的例子:
创建一个与控制器一个不同的包(servlet包),并在这个新包上创建一个新的java类,例如:
// 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(); } }
之后,您可以创建其他java类(每个计划一个),如下所示:
public class HourlyJob implements Runnable { @Override public void run() { // Do your hourly job here. System.out.println("Job trigged by scheduler"); } }
请享用 :)
这取决于您使用的库。 有几个库可以做到这一点:
- Quartz / Tomcat示例 。
- spring
- 来自Java SE的类 。
- 如果你在GAE上运行,请看一下。
你可以使用一个监听器和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); }