在開發測試工具的應用后臺,經常聽到同事說要做個定時任務把做日志處理,或者數據清理,包括做些復雜的業務計算邏輯,在選擇定時任務的時候,怎么能夠快速實現,并且選擇一種更適合自己的方式呢? 我這里把定時任務的實現收集整理了一些方法,希望可以幫到剛開始做定時任務的同學,寫得不對的地方請指正。
一 Java 基本的定時任務,總結方法有三種:
1.1 創建一個thread,然后讓它在while循環里一直運行著,通過sleep方法來達到定時任務的效果;
1.2 用Timer和TimerTask與第一種方法相比有如下好處:
- 當啟動和去取消任務時可以控制
- 第一次執行任務時可以指定你想要的delay時間
1.3 用ScheduledExecutorService是從的java.util.concurrent里,做為并發工具類被引進的,這是最理想的定時任務實現方式,相比于上兩個方法,它有以下好處:
- 相比于Timer的單線程,它是通過線程池的方式來執行任務的
- 可以很靈活的去設定第一次執行任務delay時間
- 提供了良好的約定,以便設定執行的時間間隔
二 Spring 定時任務,總結方式也有三種:
2.1 ScheduledTimerTask: Spring的ScheduledTimerTask定義了一個定時器任務的運行周期,遺憾的是,你可以指定任務執行的頻度,但你無法精確指定它何時運行,這就需要用到第二種Quartz進行任務調度;
創建一個業務任務,在Spring配置文件中聲明 ;
在Spring 配置文件中,配置ScheduledTimerTask ,并且關聯上自定義的任務實例;
啟動定時器,Spring的TimerFactoryBean負責啟動定時任務
2.2 使用 Quartz:
首先還是老樣子定義業務邏輯任務:
在Spring中聲明并且配置作業調度的觸發方式
這里 Quartz的作業觸發器有兩種,分別是
org.springframework.scheduling.quartz.SimpleTriggerBean
org.springframework.scheduling.quartz.CronTriggerBean
第一種SimpleTriggerBean,只支持按照一定頻度調用任務,如每隔一段時間運行一次。
1
2
3
4
5
|
<bean id= "simpleTrigger" class = "org.springframework.scheduling.quartz.SimpleTriggerBean" > <property name= "jobDetail" ref= "myJob" /> <property name= "startDelay" value= "0" /><!-- 調度工廠實例化后,經過 0 秒開始執行調度 --> <property name= "repeatInterval" value= "2000" /><!-- 每 2 秒調度一次 --> </bean> |
第二種CronTriggerBean,支持到指定時間運行一次,如每天12:00運行一次,如上配置;
配置調度工廠
org.springframework.scheduling.quartz.SchedulerFactoryBean,代碼如上;
啟動你的應用即可
2.3 使用 Spring-Task
Spring自帶的定時任務工具,spring task,可以將它比作一個輕量級的Quartz,而且使用起來很簡單,除spring相關的包外不需要額外的包,而且支持注解和配置文件兩種:
第一步:編寫任務類;TaskJob,method job1 --代碼省略
第二步:在spring配置文件頭中添加命名空間及描述
1
2
3
|
<beans xmlns= "http://www.springframework.org/schema/beans" xmlns:task= "http://www.springframework.org/schema/task" xsi:schemaLocation= "http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd" > |
第三步:spring配置文件中設置具體的任務
1
2
3
4
|
<task:scheduled-tasks> <task:scheduled ref= "taskJob" method= "job1" cron= "0 * * * * ?" /> </task:scheduled-tasks> <context:component-scan base- package = "com.alibaba.mytask" /> |
說明:ref參數指定的即任務類,method指定的即需要運行的方法,cron及cronExpression表達式,具體寫法這里不介紹了,<context:component-scan base-package="com.alibaba.mytask" />spring掃描注解用的。
以上就是本文的全部內容,希望對大家的學習有所幫助。