Tomcat设置定时任务

工作需要,接手的Tomcat项目,需要执行一个定时任务。

修改web.xml

增加<load-on-startup>配置[^1],可以使中的类随Tomcat启动而自动启动。

1
2
3
4
5
6
7
8
9
<servlet>
<servlet-name>ServerRun</servlet-name>
<servlet-class>com.xxx.ServerRun</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ServerRun</servlet-name>
<url-pattern>/ServerRun</url-pattern>
</servlet-mapping>

新建一个 Serlet ServerRun

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class ServerRun extends HttpServlet {
private Timer timer = null;
public void init(ServletConfig config) throws ServletException {
super.init(config);
timer = new Timer(true);
//定时任务类
timer.schedule(new MyTask(), 1000, 1000);
}
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
public void destroy() {
}
}

第一个参数new MyTask(event.getServletContext())
是 TimerTask 类,在包:import java.util.TimerTask .使用者要继承该类,并实现 public void run()方法,因为 TimerTask 类实现了 Runnable 接口。

第二个参数”0”的意思是:(0就表示无延迟)
当你调用该方法后,该方法必然会调用 TimerTask 类 TimerTask 类 中的 run() 方法,这个参数就是这两者之间时间的差值,也就是说,用户调用 schedule() 方法后,要等待这么长的时间才可以第一次执行 run() 方法。

第三个参数”60*60*1000”的意思就是:
(单位是毫秒60*60*1000为一小时)
(单位是毫秒3*60*1000为三分钟)
第一次调用之后,从第二次开始每隔多长的时间调用一次 run() 方法。

新建工作类

1
2
3
4
5
6
7
8
9
import java.util.TimerTask;
public class MyTask extends TimerTask {
@Override
public void run() {
System.out.println("test");
}
}

[^1]:load-on-startup 这个元素的含义是在服务器启动的时候就加载这个servlet(实例化并调用init()方法).这个元素中的可选内容必须为一个整数,表明了这个servlet被加载的先后顺序.当是一个负数时或者没有指定时,则表示服务器在该servlet被调用时才加载。当值为0或者大于0时,表示服务器在启动时就加载这个servlet.该容器肯定可以保证被标记为更小的整数的servlet比被标记为更大的整数的servlet更先被调用,还可已选择同样的load-on-start-up值来夹在servlets.正数的值越小,启动该servlet的优先级越高。