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

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

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

服務器之家 - 編程語言 - Java教程 - SpringBoot實現quartz定時任務可視化管理功能

SpringBoot實現quartz定時任務可視化管理功能

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

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

前言

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

?
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();
   }

表結構

用于存儲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, "循環任務"), Corn(20, "Corn表達式任務");
        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任務類別";
        }
    }
 
    public enum ExecuteUnit implements IConvertEnumToCodeItem {
        Second(10, "秒"), Minute(20, "分"), Hour(30, "時");
        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, "關閉");
        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任務狀態";
        }
    }
 
    public enum TaskEnviroment implements IConvertEnumToCodeItem {
        All("全部", "全部"), Dev("dev", "開發環境"), Pro("pro", "正式環境");
        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任務執行環境";
        }
    }
}

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 {
        // 調用父類的方法
        Object jobInstance = super.createJobInstance(bundle);
        // 進行注入
        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實例化,能夠操作進行Spring 注入
        return schedulerFactoryBean;
    }
}

QuartzUtil

定時任務動態添加/刪除操作類,initQuartzTask方法在系統啟動時執行,根據配置自動開啟相關符合條件的任務

?
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定時任務成功,任務數量:" + openTaskList.size() + "個");
        }
    }
 
    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();
        }
    }
 
    //增加定時任務任務
    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();        // 啟動
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
 
    //增加corn表達式任務
    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();        // 啟動
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
 
    //停止任務
    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); // 停止觸發器
            sched.unscheduleJob(triggerKey);// 移除觸發器
            sched.deleteJob(jobKey);        // 刪除任務
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
 
}

界面展示

SpringBoot實現quartz定時任務可視化管理功能

SpringBoot實現quartz定時任務可視化管理功能

到此這篇關于SpringBoot實現quartz定時任務可視化管理的文章就介紹到這了,更多相關SpringBoot 定時任務可視化內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

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

延伸 · 閱讀

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

    小米推送Java代碼

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

    富貴穩中求8032021-07-12
  • Java教程20個非常實用的Java程序代碼片段

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

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

    lijiao5352020-04-06
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

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

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

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

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

    程序猿DD9332021-10-08
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

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

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

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

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

    spcoder14552021-10-18
  • Java教程Java8中Stream使用的一個注意事項

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

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

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

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

    大行者10067412021-08-30
主站蜘蛛池模板: 麻豆视频免费在线播放 | 国产日产精品久久久久快鸭 | 国产第一福利视频导航在线 | 精品午夜寂寞黄网站在线 | 国产在线播放一区 | 久久亚洲精品AV无码四区 | 日本指交| 日本天堂网 | 紧身裙女教师miad711在线 | 日本一二线不卡在线观看 | 69欧美性猛交 | 四虎在线永久视频观看 | 免费国产成人 | 顶级尤物极品女神福利视频 | 大肥臀风间由美 中文字幕 大东北chinesexxxx露脸 | chinese男同志同性twink | 午夜亚洲 | 亚洲欧美日韩另类在线 | 农村妇女野战bbxxx | 北海市副市长黄江老公 | 成人另类视频 | 久久99国产视频 | 跪在老师脚下吃丝袜脚 | x8x8在线观看免费 | 3d蒂法精品啪啪一区二区免费 | 青草草视频在线观看 | 深夜福利一区 | 久久re热在线视频精99 | 双性np玩烂了np欲之国的太子 | 欧美乱理伦另类视频 | 日韩欧美亚洲天堂 | 女人用粗大自熨喷水在线视频 | 国产一区私人高清影院 | 国产成人+亚洲欧洲 | 九九精品视频一区二区三区 | 国产成人免费高清激情视频 | 精品国产在天天线在线麻豆 | 美女撒尿无遮挡免费中国 | 美女福利视频午夜在线 | 久久综合香蕉久久久久久久 | 女同全黄h全肉动漫 |