一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務(wù)器之家 - 編程語言 - Java教程 - Spring Boot 配置 Quartz 定時(shí)任務(wù)的方法

Spring Boot 配置 Quartz 定時(shí)任務(wù)的方法

2021-12-22 13:16m17193095294 Java教程

這篇文章主要介紹了Spring Boot 配置 Quartz 定時(shí)任務(wù)的方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

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

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個(gè)注意事項(xiàng)

    Java8中Stream使用的一個(gè)注意事項(xiàng)

    最近在工作中發(fā)現(xiàn)了對于集合操作轉(zhuǎn)換的神器,java8新特性 stream,但在使用中遇到了一個(gè)非常重要的注意點(diǎn),所以這篇文章主要給大家介紹了關(guān)于Java8中S...

    阿杜7482021-02-04
  • Java教程Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進(jìn)去或缺失數(shù)據(jù)的解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望...

    spcoder14552021-10-18
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經(jīng)有好久沒有升過級了。升級完畢重啟之后,突然發(fā)現(xiàn)好多錯(cuò)誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關(guān)于小米推送Java代碼,小編覺得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來看看吧...

    富貴穩(wěn)中求8032021-07-12
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

    xml與Java對象的轉(zhuǎn)換詳解

    這篇文章主要介紹了xml與Java對象的轉(zhuǎn)換詳解的相關(guān)資料,需要的朋友可以參考下...

    Java教程網(wǎng)2942020-09-17
  • Java教程Java實(shí)現(xiàn)搶紅包功能

    Java實(shí)現(xiàn)搶紅包功能

    這篇文章主要為大家詳細(xì)介紹了Java實(shí)現(xiàn)搶紅包功能,采用多線程模擬多人同時(shí)搶紅包,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

    20個(gè)非常實(shí)用的Java程序代碼片段

    這篇文章主要為大家分享了20個(gè)非常實(shí)用的Java程序片段,對java開發(fā)項(xiàng)目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
主站蜘蛛池模板: 国产视频久久久 | 日本免费观看的视频在线 | 韩国黄色网址 | 国产女同精品 | 精品一久久香蕉国产线看播放 | 男同gay作爰视频网站 | 无码精品一区二区三区免费视频 | 二次元美女挤奶漫画 | 床戏小说| 男人天堂网站在线 | 国产乱码免费卡1卡二卡3卡四 | 北岛玲在线播放 | 女同学高中你下面好紧 | 久久WWW免费人成一看片 | 西西人体大胆啪啪私拍色约约 | 精品国产免费第一区二区三区日韩 | 久久强奷乱码老熟女 | 日韩精品一区二区 | 99热国产在线观看 | 日韩免费视频播播 | 精品国产爱久久 | 国产精品极品 | 香蕉91| 亚洲爱视频| 99精品国产自产在线观看 | 欧美在线国产 | 青青青国产精品国产精品久久久久 | 777奇米影视一区二区三区 | 成人无高清96免费 | 欧美日韩一区二区三区在线观看 | 精品国产自在在线在线观看 | 午夜秀场在线观看 | 火影忍者小南裸羞羞漫画 | 男人的天堂久久 | 我在厨房摸岳的乳HD在线观看 | 护士xxxx| 精品久久久久久国产91 | 亚洲社区在线 | 成人高清视频在线观看 | 精品九九视频 | 暗卫调教女主肉高h |