spring實現定時任務的方式有三種,分別是java自帶的timer類、spring task和quartz三種。
本文只介紹spring自帶的task和第三方quartz。spirng task可以將它比作一個輕量級的Quartz,使用起來非常簡單,除spring相關的包外不需要額外的包,而且支持注解和配置文件兩種。接著直接演示spring task注解實現方式。
首先,創建任務類,如下:
1
2
3
4
5
6
7
8
9
10
11
|
@Component public class MyScheduler { int i = 0 ; public void run(){ i++; // 任務邏輯 System.out.println( "第" +(i)+ "次開始執行操作... " + "時間:【" + new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss.SSS" ).format( new Date()) + "】" ); } } |
接著,在spring的配置文件中添加命名空間及描述:
1
2
3
4
|
<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-4.1.xsd" > |
最后,spring配置文件來一發:
1
2
3
|
<task:scheduled-tasks> <task:scheduled ref= "myScheduler" method= "run" cron= "0/5 * * * * ?" /> </task:scheduled-tasks> |
大功告成,可以用了,但是感覺很麻煩,也很死板,也就用來寫寫demo,那么就稍微改造一下吧。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
@Service @Lazy ( false ) @EnableScheduling public class MyScheduler extends BaseService implements SchedulingConfigurer{ public static String cron = "0/2 * * * * ?" ; int i = 0 ; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { taskRegistrar.addTriggerTask( new Runnable() { @Override public void run() { i++; // 需要實現的任務邏輯 logger.info( "第" +(i)+ "次開始執行操作... " + "時間:【" + new SimpleDateFormat( "yyyy-MM-dd hh:mm:ss.SSS" ).format( new Date()) + "】" ); } }, new Trigger(){ @Override public Date nextExecutionTime(TriggerContext triggerContext) { //任務觸發,可修改任務的執行周期 CronTrigger trigger = new CronTrigger(cron); Date nextExec = trigger.nextExecutionTime(triggerContext); return nextExec; } }); } } |
實現SchedulingConfigurer接口的configureTasks方法,如果直接啟動項目,就可以實現每秒5次該方法的執行了,一旦cron參數被修改,ScheduledTaskRegistrar偵測到后會重新創建一個觸發器來實現新的cron表達式任務,這就解決了動態調度定時任務的問題了,而之前spring配置文件中關于任務類的內容也可以刪除了。另外,你可以修改spring task的任務池來增加可同時存在的任務數量,如下:
1
2
3
|
<task:executor id= "executor" pool-size= "10" /> <task:scheduler id= "scheduler" pool-size= "10" /> <task:annotation-driven scheduler= "scheduler" executor= "executor" proxy-target- class = "true" /> |
我們在web項目中有時候需要手動關停定時任務,或者需要立即執行定時任務具有的功能,這時的spring task就力不從心了,這也是它輕量級的原因,使用簡單,但提供的功能不夠強大,這時候就輪到Quartz出場了。Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或為運行十個,百個,甚至是好幾萬個Jobs這樣復雜的程序。Jobs可以做成標準的Java組件或 EJBs。
各位有興趣可以去參考jeecg框架的定時任務開發,它對其進行了整合,使用起來及其方便。
接著我們自己來整合Quartz,實現動態定時任務。先理清思路,1.導入jar包;2.配置spring文件;3.編寫任務代碼。
首先導入需要的jar包,我這里使用spring 4.1.9版本及Quartz 2.2.7,對了,spring 3.1.x 以上才支持 Quartz 2.x 的jar包,原因就不細說了,各位自行百度。
總結
以上所述是小編給大家介紹的Spring實現動態修改時間參數并手動開啟關停操作,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對服務器之家網站的支持!
原文鏈接:http://www.cnblogs.com/huyufan/archive/2017/09/14/Spring_Quartz.html