激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

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

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
主站蜘蛛池模板: 欧美日韩a∨毛片一区 | 少妇色诱麻豆色哟哟 | 色屁屁xxxxⅹ在线视频 | 久久骚 | 久久国产精品二国产精品中国洋人 | 国产精品久久久久久久四虎电影 | 黄污网址 | 男女生羞羞视频网站在线观看 | 成人在线观看免费观看 | 日韩精品网站在线观看 | 羞羞网站在线观看入口免费 | 黄视频免费在线 | 九九热在线视频观看这里只有精品 | 在线免费av观看 | 毛片哪里看 | 偿还电影免费看 | av日韩一区二区三区 | 激情久久婷婷 | 午夜视| 久久丝袜脚交足黄网站免费 | 久久亚洲激情 | 羞羞视频免费视频欧美 | 国产免费一区二区三区视频 | 在线观看免费污视频 | 日韩欧美高清片 | 国产黄色网 | 精品久久久久久久久久久下田 | 日本一区二区三区视频在线 | 美女羞羞视频网站 | 国产午夜电影 | 99久久久久国产精品免费 | 国产一级毛片高清视频 | 鲁丝一区二区二区四区 | 亚洲精品午夜国产va久久成人 | 久久精品国产亚洲7777小说 | 毛片在线看免费 | 色播视频在线播放 | 蜜桃视频在线免费观看 | 日本a在线观看 | 久久久一区二区三区视频 | 一级做受毛片免费大片 |