不使用框架,自定义定时任务(web)

来源:互联网 发布:微信开发教程 java 编辑:程序博客网 时间:2024/06/06 00:32
首先需要一个任务类,这个类主要负责执行定时的任务。它是真正的worker。

import javax.servlet.ServletContext;
public class TimerTask extends java.util.TimerTask {
//application 对象,不是一定需要,但是可能实现某些功能时需要,所以最好作为参数传到当前对象中
 private ServletContext ctx;

 public TimerTask(ServletContext ctx) {
  this.ctx = ctx;
 }

 @Override
 public void run() {
  //需要执行的任务放在这里执行。
  System.out.println("-----------任务执行:"+ctx.getServerInfo());
 }
}

-----------------------------------------------华丽的分割线--------------------------------------------------------------------------------
然后需要一个时间调度,这个类定义任务执行的时间,这个类通过ServletContext listener实现。
public class TimerListener implements ServletContextListener {
//时间调度
 private Timer timer;
//任务类
 private TimerTask task;
//格式化时间
 private SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
 //服务器停止时调用此方法
 @Override
 public void contextDestroyed(ServletContextEvent event) {
  //停止时间调度
  if(timer != null){
   timer.cancel();
  }
 }
//服务器启动调用此方法
 @Override
 public void contextInitialized(ServletContextEvent event) {
  try {
  //true 设置为后台线程
  timer=new Timer(true);
  //实例化任务类
  task=new TimerTask(event.getServletContext());
  //开始任务的时间,这里的时间可以做成可配置的,具体实现省略。
  Date settime=sdf.parse("2014-01-09 10:01:00");
  //距离开始还有多少毫秒,因为timer.schedule 不支持直接给定开始时间,而是一个long值
  long starttime=settime.getTime()-new Date().getTime();
  //这个任务会在2014-01-09 10:01:00 被执行,但只会执行一次
  //如果需要循环执行,则 设置第三个参数,也是一个long值,例如:1000,表示在开始时间执行一次后,1000毫钟执行一次。
  timer.schedule(task, starttime);
  } catch (ParseException e) {
   e.printStackTrace();
  }
 }
}
---------------------------------------------------华丽的分割线----------------------------------------------------------------------------
最后在web.xml添加监听信息
<listener>
   <listener-class>com.zjz.timer.TimerListener</listener-class>
</listener>




0 0