近期項目開發中需要動態的添加定時任務,比如在某個活動結束時,自動生成獲獎名單,導出excel等,此類任務由於活動時間是動態的,不能把定時任務配置在配置文件或寫死在代碼中。當然也可以增加一個定時掃描的任務來實現。藉此機會整理了AVA實現定時任務的幾種常用方式,以下做簡要介紹。
目前主要有以下幾種實現方式:
- JDK自帶 :JDK自帶的Timer以及JDK1.5+ 新增的ScheduledExecutorService;
- Quartz :簡單卻強大的JAVA作業調度框架
- Spring3.0以後自帶的task :可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多;
下面將一一介紹以上三種實現方式。
- Timer類
這個類允許你調度一個java.util.TimerTask任務。主要有以下幾個方法:
1. schedule(TimerTask task, long delay) 延遲 delay 毫秒 執行
public static void main(String[] args) {
for (int i = 0; i < 10; ++i) {
new Timer("timer - " + i).schedule(new TimerTask() {
@Override
public void run() {
println(Thread.currentThread().getName() + " run ");
}
}, 1000);
}
}
out :
timer - 2 run
timer - 1 run
timer - 0 run
timer - 3 run
timer - 9 run
timer - 4 run
timer - 8 run
timer - 5 run
timer - 6 run
timer - 7 run
2. schedule(TimerTask task, Date time) 特定時間執行
public static void main(String[] args) {
for (int i = 0; i < 10; ++i) {
new Timer("timer - " + i).schedule(new TimerTask() {
@Override
public void run() {
println(Thread.currentThread().getName() + " run ");
}
}, new Date(System.currentTimeMillis() + 2000));
}
}
out:
timer - 0 run
timer - 7 run
timer - 6 run
timer - 8 run
timer - 3 run
timer - 5 run
timer - 2 run
timer - 1 run
timer - 4 run
timer - 9 run
3. schedule(TimerTask task, long delay, long period) 延遲 delay 執行並每隔period 執行一次
public static void main(String[] args) {
for (int i = 0; i < 10; ++i) {
new Timer("timer - " + i).schedule(new TimerTask() {
@Override
public void run() {
println(Thread.currentThread().getName() + " run ");
}
}, 2000 , 3000);
}
}
out:
timer - 0 run
timer - 5 run
timer - 4 run
timer - 8 run
timer - 3 run
timer - 2 run
timer - 1 run
timer - 7 run
timer - 9 run
timer - 6 run
timer - 3 run
timer - 7 run
timer - 5 run
timer - 4 run
timer - 8 run
Quartz 定時器實現
Quartz是一個完全由Java編寫的開源作業調度框架,爲在Java應用程序中進行作業調度提供了簡單卻強大的機制。Quartz允許開發人員根據時間間隔來調度作業。它實現了作業和觸發器的多對多的關係,還能把多個作業與不同的觸發器關聯。可以動態的添加刪除定時任務,另外很好的支撐集羣調度
。簡單地創建一個org.quarz.Job接口的Java類,Job接口包含唯一的方法:
- Spring 3.0+ 自帶的任務調度實現,主要依靠
TaskScheduler
接口的幾個實現類實現。刪除和修改任務比較麻煩。
主要用法有以下三種:- Spring配置文件實現
- 註解實現
- 代碼動態添加
配置文件實現
spring-schedule.xml
<task:scheduler id="myScheduler" pool-size="10" />
<task:scheduled-tasks scheduler="myScheduler">
<task:scheduled ref="job" method="test" cron="0 * * * * ?"/>
</task:scheduled-tasks>