Quartz有四個(gè)核心概念:
Job:是一個(gè)接口,只定義一個(gè)方法 execute(JobExecutionContext context),在實(shí)現(xiàn)接口的 execute 方法中編寫所需要定時(shí)執(zhí)行的 Job(任務(wù))
Double slongitude = Double.valueOf(jobExecutionContext.getJobDetail().getJobDataMap().get("slongitude").toString());
JobDetail:Quartz 每次調(diào)度 Job 時(shí),都重新創(chuàng)建一個(gè) Job 實(shí)例,因此它不接受一個(gè) Job 的實(shí)例,相反它接收一個(gè) Job 實(shí)現(xiàn)類(JobDetail,描述 Job 的實(shí)現(xiàn)類及其他相關(guān)的靜態(tài)信息,如 Job 名字、描述、關(guān)聯(lián)監(jiān)聽器等信息),以便運(yùn)行時(shí)通過 newInstance() 的反射機(jī)制實(shí)例化 Job。
rigger:是一個(gè)類,描述觸發(fā) Job 執(zhí)行的時(shí)間觸發(fā)規(guī)則,主要有 SimpleTrigger 和 CronTrigger 這兩個(gè)子類。當(dāng)且僅當(dāng)需調(diào)度一次或者以固定時(shí)間間隔周期執(zhí)行調(diào)度,SimpleTrigger 是最適合的選擇;而 CronTrigger 則可以通過 Cron 表達(dá)式定義出各種復(fù)雜時(shí)間規(guī)則的調(diào)度方案:如工作日周一到周五的 15:00 ~ 16:00 執(zhí)行調(diào)度等。
Scheduler:調(diào)度器就相當(dāng)于一個(gè)容器,裝載著任務(wù)和觸發(fā)器,該類是一個(gè)接口,代表一個(gè) Quartz 的獨(dú)立運(yùn)行容器,Trigger 和 JobDetail 可以注冊到 Scheduler 中,兩者在 Scheduler 中擁有各自的組及名稱,組及名稱是 Scheduler 查找定位容器中某一對象的依據(jù),Trigger 的組及名稱必須唯一,JobDetail 的組和名稱也必須唯一(但可以和 Trigger 的組和名稱相同,因?yàn)樗鼈兪遣煌愋偷模cheduler 定義了多個(gè)接口方法,允許外部通過組及名稱訪問和控制容器中 Trigger 和 JobDetail。
1.導(dǎo)入pom依賴
1
2
3
4
|
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> |
2.開啟定時(shí)任務(wù)
@EnableScheduling注解
1
2
3
4
5
6
7
8
9
10
|
//java fhadmin.cn @EnableScheduling @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication. class , args); } } |
3.新建一個(gè)job
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
@Slf4j public class MyJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { try { executeTask(jobExecutionContext); } catch (Exception e) { e.printStackTrace(); } } //java fhadmin.cn private static void executeTask(JobExecutionContext jobExecutionContext) throws SchedulerException { //JobExecutionContext 類提供了調(diào)度應(yīng)用的一些信息; //Job 運(yùn)行時(shí)的信息保存在 JobDataMap 實(shí)例中。 JobKey key = jobExecutionContext.getJobDetail().getKey(); System.out.println( new Date()+ "->" +key.toString()+ "定時(shí)任務(wù)正在執(zhí)行" ); } } |
4.構(gòu)建JobDetailrigger
把Trigger 和 JobDetail 可以注冊到 Scheduler 中
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
//fhrom fhadmin.cn @Configuration public class QuartzManager { // public static final String JOB1="job1"; // public static final String GROUP1="group1"; /**默認(rèn)每個(gè)星期凌晨一點(diǎn)執(zhí)行*/ //public static final String DEFAULT_CRON="0 0 1 ? * L"; /**默認(rèn)5秒執(zhí)行一次*/ // public static final String DEFAULT_CRON="*/5 * * * * ?"; /** * 任務(wù)調(diào)度 */ private Scheduler scheduler; @Bean public Scheduler scheduler() throws SchedulerException { SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory(); this .scheduler = schedulerFactoryBean.getScheduler(); return schedulerFactoryBean.getScheduler(); } /** * 開始執(zhí)行定時(shí)任務(wù) */ public void startJob(String name,String group,String time) throws SchedulerException { startJobTask(scheduler,name,group,time); scheduler.start(); } /** * 啟動定時(shí)任務(wù) * @param scheduler */ private void startJobTask(Scheduler scheduler,String name ,String group,String time) throws SchedulerException { //對于身份 JobDetail jobDetail= JobBuilder.newJob(MyJob. class ).withIdentity(name,group).build(); System.out.println( "jobDetail:-------------" +jobDetail); String DEFAULT_CRON= "*/" +time+ " * * * * ?" ; // SimpleScheduleBuilder CronScheduleBuilder 用于構(gòu)建Scheduler,定義任務(wù)調(diào)度的時(shí)間規(guī)則 CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(DEFAULT_CRON); //觸發(fā)器 CronTrigger cronTrigger=TriggerBuilder.newTrigger().withIdentity(name,group) .withSchedule(cronScheduleBuilder).build(); scheduler.scheduleJob(jobDetail,cronTrigger); } /** * 獲取Job信息 * @param name * @param group */ public String getjobInfo(String name,String group) throws SchedulerException { TriggerKey triggerKey= new TriggerKey(name,group); System.out.println( "triggerKey:" +triggerKey); CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey); return String.format( "time:%s,state:%s" ,cronTrigger.getCronExpression(), scheduler.getTriggerState(triggerKey).name()); } /** * 修改任務(wù)的執(zhí)行時(shí)間 * @param name * @param group * @param cron cron表達(dá)式 * @return * @throws SchedulerException */ public boolean modifyJob(String name,String group,String cron) throws SchedulerException{ Date date= null ; TriggerKey triggerKey= new TriggerKey(name, group); CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey); String oldTime=cronTrigger.getCronExpression(); if (!oldTime.equalsIgnoreCase(cron)){ CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(cron); CronTrigger trigger=TriggerBuilder.newTrigger().withIdentity(name,group) .withSchedule(cronScheduleBuilder).build(); date=scheduler.rescheduleJob(triggerKey,trigger); } return date != null ; } /** * 暫停所有任務(wù) * @throws SchedulerException */ public void pauseAllJob() throws SchedulerException{ scheduler.pauseAll(); } /** * 暫停某個(gè)任務(wù) * @param name * @param group * @throws SchedulerException */ public void pauseJob(String name,String group) throws SchedulerException{ JobKey jobKey= new JobKey(name,group); JobDetail jobDetail=scheduler.getJobDetail(jobKey); if (jobDetail== null ) { return ; } scheduler.pauseJob(jobKey); } /** * 恢復(fù)所有任務(wù) * @throws SchedulerException */ public void resumeAllJob() throws SchedulerException{ scheduler.resumeAll(); } /** * 恢復(fù)某個(gè)任務(wù) */ public void resumeJob(String name,String group) throws SchedulerException { JobKey jobKey= new JobKey(name,group); JobDetail jobDetail=scheduler.getJobDetail(jobKey); if (jobDetail== null ) { return ; } scheduler.resumeJob(jobKey); } /** * 刪除某個(gè)任務(wù) * @param name * @param group * @throws SchedulerException */ public void deleteJob(String name,String group) throws SchedulerException{ JobKey jobKey= new JobKey(name, group); JobDetail jobDetail=scheduler.getJobDetail(jobKey); if (jobDetail== null ) { return ; } scheduler.deleteJob(jobKey); } } |
5.編寫Controller
通過調(diào)用接口 可以開始定時(shí)任務(wù) 結(jié)束定時(shí)任務(wù) 獲取任務(wù)信息
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
//fhadmin.cn @RestController @RequestMapping ( "/quartz" ) public class ModifyCronController { @Autowired private QuartzManager quartzManager; @GetMapping ( "/modify" ) public String modify( @RequestParam ( "job" )String job, //job的名稱 @RequestParam ( "group" )String group, //job的組 @RequestParam ( "time" )String time //執(zhí)行定時(shí)任務(wù)的步長 ) throws SchedulerException { // quartzManager.pauseJob(QuartzManager.JOB1,QuartzManager.GROUP1); quartzManager.startJob(job,group,time); String s = quartzManager.getjobInfo(job, group); System.out.println( "job:" +s); return "ok" ; } } |
到此這篇關(guān)于Spring Boot 配置 Quartz 定時(shí)任務(wù)的文章就介紹到這了,更多相關(guān)Spring Boot Quartz 定時(shí)任務(wù)內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!
原文鏈接:https://www.cnblogs.com/teacher11/archive/2021/09/07/15237822.html