最近需要写个小程序,实现定时将记事本中的数据导入到数据库,这个小程序大致可以分为三个模块,读取文件内容,解析文件内容(封装成对象集合),插入数据库(自己写的一个工具类,传入数据对象集合、表名即可)。
对定时任务这块,因为只是个小程序,不想引用第三方的定时任务 quartz, 找了下其他的实现,总结了下。 java中实现定时任务至少有三种方式。
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项目