Quartz有四個核心概念:
Job:是一個接口,只定義一個方法 execute(JobExecutionContext context),在實現接口的 execute 方法中編寫所需要定時執行的 Job(任務)
Double slongitude = Double.valueOf(jobExecutionContext.getJobDetail().getJobDataMap().get("slongitude").toString());
JobDetail:Quartz 每次調度 Job 時,都重新創建一個 Job 實例,因此它不接受一個 Job 的實例,相反它接收一個 Job 實現類(JobDetail,描述 Job 的實現類及其他相關的靜態信息,如 Job 名字、描述、關聯監聽器等信息),以便運行時通過 newInstance() 的反射機制實例化 Job。
rigger:是一個類,描述觸發 Job 執行的時間觸發規則,主要有 SimpleTrigger 和 CronTrigger 這兩個子類。當且僅當需調度一次或者以固定時間間隔周期執行調度,SimpleTrigger 是最適合的選擇;而 CronTrigger 則可以通過 Cron 表達式定義出各種復雜時間規則的調度方案:如工作日周一到周五的 15:00 ~ 16:00 執行調度等。
Scheduler:調度器就相當于一個容器,裝載著任務和觸發器,該類是一個接口,代表一個 Quartz 的獨立運行容器,Trigger 和 JobDetail 可以注冊到 Scheduler 中,兩者在 Scheduler 中擁有各自的組及名稱,組及名稱是 Scheduler 查找定位容器中某一對象的依據,Trigger 的組及名稱必須唯一,JobDetail 的組和名稱也必須唯一(但可以和 Trigger 的組和名稱相同,因為它們是不同類型的)。Scheduler 定義了多個接口方法,允許外部通過組及名稱訪問和控制容器中 Trigger 和 JobDetail。
1.導入pom依賴
1
2
3
4
|
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency> |
2.開啟定時任務
@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.新建一個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 類提供了調度應用的一些信息; //Job 運行時的信息保存在 JobDataMap 實例中。 JobKey key = jobExecutionContext.getJobDetail().getKey(); System.out.println( new Date()+ "->" +key.toString()+ "定時任務正在執行" ); } } |
4.構建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"; /**默認每個星期凌晨一點執行*/ //public static final String DEFAULT_CRON="0 0 1 ? * L"; /**默認5秒執行一次*/ // public static final String DEFAULT_CRON="*/5 * * * * ?"; /** * 任務調度 */ private Scheduler scheduler; @Bean public Scheduler scheduler() throws SchedulerException { SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory(); this .scheduler = schedulerFactoryBean.getScheduler(); return schedulerFactoryBean.getScheduler(); } /** * 開始執行定時任務 */ public void startJob(String name,String group,String time) throws SchedulerException { startJobTask(scheduler,name,group,time); scheduler.start(); } /** * 啟動定時任務 * @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 用于構建Scheduler,定義任務調度的時間規則 CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(DEFAULT_CRON); //觸發器 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()); } /** * 修改任務的執行時間 * @param name * @param group * @param cron cron表達式 * @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 ; } /** * 暫停所有任務 * @throws SchedulerException */ public void pauseAllJob() throws SchedulerException{ scheduler.pauseAll(); } /** * 暫停某個任務 * @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); } /** * 恢復所有任務 * @throws SchedulerException */ public void resumeAllJob() throws SchedulerException{ scheduler.resumeAll(); } /** * 恢復某個任務 */ 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); } /** * 刪除某個任務 * @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
通過調用接口 可以開始定時任務 結束定時任務 獲取任務信息
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 //執行定時任務的步長 ) 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" ; } } |
到此這篇關于Spring Boot 配置 Quartz 定時任務的文章就介紹到這了,更多相關Spring Boot Quartz 定時任務內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://www.cnblogs.com/teacher11/archive/2021/09/07/15237822.html