1.自己写while(true)死循环,来判断是否到达执行时间条件
这种实现定时任务的方式,完全是自己写代码实现,放在第一个介绍,是因为它最灵活,完全由自己控制,但是缺点是,只适合小工具类的程序,任务单一固定的程序。
实现的简单代码块如下:
long interval = 100; // 秒
String runTime = "12:50";
Date startTime = new Date();
boolean runFlag = false;
int count = 0;
while(true){
Date nowTime = new Date();
if (!StringUtils.isEmpty(runTime)) {
String checkTime = DateUtilsExt.getNowTime("HH:mm");
if (runTime.equals(checkTime)) {
runFlag = true;
}
} else if (intervalTime > 0) {
long now = nowTime.getTime();
long start = startTime.getTime();
long interval = (now - start)/1000;
//第一次执行
if (count == 0) {
runFlag = true;
//间隔时间执行 运行间隔到了指定秒以后执行
} else if (intervalTime <= interval){
runFlag = true;
}
}
if (runFlag) {
// 执行定时任务
}
}
2.java自带的工具类 timer + timerTask
这个方式是我们本次导数工具所用的程序。用着挺方便,timer ,timerTask 都是java.util中提供的工具类,既可以用于java web项目,也可以用于javase项目。实,现代码如下
1.具体任务类
public class DateImportTask extends TimerTask {
private static Logger log = Logger.getLogger(DateImportTask.class);
private static boolean isRunning = false;
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
public void run() {
if (!isRunning) {
isRunning = true;
log.info("开始执行任务..."); //开始任务
//working add what you want to do
log.info("执行任务完成..."); //任务完成
isRunning = false;
} else {
log.info("上一次任务执行还未结束..."); //上一次任务执行还未结束
}
}
}
2.任务控制类
public class TaskManager implements ServletContextListener {
private final Logger logger = Logger.getLogger(TaskManager.class);
/**
* 无延迟
*/
public static final long NO_DELAY = 0;
/**
* 定时器
*/
private Timer timer;
/**
* 在Web应用启动时初始化任务
*/
public void contextInitialized(ServletContextEvent event) {
//定义定时器
timer = new Timer("数据导入任务",true);
logger.info("定时器初始化。。。");
//启动备份任务,每 执行一次
// timer.schedule(new DateImportTask(),NO_DELAY, DateUtils.MILLIS_PER_SECOND * 1);
// 设置指定时间点启动任务
String startHour = event.getServletContext().getInitParameter("startHour");
String startMinute = event.getServletContext().getInitParameter("startMinute");
int hour = 14;
if (StringUtils.isNotBlank(startHour)){
hour = Integer.parseInt(startHour);
}
int minute = 14;
if (StringUtils.isNotBlank(startMinute)){
minute = Integer.parseInt(startMinute);
}
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY,hour);
c.set(Calendar.MINUTE,minute);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
logger.info("设置的启动时间为:"+sdf.format(c.getTime()));
timer.schedule(new DateImportTask(), c.getTime() , DateUtils.MILLIS_PER_DAY * 1);
}
/**
* 在Web应用结束时停止任务
*/
public void contextDestroyed(ServletContextEvent event) {
logger.info("定时器销毁。。。");
timer.cancel(); // 定时器销毁
}
}
3.quartz
Quartz是OpenSymphony开源组织的开源项目,既可以用于java web项目,也可以用于javase项目