在Java的6.0版本中新增了concurrent包,这个包是用作线程同步的包,提供了很多工具类。
其中定时器就是其中之一。近期在做一个项目,在项目中要实现启动Web服务的同时启动一个任务,要求此任务为守护进程,定时调用一些任务操作代码。在网上搜索相关的实现,综合考虑得出一个解决方案。方案是:使用tomcat服务器的监听器类作守护进程,调用concurrent包提供的定时器,最后在定时器中调用操作实现代码。具体实现类Translator在这里不再给出,将其替换为自己需要的实现类即可。
1.任务类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
import java.util.TimerTask; import javax.servlet.ServletContext; public class MyTask extends TimerTask{ private ServletContext context = null ; public CleanTpIpTask(ServletContext servletContext) { this .context = servletContext; } @Override public void run() { //定时任务逻辑代码 } } |
2.监听类
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
import java.util.Calendar; import java.util.Date; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; public class MyTaskListener implements ServletContextListener { private java.util.Timer timer = null ; MyTask myTask = null ; public void contextDestroyed(ServletContextEvent arg0) { timer.cancel(); } public void contextInitialized(ServletContextEvent arg0) { Calendar c = Calendar.getInstance(); int year = c.get(Calendar.YEAR); int month = c.get(Calendar.MONTH); int day = c.get(Calendar.DAY_OF_MONTH); c.set(year, month, day, 3 , 0 , 0 ); //项目启动当天凌晨3点执行1次,如果已经超过凌晨3点,立刻执行 Date date = c.getTime(); timer = new java.util.Timer( true ); int period = 24 * 60 * 60 * 1000 ; //执行间隔 if (myTask== null ){ myTask = new MyTask(arg0.getServletContext()); timer.schedule( new MyTask(arg0.getServletContext()), date, period); //timer.schedule(new CleanTpIpTask(arg0.getServletContext()), date);//只执行1次 //timer.schedule(new CleanTpIpTask(arg0.getServletContext()), 0, period);//项目启动立刻执行,每隔period 毫秒执行1次 } } } |
3.在web.xml中配置
1
2
3
|
< listener > < listener-class >webservice.MyTaskListener</ listener-class > </ listener > |