Java项目中常使用的定时器有JDK Timer、Quartz、Spring Task等三种。Quartz的功能强大,配置也比较复杂,适合大型、多定时任务的项目使用。Spring Task配置较为简单轻量,需要Spring框架支持。JDK自带的定时器Timer使用灵活,配置简单,适合中小型项目。
Timer是jdk中提供的一个定时器工具,使用的时候会在主线程之外起一个单独的线程执行指定的计划任务,可以指定执行一次或者反复执行多次。
TimerTask是一个实现了Runnable接口的抽象类,代表一个可以被Timer执行的任务。
com.cgb.tspsystem.listener.TimerTaskListener
package com.cgb.tspsystem.listener;
import java.util.Calendar;
import java.util.Date;
import java.util.Timer;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.cgb.tspsystem.utils.TaskMethod;
public class TimerTaskListener implements ServletContextListener{
/*public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 24); // 24点 可以更改时间
calendar.set(Calendar.MINUTE, 0); // 0分 可以更改分数
calendar.set(Calendar.SECOND, 0);// 0 默认为0,不以秒计
Date date = calendar.getTime();
long time=24*60*60*1000;//24个小时
Timer timer= new Timer();
TaskMethod taskMethod=new TaskMethod();;
timer.schedule(taskMethod, date, time);// 在凌晨24点零分零秒后执行此任务,每次间隔24小时
}*/
Timer timer= new Timer();
TaskMethod taskMethod=new TaskMethod();;
public void contextInitialized(ServletContextEvent sce) {
Calendar calendar = Calendar.getInstance();
calendar.set(Calendar.HOUR_OF_DAY, 24); // 24点 可以更改时间
calendar.set(Calendar.MINUTE, 0); // 0秒 可以更改分数
calendar.set(Calendar.SECOND, 0);// 0 默认为0,不以秒计
Date date = calendar.getTime();
long time=24*60*60*1000;//24个小时
timer.schedule(taskMethod, date, time);//在凌晨24点零分零秒后执行此任务,每次间隔24小时
// 第一种方法:指定任务task在指定时间time执行
//schedule(TimerTask task, Date time)
// 第二种方法:指定任务task在指定延迟delay后执行
//schedule(TimerTask task, long delay)
// 第三种方法:指定任务task在指定时间firstTime执行后,进行重复固定延迟频率peroid的执行
// schedule(TimerTask task, Date firstTime,long period)
// 第四种方法:指定任务task 在指定延迟delay 后,进行重复固定延迟频率peroid的执行
// schedule(TimerTask task, long delay, long period)
// 第五种方法:指定任务task在指定时间firstTime执行后,进行重复固定延迟频率peroid的执行
// scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
// 第六种方法:指定任务task 在指定延迟delay 后,进行重复固定延迟频率peroid的执行
// scheduleAtFixedRate(TimerTask task, long delay, long period)
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
}
}
package com.cgb.tspsystem.utils;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimerTask;
import javax.servlet.ServletContext;
public class TaskMethod extends TimerTask{
public void run() {
EndMethod em=new EndMethod();
/*Date dt = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
System.out.println("定时执行:"+sdf.format(dt));*/
em.run();
}
}
我们在应用场景中会遇到每一个任务的执行时间都不相同,并且每一个任务只执行一次,如果按照上面的做法,就是每次生成一个TimerTask放到Timer中执行,这样太耗费资源了,我们需要实现一个线程来监听所有的任务。
package com.cgb.tspsystem.utils;
import com.cgb.core.persistent.Constants;
import com.cgb.core.persistent.DataManager;
import com.cgb.core.persistent.db.DBDataModel;
public class EndMethod implements Runnable{
@Override
public void run() {
System.out.println("运政系统从业人员满六十周岁自动注销资格证-->开始");
update();
}
DBDataModel dm = new DBDataModel();
public void update() {
dm.clear();
String sql = "UPDATE (SELECT * FROM TB_EMP_CERTIFIC t LEFT JOIN TB_EMP_PERSON p ON t.V_VCH_PERSON_ID=p.V_VCH_PERSON_ID WHERE p.V_VCH_NAME ='王文义' AND p.V_DTM_BIRTHDAY < add_months(sysdate,-720)) A SET A.V_CHR_CERTIFIC_STATE='S'";
dm.setMode(Constants.MODE_UPDATE);
dm.setSQL(sql);
DataManager.getHandler(dm).executeUpdate(dm);
System.out.println(dm.getMode());
System.out.println("注销完成!");
}
}