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

服務器之家:專注于服務器技術及軟件下載分享
分類導航

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

服務器之家 - 編程語言 - Java教程 - Spring Boot 配置 Quartz 定時任務的方法

Spring Boot 配置 Quartz 定時任務的方法

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

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

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

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

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

    阿杜7482021-02-04
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

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

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

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

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

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

    小米推送Java代碼

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

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

    Java使用SAX解析xml的示例

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

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

    xml與Java對象的轉換詳解

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

    Java教程網2942020-09-17
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

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

    littleschemer13532021-05-16
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

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

    lijiao5352020-04-06
主站蜘蛛池模板: 国内精品久久久久久久久久久久 | 国产欧美一区二区成人影院 | 国产精品怡红院在线观看 | 亚洲日韩欧美一区二区在线 | 王的视频vk | 亚洲另类中文字幕 | 国产乱码在线精品可播放 | 2012中文字幕中字视频 | 天堂成人影院 | 亚洲 欧美 国产 视频二区 | 暖暖 免费 高清 日本 在线 | 日本午夜影院 | 成人在线视频国产 | 华人亚洲欧美精品国产 | 青草福利在线 | 天美蜜桃精东乌鸦传媒 | www射com| 韩国一区二区三区 | 高h扶她文肉 | 视频一区二区三区欧美日韩 | 小柔的性放荡羞辱日记 | 娇妻被又大又粗又长又硬好爽 | yellow高清视频日本动漫 | 欧美人成绝费网站色www吃脚 | 白丝萝莉喷水 | 果冻传媒在线免费观看 | 韩国男女做性全过程视频 | 韩国三级在线 | 狠狠色狠狠色综合日日小蛇 | 99re热精品这里精品 | 关晓彤一级做a爰片性色毛片 | 日韩视频在线免费 | 忘忧草在线社区WWW日本直播 | 国产精品男人的天堂 | 免费在线看片网站 | 日韩欧美在线观看综合网另类 | miaa076深田咏美在线 | 丝瓜草莓香蕉绿巨人幸福宝 | 免费观看国产大片资源视频 | 免费视频观看 | 欧美成人免费一区在线播放 |