最近需要寫個小程式,實作定時将記事本中的資料導入到資料庫,這個小程式大緻可以分為三個子產品,讀取檔案内容,解析檔案内容(封裝成對象集合),插入資料庫(自己寫的一個工具類,傳入資料對象集合、表名即可)。
對定時任務這塊,因為隻是個小程式,不想引用第三方的定時任務 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項目