前言
在實際框架或產品開發過程中,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 定時任務可視化內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!
原文鏈接:https://blog.csdn.net/u013407099/article/details/119978407