java 定时任务的话 可以用 JDK 自带的TimerTask 来实现(具体查阅api 文档), 而这个定时任务 为了跟随 web 项目 启动而启动的话 有两种 实现方式。
1:web.xml里配置一个Servlet
设置其随web server的启动而启动。然后在该Servlet的init()方法里启动定时器,在destory()方法里销毁定时器。
2:web.xml里配置一个Listener
在该Listener的初始化方法里启动定时器,在其销毁的方法销毁定时器。
下面是 demo:
继承TimerTask
public class CrmDataTimerTasker extends TimerTask {
private static Logger log=Logger.getLogger(CrmDataTimerTasker.class);
@Override
public void run() {
//需要执行的任务
System.out.println("这里是你要调用的任务");
}
}
public class TimerManager {
private static final long PERIOD_DAY = 24*60*60*1000;
private static Timer timer = new Timer(false);
public TimerManager(){
System.out.println("-------------------------------------------定时任务初始化");
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 15);
calendar.set(Calendar.MINUTE, 0);
calendar.set(Calendar.SECOND, 0);
Date date=calendar.getTime();
//如果第一次执行定时任务的时间 小于 当前的时间
//此时要在 第一次执行定时任务的时间 加一天,以便此任务在下个时间点执行。如果不加一天,任务会立即执行。
if(date.before(new Date())){
date=this.addDay(date, 1);
}
CrmDataTimerTasker task = new CrmDataTimerTasker();//这个是你的任务
timer.schedule(task, date,PERIOD_DAY);
}
public static void cancel(){
timer.cancel();
}
public Date addDay(Date date,int num){
Calendar calendar=Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.DAY_OF_MONTH, num);
return calendar.getTime();
}
}
我选择在 web.xml 里面 配置一个监听器
StartListener
com.aisino.crm.remote.service.crm.until.crmTaskerListener
crmTaskerListener.java
public class crmTaskerListener implements ServletContextListener {
private static Logger log=Logger.getLogger(crmTaskerListener.class);
@Override
public void contextInitialized(ServletContextEvent sce) {
log.info("++++++++++++++++++++我开始监听了++++++++++++++++++++++++");
log.info("++++++++++++++++++++我开始监听了++++++++++++++++++++++++");
new TimerManager();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
log.info("==================销毁了=====================");
TimerManager.cancel();
}
}
一些相关资料可以参阅:
定时任务相关: