如何在服务器上面执行定时程序,在指定的时候执行指定的代码
首先是ServletContextListener这个类
如果实现这个接口,然后加上xml的配置
<listener>
<listener-class>com.xxx.xxx.MyTimerTask</listener-class>
</listener>
当web项目发布至tomcat启动之后会自动加载这个类,然后重写里面的contextInitialized和contextDestroyed方法就能在web容器初始化和销毁的时候干你想干的事情了。这里我们把它用作,开始计时器和结束计时器用。
下面直接上计时器的代码
/** * 计时器任务类 * @author XX * */ public class MyTimerTask implements ServletContextListener{ //定义一个计时器 private Timer timer = null; /** * 销毁方法 */ @Override public void contextDestroyed(ServletContextEvent event) { timer.cancel(); System.out.println("定时器销毁"); event.getServletContext().log("定时器销毁"); } /** * 创建方法 */ @Override public void contextInitialized(ServletContextEvent event) { //在这里初始化监听器,在tomcat启动的时候监听器启动,可以在这里实现定时器功能 timer = new Timer(true); System.out.println("定时器已启动"); event.getServletContext().log("定时器已启动");//添加日志,可在tomcat日志中查看到 //调用exportHistoryBean,0表示任务无延迟,5*1000表示每隔5秒执行任务,60*60*1000表示一个小时; //timer.schedule(task,0,10*1000); Task task = new Task(); //表示一天的毫秒数 long daySpan = 24 * 60 * 60 * 1000; final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd '16:49:00'"); Date startTime = new Date(); try { startTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(sdf.format(new Date())); } catch (ParseException e) { e.printStackTrace(); } //如果当前已经超过了设置的时间,那么到第二天的这个时间开始 if(System.currentTimeMillis() > startTime.getTime()) startTime = new Date(startTime.getTime() + daySpan); //设置定时器,从startTime开始,每5秒执行一次task timer.scheduleAtFixedRate(task, startTime, 5*1000); } //定时器执行的任务 class Task extends TimerTask{ @Override public void run() { System.out.println("定时程序!"); } } }