使用@enablescheduling方式
1
2
3
4
5
6
7
8
9
10
|
@component @configurable @enablescheduling public class task1 { private static log logger = logfactory.getlog(task1. class ); @scheduled (cron = "0/2 * * * * * " ) public void execute() { logger.info( "task1>>" + new date()); } } |
xml配置方式
application 啟動加入讀取 xml 文件
1
2
3
4
5
6
7
8
|
@springbootapplication @importresource (value = { "classpath:applicationcontext*.xml" }) public class springboot2taskapplication { public static void main(string[] args) { springapplication.run(springboot2taskapplication. class , args); } } |
1
2
3
4
5
6
|
<context:component-scan base- package = "com.chenyingjun.task.schedual" ></context:component-scan> <task:scheduler id= "appscheduler" pool-size= "2" /> <!-- 調(diào)整定時任務(wù) --> <task:scheduled-tasks> <task:scheduled ref= "task2" method= "method2" cron= "0/10 * * * * ?" /> </task:scheduled-tasks> |
1
2
3
4
5
6
7
|
@service public class task2 { private static log logger = logfactory.getlog(task2. class ); public void method2() { logger.info( "task2----method2>>>>" + new date()); } } |
bean創(chuàng)建工廠方式
使用到的 jar 包
1
2
3
4
5
6
7
8
9
10
11
12
13
|
<dependency> <groupid>org.springframework</groupid> <artifactid>spring-context-support</artifactid> </dependency> <dependency> <groupid>org.springframework</groupid> <artifactid>spring-tx</artifactid> </dependency> <dependency> <groupid>org.quartz-scheduler</groupid> <artifactid>quartz</artifactid> <version> 2.3 . 0 </version> </dependency> |
新建 schedledconfiguration.java
文件
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
|
@configuration public class schedledconfiguration { /** * attention: * details:配置定時任務(wù) */ @bean (name = "jobdetail" ) public methodinvokingjobdetailfactorybean detailfactorybean(task3 task) { // testtask為需要執(zhí)行的任務(wù) methodinvokingjobdetailfactorybean jobdetail = new methodinvokingjobdetailfactorybean(); /* * 是否并發(fā)執(zhí)行 * 例如每5s執(zhí)行一次任務(wù),但是當前任務(wù)還沒有執(zhí)行完,就已經(jīng)過了5s了, * 如果此處為true,則下一個任務(wù)會執(zhí)行,如果此處為false,則下一個任務(wù)會等待上一個任務(wù)執(zhí)行完后,再開始執(zhí)行 */ jobdetail.setconcurrent(false); // 設(shè)置任務(wù)的名字 jobdetail.setname("jobdetailname"); // 設(shè)置任務(wù)的分組,這些屬性都可以存儲在數(shù)據(jù)庫中,在多任務(wù)的時候使用 jobdetail.setgroup("jobdetailgroup"); /* * 為需要執(zhí)行的實體類對應(yīng)的對象 */ jobdetail.settargetobject(task); /* * 通過這幾個配置,告訴jobdetailfactorybean我們需要執(zhí)行定時執(zhí)行scheduletask類中的task方法 */ jobdetail.settargetmethod("task"); return jobdetail; } /** * details:配置定時任務(wù)的觸發(fā)器,也就是什么時候觸發(fā)執(zhí)行定時任務(wù) */ @bean(name = "jobtrigger") public crontriggerfactorybean cronjobtrigger(jobdetail jobdetail) { crontriggerfactorybean tigger = new crontriggerfactorybean(); tigger.setjobdetail(jobdetail); // 初始時的cron表達式,可以改成從數(shù)據(jù)庫中獲取 tigger.setcronexpression("0/2 * * * * ?"); // trigger的name tigger.setname("tiggername"); return tigger; } /** * details:定義quartz調(diào)度工廠 */ @bean (name = "scheduler" ) public schedulerfactorybean schedulerfactory(trigger trigger) { schedulerfactorybean bean = new schedulerfactorybean(); // 用于quartz集群,quartzscheduler 啟動時更新己存在的job bean.setoverwriteexistingjobs( true ); // 延時啟動,應(yīng)用啟動1秒后 bean.setstartupdelay( 1 ); // 注冊觸發(fā)器 bean.settriggers(trigger); return bean; } } |
新建task任務(wù)
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
29
30
31
32
33
34
|
@service public class task3 { @resource (name = "jobtrigger" ) private crontrigger crontrigger; @resource (name = "scheduler" ) private scheduler scheduler; private static log logger = logfactory.getlog(task3. class ); public void task() { logger.info( "task3---------" + new date()); } /** * 設(shè)置cron并重啟定時器 * @param cron cron值 */ public void setcron(string cron) { try { // 表達式調(diào)度構(gòu)建器 cronschedulebuilder schedulebuilder = cronschedulebuilder.cronschedule(cron); // 按新的cronexpression表達式重新構(gòu)建trigger crontrigger trigger = (crontrigger) scheduler.gettrigger(crontrigger.getkey()); trigger = trigger.gettriggerbuilder().withidentity(crontrigger.getkey()) .withschedule(schedulebuilder).build(); // 按新的trigger重新設(shè)置job執(zhí)行 scheduler.reschedulejob(crontrigger.getkey(), trigger); } catch (schedulerexception e) { logger.info( "cron表達式錯誤" ); } } } |
其中 setcron
方法可以進行重新設(shè)定任務(wù)調(diào)度時間
threadpooltaskscheduler runnable方式
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
29
30
31
32
33
|
public class task4 implements runnable { private threadpooltaskscheduler threadpooltaskscheduler; private static log logger = logfactory.getlog(task4. class ); @override public void run() { logger.info( "task4================" + new date()); } /** * 設(shè)置cron并啟動 * @param cronexp cron值 */ public void restart(string cronexp) { if ( null != this .threadpooltaskscheduler) { scheduledexecutorservice scheduledexecutorservice = this .threadpooltaskscheduler.getscheduledexecutor(); if (!scheduledexecutorservice.isshutdown()) { scheduledexecutorservice.shutdownnow(); } this .threadpooltaskscheduler.destroy(); } if ( null != cronexp && cronexp.trim().length() > 0 ) { this .threadpooltaskscheduler = new threadpooltaskscheduler(); this .threadpooltaskscheduler.setthreadnameprefix( "task4" ); this .threadpooltaskscheduler.initialize(); this .threadpooltaskscheduler.schedule( this , new crontrigger(cronexp)); } } } |
其中restart可以進行任務(wù)啟動和重新設(shè)置任務(wù)調(diào)度時間,調(diào)用方式如下所示
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
|
/** * 初始化task4 * 這里的代碼不應(yīng)該寫在rest層上, 應(yīng)該寫在service層上 */ @postconstruct private void inittask4() { //初始化task4任務(wù)調(diào)度器cron,可以從數(shù)據(jù)庫中查詢到cron值 settask4cron( "0/3 * * * * ?" ); } /** * 改變task4的cron * @param cron cron值 * @return 成功標志 */ @requestmapping (value = { "/settask4cron" }, method = requestmethod.get) @responsebody public string settask4cron(string cron) { if ( null == task4) { task4 = new task4(); } task4.restart(cron); return "success" ; } |
inittask4 方法加了 @postconstruct '注解,可以在項目啟動時自動根據(jù)cron來啟動任務(wù), settask4cron 方法可以重新調(diào)置任務(wù)時間
四個任務(wù)的效果如下:
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持服務(wù)器之家。
原文鏈接:http://www.cnblogs.com/cnJun/p/10546745.html