1.首先肯定是容器一启动就要启动定时器,所以我们可以选择把定时器写在一个监听器里,容器一启动所以监听器也就跟着启动,然后定时器就可以工作了。
第一步,把自己写的监听器加到web.xml中;
第二步,写一个监听器,实现ServletContextListener接口;
第三步,写一个定时器,继承TimerTask,在复写的run()方法里写具体的业务逻辑。
第四步,在自己的监听器里复写的
public void contextInitialized(ServletContextEvent arg0){
}
这个方法里调用定时器的schedule方法。
具体代码如下:
web.xml添加:
1 <!-- 用于补偿认证信息异常的数据,用来启动定时器,20170505 --> 2 <listener> 3 <listener-class>com.dcits.app.servlet.MyTimerTaskListener</listener-class> 4 </listener>
MyTimerTaskListener.java
1 package com.dcits.app.servlet; 2 3 import java.util.Calendar; 4 import java.util.Timer; 5 6 import javax.servlet.ServletContextEvent; 7 import javax.servlet.ServletContextListener; 8 /** 9 * @author Weiyongle 10 * @time 2017-5-5 下午2:05:32 11 */ 12 public class MyTimerTaskListener implements ServletContextListener { 13 private Timer timer = null; 14 @Override 15 public void contextDestroyed(ServletContextEvent arg0) { 16 timer.cancel(); 17 } 18 19 @Override 20 public void contextInitialized(ServletContextEvent arg0) { 21 System.out.println("-----开始启动定时器------"); 22 Calendar twentyOne = Calendar.getInstance(); 23 twentyOne.set(Calendar.HOUR_OF_DAY, 23); 24 twentyOne.set(Calendar.MINUTE, 0); 25 twentyOne.set(Calendar.SECOND, 0); 26 timer = new Timer(true); 27 //第一次是晚上23点执行,间隔24小时执行一次 28 timer.schedule(new MyTimerTask(), twentyOne.getTime(), 1000*60*60*24); 29 30 31 /*System.out.println("-----开始启动定时器------"); 32 Calendar twentyOne = Calendar.getInstance(); 33 twentyOne.set(Calendar.HOUR_OF_DAY, 14); 34 twentyOne.set(Calendar.MINUTE, 47); 35 twentyOne.set(Calendar.SECOND, 0); 36 timer = new Timer(true); 37 timer.schedule(new MyTimerTask(), twentyOne.getTime(), 1000*10);*/ 38 } 39 40 }
MyTimerTask.java
1 package com.dcits.app.servlet; 2 3 import java.io.IOException; 4 import java.util.HashMap; 5 import java.util.Map; 6 import java.util.TimerTask; 7 8 import org.codehaus.jackson.JsonGenerationException; 9 import org.codehaus.jackson.map.JsonMappingException; 10 /** 11 * 定时器,用于补偿认证的时候没有获取到正常返回的那些数据 12 * @author Weiyongle 13 * @time 2017-5-5 下午2:20:12 14 */ 15 public class MyTimerTask extends TimerTask{ 16 private static StringBuffer url = new StringBuffer(); 17 @Override 18 public void run() { 19 //生产环境 20 // url.append("https://我是具体的ip地址/nmsypt/servlet/webServlet");//生产环境 21 url.append("http://localhost:8080/adp/servlet/webServlet");//本地环境 22 Map<String,Object> reqMap = new HashMap<String,Object>(); 23 //这里的map从数据库里获取对应的数据不写死就行了,先获取map,在写个for循环进行循环就行了 24 reqMap.put("QYMC","丹同学的公司"); 25 reqMap.put("NSRSBH","158028307441234"); 26 reqMap.put("SJHM_FR","15802830744"); 27 reqMap.put("YZM","123456"); 28 reqMap.put("CWFZR","");// 29 reqMap.put("ZJLX_DM_CW","");// 30 reqMap.put("ZJHM_CW","");// 31 reqMap.put("ZGRS","1234"); 32 reqMap.put("SQYY","");// 33 reqMap.put("JRCPBM","00002"); 34 reqMap.put("XYDM","1"); 35 reqMap.put("XZQHDM",""); 36 reqMap.put("QYBM","QY17900000647001"); 37 try { 38 CompensateData.CompensateDatas(url.toString(), reqMap); 39 System.out.println("-----成功补偿了一条认证信息------"); 40 } catch (JsonGenerationException e) { 41 e.printStackTrace(); 42 } catch (JsonMappingException e) { 43 e.printStackTrace(); 44 } catch (IOException e) { 45 e.printStackTrace(); 46 } 47 } 48 49 }