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

服務(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教程 - SpringBoot實(shí)現(xiàn)quartz定時(shí)任務(wù)可視化管理功能

SpringBoot實(shí)現(xiàn)quartz定時(shí)任務(wù)可視化管理功能

2021-12-09 12:51code2roc Java教程

這篇文章主要介紹了SpringBoot實(shí)現(xiàn)quartz定時(shí)任務(wù)可視化管理功能,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下

前言

在實(shí)際框架或產(chǎn)品開發(fā)過程中,springboot中集成quarzt方式基本是以job和trigger的bean對象方式直接硬編碼完成的,例如以下代碼示例。對于系統(tǒng)內(nèi)定義的所有定時(shí)任務(wù)類型,具體執(zhí)行類,執(zhí)行策略,運(yùn)行狀態(tài)都沒有一個(gè)動(dòng)態(tài)全局的管理,所有決定將quartz做成可視化配置管理,便于統(tǒng)一管理,也降低了使用門檻,只需要關(guān)心job類的實(shí)現(xiàn)即可

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
@Bean
   public JobDetail SMSJobDetail() {
       return JobBuilder.newJob(SMSJob.class).withIdentity("SMSJob").storeDurably().build();
   }
 
   // 把jobDetail注冊到trigger上去
   @Bean
   public Trigger myJobTrigger() {
       SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
               .withIntervalInSeconds(1).repeatForever();
 
       return TriggerBuilder.newTrigger()
               .forJob(SMSJobDetail())
               .withIdentity("myJobTrigger")
               .withSchedule(scheduleBuilder)
               .build();
   }

表結(jié)構(gòu)

用于存儲quartz配置

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
DROP TABLE IF EXISTS `f_quartztask`;
CREATE TABLE `f_quartztask` (
  `TaskID` varchar(50) NOT NULL,
  `TaskName` varchar(200) DEFAULT NULL,
  `TaskType` int(11) DEFAULT NULL,
  `TaskTag` varchar(100) DEFAULT NULL,
  `JobClassPath` varchar(200) DEFAULT NULL,
  `ExecutePeroid` int(11) DEFAULT NULL,
  `ExecuteUnit` int(11) DEFAULT NULL,
  `CornExpress` varchar(200) DEFAULT NULL,
  `Enviroment` varchar(50) DEFAULT NULL,
  `TaskStatus` int(11) DEFAULT NULL,
  `SortNum` int(11) DEFAULT NULL,
  `Remark` varchar(500) DEFAULT NULL,
  PRIMARY KEY (`TaskID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

枚舉類

?
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
143
144
145
146
147
148
149
150
public class QuartzEnum {
    public enum TaskType implements IConvertEnumToCodeItem {
        Cycle(10, "循環(huán)任務(wù)"), Corn(20, "Corn表達(dá)式任務(wù)");
        private int _value;
        private String _name;
 
        private TaskType(int value, String name) {
            set_value(value);
            set_name((name));
        }
 
        public int get_value() {
            return _value;
        }
 
        public void set_value(int _value) {
            this._value = _value;
        }
 
        public String get_name() {
            return _name;
        }
 
        public void set_name(String _name) {
            this._name = _name;
        }
 
        @Override
        public String toString() {
            return _name;
        }
 
        @Override
        public String getCodeName() {
            return "Quartz任務(wù)類別";
        }
    }
 
    public enum ExecuteUnit implements IConvertEnumToCodeItem {
        Second(10, "秒"), Minute(20, "分"), Hour(30, "時(shí)");
        private int _value;
        private String _name;
 
        private ExecuteUnit(int value, String name) {
            set_value(value);
            set_name((name));
        }
 
        public int get_value() {
            return _value;
        }
 
        public void set_value(int _value) {
            this._value = _value;
        }
 
        public String get_name() {
            return _name;
        }
 
        public void set_name(String _name) {
            this._name = _name;
        }
 
        @Override
        public String toString() {
            return _name;
        }
 
        @Override
        public String getCodeName() {
            return "Quartz間隔單位";
        }
    }
 
 
    public enum TaskStatus implements IConvertEnumToCodeItem {
        Open(10, "開啟"), Close(20, "關(guān)閉");
        private int _value;
        private String _name;
 
        private TaskStatus(int value, String name) {
            set_value(value);
            set_name((name));
        }
 
        public int get_value() {
            return _value;
        }
 
        public void set_value(int _value) {
            this._value = _value;
        }
 
        public String get_name() {
            return _name;
        }
 
        public void set_name(String _name) {
            this._name = _name;
        }
 
        @Override
        public String toString() {
            return _name;
        }
 
        @Override
        public String getCodeName() {
            return "Quartz任務(wù)狀態(tài)";
        }
    }
 
    public enum TaskEnviroment implements IConvertEnumToCodeItem {
        All("全部", "全部"), Dev("dev", "開發(fā)環(huán)境"), Pro("pro", "正式環(huán)境");
        private String _value;
        private String _name;
 
        private TaskEnviroment(String value, String name) {
            set_value(value);
            set_name((name));
        }
 
        public String get_value() {
            return _value;
        }
 
        public void set_value(String _value) {
            this._value = _value;
        }
 
        public String get_name() {
            return _name;
        }
 
        public void set_name(String _name) {
            this._name = _name;
        }
 
        @Override
        public String toString() {
            return _name;
        }
 
        @Override
        public String getCodeName() {
            return "Quartz任務(wù)執(zhí)行環(huán)境";
        }
    }
}

QuartzFactory

支持Job類注bean入對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@Component
public class QuartzFactory extends AdaptableJobFactory {
    @Autowired
    private AutowireCapableBeanFactory capableBeanFactory;
 
    @Override
    protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
        // 調(diào)用父類的方法
        Object jobInstance = super.createJobInstance(bundle);
        // 進(jìn)行注入
        capableBeanFactory.autowireBean(jobInstance);
        return jobInstance;
 
    }
}

QuartzConfig

注入QuartzFactory對象

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@Configuration
public class QuartzConfig {
    @Autowired
    private QuartzFactory quartzFactory;
 
    @Bean
    public SchedulerFactoryBean schedulerFactoryBean(){
        SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean();
        schedulerFactoryBean.setJobFactory(quartzFactory);
        //將job實(shí)例化,能夠操作進(jìn)行Spring 注入
        return schedulerFactoryBean;
    }
}

QuartzUtil

定時(shí)任務(wù)動(dòng)態(tài)添加/刪除操作類,initQuartzTask方法在系統(tǒng)啟動(dòng)時(shí)執(zhí)行,根據(jù)配置自動(dòng)開啟相關(guān)符合條件的任務(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
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
@Component
public class QuartzUtil {
    @Autowired
    private SchedulerFactoryBean schedulerFactoryBean;
    @Autowired
    private F_QuartzTaskService quartzTaskService;
    @Value("${spring.profiles.active}")
    private String active;
    private static String JOB_GROUP_NAME = "DEFAULT_JOB_GROUP_NAME";
    private static String TRIGGER_GROUP_NAME = "DEFAULT_TRIGGER_GROUP_NAME";
 
 
    public void initQuartzTask() {
        List<F_QuartzTaskDO> openTaskList = quartzTaskService.selectAllList();
        if(openTaskList.size()>0){
            openTaskList = openTaskList.stream().filter(a -> a.getTaskStatus() == QuartzEnum.TaskStatus.Open.get_value() &&
                    (a.getEnviroment().equals(QuartzEnum.TaskEnviroment.All.get_name()) || a.getEnviroment().equals(active))).collect(Collectors.toList());
        }
        for (F_QuartzTaskDO taskDO : openTaskList) {
            try {
                Class<Job> jobClass = (Class<Job>) Class.forName(taskDO.getJobClassPath());
                if (taskDO.getTaskType() == QuartzEnum.TaskType.Cycle.get_value()) {
                    addIntervalJob(taskDO.getTaskTag(), jobClass, taskDO.getExecutePeroid(), taskDO.getExecuteUnit());
                } else {
                    addCornJob(taskDO.getTaskTag(), jobClass, taskDO.getCornExpress());
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        if (openTaskList.size() > 0) {
            System.out.println("掃描并初始化開啟quartz定時(shí)任務(wù)成功,任務(wù)數(shù)量:" + openTaskList.size() + "個(gè)");
        }
    }
 
    public void startTask( F_QuartzTaskDO taskDO){
        try {
            Class<Job> jobClass = (Class<Job>) Class.forName(taskDO.getJobClassPath());
            if (taskDO.getTaskType() == QuartzEnum.TaskType.Cycle.get_value()) {
                addIntervalJob(taskDO.getTaskTag(), jobClass, taskDO.getExecutePeroid(), taskDO.getExecuteUnit());
            } else {
                addCornJob(taskDO.getTaskTag(), jobClass, taskDO.getCornExpress());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    //增加定時(shí)任務(wù)任務(wù)
    public void addIntervalJob(String jobName, Class<? extends Job> cls, int peroid, int timeUnit) {
        try {
            SimpleScheduleBuilder scheduleBuilder = null;
            if (timeUnit == QuartzEnum.ExecuteUnit.Second.get_value()) {
                scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(peroid).repeatForever();
            } else if (timeUnit == QuartzEnum.ExecuteUnit.Minute.get_value()) {
                scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(peroid).repeatForever();
            } else if (timeUnit == QuartzEnum.ExecuteUnit.Hour.get_value()) {
                scheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInHours(peroid).repeatForever();
            }
            Scheduler sched = schedulerFactoryBean.getScheduler();
            JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, JOB_GROUP_NAME).storeDurably().build();
            Trigger trigger = TriggerBuilder.newTrigger().forJob(jobDetail).withIdentity(jobName, TRIGGER_GROUP_NAME).withSchedule(scheduleBuilder).build();
 
            sched.scheduleJob(jobDetail, trigger);
            if (!sched.isShutdown()) {
                sched.start();        // 啟動(dòng)
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
 
    //增加corn表達(dá)式任務(wù)
    public void addCornJob(String jobName, Class<? extends Job> cls, String cornExpress) {
        try {
            Scheduler sched = schedulerFactoryBean.getScheduler();
            JobDetail jobDetail = JobBuilder.newJob(cls).withIdentity(jobName, JOB_GROUP_NAME).build();
            CronTrigger trigger = (CronTrigger) TriggerBuilder
                    .newTrigger()
                    .withIdentity(jobName, TRIGGER_GROUP_NAME)
                    .withSchedule(CronScheduleBuilder.cronSchedule(cornExpress))
                    .build();
            sched.scheduleJob(jobDetail, trigger);
            if (!sched.isShutdown()) {
                sched.start();        // 啟動(dòng)
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
 
    //停止任務(wù)
    public void deleteJob(String jobName) {
        try {
            Scheduler sched = schedulerFactoryBean.getScheduler();
            TriggerKey triggerKey = TriggerKey.triggerKey(jobName, TRIGGER_GROUP_NAME);
            JobKey jobKey = JobKey.jobKey(jobName, JOB_GROUP_NAME);
            sched.pauseTrigger(triggerKey); // 停止觸發(fā)器
            sched.unscheduleJob(triggerKey);// 移除觸發(fā)器
            sched.deleteJob(jobKey);        // 刪除任務(wù)
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
 
}

界面展示

SpringBoot實(shí)現(xiàn)quartz定時(shí)任務(wù)可視化管理功能

SpringBoot實(shí)現(xiàn)quartz定時(shí)任務(wù)可視化管理功能

到此這篇關(guān)于SpringBoot實(shí)現(xiàn)quartz定時(shí)任務(wù)可視化管理的文章就介紹到這了,更多相關(guān)SpringBoot 定時(shí)任務(wù)可視化內(nèi)容請搜索服務(wù)器之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持服務(wù)器之家!

原文鏈接:https://blog.csdn.net/u013407099/article/details/119978407

延伸 · 閱讀

精彩推薦
  • Java教程小米推送Java代碼

    小米推送Java代碼

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

    富貴穩(wěn)中求8032021-07-12
  • Java教程20個(gè)非常實(shí)用的Java程序代碼片段

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

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

    lijiao5352020-04-06
  • Java教程xml與Java對象的轉(zhuǎn)換詳解

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

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

    Java教程網(wǎng)2942020-09-17
  • Java教程升級IDEA后Lombok不能使用的解決方法

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

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

    程序猿DD9332021-10-08
  • Java教程Java實(shí)現(xiàn)搶紅包功能

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

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

    littleschemer13532021-05-16
  • 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教程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使用SAX解析xml的示例

    Java使用SAX解析xml的示例

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

    大行者10067412021-08-30
主站蜘蛛池模板: 免费观看无人区完整版 | 国语精彩对白2021 | 国产成人在线免费视频 | 亚洲国产在线播放在线 | 黑人好大好硬好深好爽想要h | 亚洲高清中文字幕一区二区三区 | 四虎网址大全 | 午夜国产| 99精彩视频| 午夜小视频免费 | 久久精品国产在热亚洲 | 国产一区视频在线免费观看 | 视频一区国产精戏刘婷30 | 日本全黄三级在线观看 | 亚洲一欧洲中文字幕在线 | 久久人妻熟女中文字幕AV蜜芽 | avav一区| 亚洲品质自拍网站 | 小柔的性放荡羞辱日记 | 日本精a在线观看 | 九九精品成人免费国产片 | 国产精品中文字幕 | 国产在线欧美精品 | 奶茶视频官网免费 | 青久久| free嫩白的12sex性自由 | 国产好痛疼轻点好爽的视频 | 97爱干 | 日本www午夜色在线视频 | 精品国产麻豆AV无码 | 人人斗地主 | 爆操美女 | 半挠脚心半黄的网站 | 国产精品福利久久2020 | 偷偷狠狠的日日高清完整视频 | yellow片在线观看 | 吃大胸寡妇的奶 | 国产精品国色综合久久 | 二区三区视频 | 日老逼 | 久久不卡免费视频 |