我在 Tomcat 中部署了一个 Web 应用程序。我有一组代码,用于检查数据库中的某些数据,然后根据该数据向用户发送邮件。有人可以建议如何在Tomcat中安排这个。
问问题
33064 次
3 回答
26
实际上,在 Tomcat 中调度任务的最佳方式是使用 ScheduledExecutorService。TimeTask 不应该在 J2E 应用程序中使用,这不是一个好的做法。
正确方法的示例:
创建一个与您的控制器不同的包(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");
}
}
享受 :)
于 2017-02-28T08:47:31.583 回答
8
这取决于您使用的库。有几个图书馆可以做到这一点:
- Tomcat 的石英/示例。
- 春天。
- Java SE 中的一个类。
- 如果您在 GAE 上运行,请查看此.
于 2013-08-14T08:07:30.307 回答
3
您可以使用监听器和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);
}
于 2016-04-06T11:30:16.253 回答