|
@@ -2,6 +2,7 @@ package com.xxl.job.admin.service.impl;
|
2
|
2
|
|
3
|
3
|
import com.xxl.job.admin.core.model.XxlJobGroup;
|
4
|
4
|
import com.xxl.job.admin.core.model.XxlJobInfo;
|
|
5
|
+import com.xxl.job.admin.core.route.ExecutorRouteStrategyEnum;
|
5
|
6
|
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
6
|
7
|
import com.xxl.job.admin.dao.IXxlJobGroupDao;
|
7
|
8
|
import com.xxl.job.admin.dao.IXxlJobInfoDao;
|
|
@@ -64,33 +65,34 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
64
|
65
|
}
|
65
|
66
|
|
66
|
67
|
@Override
|
67
|
|
- public ReturnT<String> add(int jobGroup, String jobCron, String jobDesc, String author, String alarmEmail,
|
68
|
|
- String executorHandler, String executorParam,
|
69
|
|
- int glueSwitch, String glueSource, String glueRemark, String childJobKey) {
|
|
68
|
+ public ReturnT<String> add(XxlJobInfo jobInfo) {
|
70
|
69
|
// valid
|
71
|
|
- XxlJobGroup group = xxlJobGroupDao.load(jobGroup);
|
|
70
|
+ XxlJobGroup group = xxlJobGroupDao.load(jobInfo.getJobGroup());
|
72
|
71
|
if (group == null) {
|
73
|
72
|
return new ReturnT<String>(500, "请选择“执行器”");
|
74
|
73
|
}
|
75
|
|
- if (!CronExpression.isValidExpression(jobCron)) {
|
|
74
|
+ if (!CronExpression.isValidExpression(jobInfo.getJobCron())) {
|
76
|
75
|
return new ReturnT<String>(500, "请输入格式正确的“Cron”");
|
77
|
76
|
}
|
78
|
|
- if (StringUtils.isBlank(jobDesc)) {
|
|
77
|
+ if (StringUtils.isBlank(jobInfo.getJobDesc())) {
|
79
|
78
|
return new ReturnT<String>(500, "请输入“任务描述”");
|
80
|
79
|
}
|
81
|
|
- if (StringUtils.isBlank(author)) {
|
|
80
|
+ if (StringUtils.isBlank(jobInfo.getAuthor())) {
|
82
|
81
|
return new ReturnT<String>(500, "请输入“负责人”");
|
83
|
82
|
}
|
84
|
|
- if (StringUtils.isBlank(alarmEmail)) {
|
|
83
|
+ if (StringUtils.isBlank(jobInfo.getAlarmEmail())) {
|
85
|
84
|
return new ReturnT<String>(500, "请输入“报警邮件”");
|
86
|
85
|
}
|
87
|
|
- if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
|
|
86
|
+ if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {
|
|
87
|
+ return new ReturnT<String>(500, "路由策略非法");
|
|
88
|
+ }
|
|
89
|
+ if (jobInfo.getGlueSwitch()==0 && StringUtils.isBlank(jobInfo.getExecutorHandler())) {
|
88
|
90
|
return new ReturnT<String>(500, "请输入“JobHandler”");
|
89
|
91
|
}
|
90
|
92
|
|
91
|
93
|
// childJobKey valid
|
92
|
|
- if (StringUtils.isNotBlank(childJobKey)) {
|
93
|
|
- String[] childJobKeys = childJobKey.split(",");
|
|
94
|
+ if (StringUtils.isNotBlank(jobInfo.getChildJobKey())) {
|
|
95
|
+ String[] childJobKeys = jobInfo.getChildJobKey().split(",");
|
94
|
96
|
for (String childJobKeyItem: childJobKeys) {
|
95
|
97
|
String[] childJobKeyArr = childJobKeyItem.split("_");
|
96
|
98
|
if (childJobKeyArr.length!=2) {
|
|
@@ -105,8 +107,9 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
105
|
107
|
|
106
|
108
|
// generate jobName
|
107
|
109
|
String jobName = FastDateFormat.getInstance("yyyyMMddHHmmssSSSS").format(new Date());
|
|
110
|
+ jobInfo.setJobName(jobName);
|
108
|
111
|
try {
|
109
|
|
- if (XxlJobDynamicScheduler.checkExists(jobName, String.valueOf(jobGroup))) {
|
|
112
|
+ if (XxlJobDynamicScheduler.checkExists(jobName, String.valueOf(jobInfo.getJobGroup()))) {
|
110
|
113
|
return new ReturnT<String>(500, "系统繁忙,请稍后重试");
|
111
|
114
|
}
|
112
|
115
|
} catch (SchedulerException e1) {
|
|
@@ -115,7 +118,7 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
115
|
118
|
}
|
116
|
119
|
|
117
|
120
|
// Backup to the database
|
118
|
|
- XxlJobInfo jobInfo = new XxlJobInfo();
|
|
121
|
+ /*XxlJobInfo jobInfo = new XxlJobInfo();
|
119
|
122
|
jobInfo.setJobGroup(jobGroup);
|
120
|
123
|
jobInfo.setJobName(jobName);
|
121
|
124
|
jobInfo.setJobCron(jobCron);
|
|
@@ -127,11 +130,11 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
127
|
130
|
jobInfo.setGlueSwitch(glueSwitch);
|
128
|
131
|
jobInfo.setGlueSource(glueSource);
|
129
|
132
|
jobInfo.setGlueRemark(glueRemark);
|
130
|
|
- jobInfo.setChildJobKey(childJobKey);
|
|
133
|
+ jobInfo.setChildJobKey(childJobKey);*/
|
131
|
134
|
|
132
|
135
|
try {
|
133
|
136
|
// add job 2 quartz
|
134
|
|
- boolean result = XxlJobDynamicScheduler.addJob(String.valueOf(jobGroup), jobName, jobCron);
|
|
137
|
+ boolean result = XxlJobDynamicScheduler.addJob(String.valueOf(jobInfo.getJobGroup()), jobName, jobInfo.getJobCron());
|
135
|
138
|
if (result) {
|
136
|
139
|
xxlJobInfoDao.save(jobInfo);
|
137
|
140
|
return ReturnT.SUCCESS;
|
|
@@ -145,36 +148,31 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
145
|
148
|
}
|
146
|
149
|
|
147
|
150
|
@Override
|
148
|
|
- public ReturnT<String> reschedule(int jobGroup, String jobName, String jobCron, String jobDesc, String author, String alarmEmail,
|
149
|
|
- String executorHandler, String executorParam, int glueSwitch, String childJobKey) {
|
|
151
|
+ public ReturnT<String> reschedule(XxlJobInfo jobInfo) {
|
150
|
152
|
|
151
|
153
|
// valid
|
152
|
|
- XxlJobGroup group = xxlJobGroupDao.load(jobGroup);
|
153
|
|
- if (group == null) {
|
154
|
|
- return new ReturnT<String>(500, "请选择“执行器”");
|
155
|
|
- }
|
156
|
|
- if (StringUtils.isBlank(jobName)) {
|
157
|
|
- return new ReturnT<String>(500, "请输入“任务名”");
|
158
|
|
- }
|
159
|
|
- if (!CronExpression.isValidExpression(jobCron)) {
|
|
154
|
+ if (!CronExpression.isValidExpression(jobInfo.getJobCron())) {
|
160
|
155
|
return new ReturnT<String>(500, "请输入格式正确的“Cron”");
|
161
|
156
|
}
|
162
|
|
- if (StringUtils.isBlank(jobDesc)) {
|
|
157
|
+ if (StringUtils.isBlank(jobInfo.getJobDesc())) {
|
163
|
158
|
return new ReturnT<String>(500, "请输入“任务描述”");
|
164
|
159
|
}
|
165
|
|
- if (StringUtils.isBlank(author)) {
|
|
160
|
+ if (StringUtils.isBlank(jobInfo.getAuthor())) {
|
166
|
161
|
return new ReturnT<String>(500, "请输入“负责人”");
|
167
|
162
|
}
|
168
|
|
- if (StringUtils.isBlank(alarmEmail)) {
|
|
163
|
+ if (StringUtils.isBlank(jobInfo.getAlarmEmail())) {
|
169
|
164
|
return new ReturnT<String>(500, "请输入“报警邮件”");
|
170
|
165
|
}
|
171
|
|
- if (glueSwitch==0 && StringUtils.isBlank(executorHandler)) {
|
|
166
|
+ if (ExecutorRouteStrategyEnum.match(jobInfo.getExecutorRouteStrategy(), null) == null) {
|
|
167
|
+ return new ReturnT<String>(500, "路由策略非法");
|
|
168
|
+ }
|
|
169
|
+ if (jobInfo.getGlueSwitch()==0 && StringUtils.isBlank(jobInfo.getExecutorHandler())) {
|
172
|
170
|
return new ReturnT<String>(500, "请输入“JobHandler”");
|
173
|
171
|
}
|
174
|
172
|
|
175
|
173
|
// childJobKey valid
|
176
|
|
- if (StringUtils.isNotBlank(childJobKey)) {
|
177
|
|
- String[] childJobKeys = childJobKey.split(",");
|
|
174
|
+ if (StringUtils.isNotBlank(jobInfo.getChildJobKey())) {
|
|
175
|
+ String[] childJobKeys = jobInfo.getChildJobKey().split(",");
|
178
|
176
|
for (String childJobKeyItem: childJobKeys) {
|
179
|
177
|
String[] childJobKeyArr = childJobKeyItem.split("_");
|
180
|
178
|
if (childJobKeyArr.length!=2) {
|
|
@@ -188,21 +186,26 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
188
|
186
|
}
|
189
|
187
|
|
190
|
188
|
// stage job info
|
191
|
|
- XxlJobInfo jobInfo = xxlJobInfoDao.load(jobGroup, jobName);
|
192
|
|
- jobInfo.setJobCron(jobCron);
|
193
|
|
- jobInfo.setJobDesc(jobDesc);
|
194
|
|
- jobInfo.setAuthor(author);
|
195
|
|
- jobInfo.setAlarmEmail(alarmEmail);
|
196
|
|
- jobInfo.setExecutorHandler(executorHandler);
|
197
|
|
- jobInfo.setExecutorParam(executorParam);
|
198
|
|
- jobInfo.setGlueSwitch(glueSwitch);
|
199
|
|
- jobInfo.setChildJobKey(childJobKey);
|
|
189
|
+ XxlJobInfo exists_jobInfo = xxlJobInfoDao.loadById(jobInfo.getId());
|
|
190
|
+ if (exists_jobInfo == null) {
|
|
191
|
+ return new ReturnT<String>(500, "参数异常");
|
|
192
|
+ }
|
|
193
|
+
|
|
194
|
+ exists_jobInfo.setJobCron(jobInfo.getJobCron());
|
|
195
|
+ exists_jobInfo.setJobDesc(jobInfo.getJobDesc());
|
|
196
|
+ exists_jobInfo.setAuthor(jobInfo.getAuthor());
|
|
197
|
+ exists_jobInfo.setAlarmEmail(jobInfo.getAlarmEmail());
|
|
198
|
+ exists_jobInfo.setExecutorRouteStrategy(jobInfo.getExecutorRouteStrategy());
|
|
199
|
+ exists_jobInfo.setExecutorHandler(jobInfo.getExecutorHandler());
|
|
200
|
+ exists_jobInfo.setExecutorParam(jobInfo.getExecutorParam());
|
|
201
|
+ exists_jobInfo.setGlueSwitch(jobInfo.getGlueSwitch());
|
|
202
|
+ exists_jobInfo.setChildJobKey(jobInfo.getChildJobKey());
|
200
|
203
|
|
201
|
204
|
try {
|
202
|
205
|
// fresh quartz
|
203
|
|
- boolean ret = XxlJobDynamicScheduler.rescheduleJob(String.valueOf(jobGroup), jobName, jobCron);
|
|
206
|
+ boolean ret = XxlJobDynamicScheduler.rescheduleJob(String.valueOf(exists_jobInfo.getJobGroup()), exists_jobInfo.getJobName(), exists_jobInfo.getJobCron());
|
204
|
207
|
if (ret) {
|
205
|
|
- xxlJobInfoDao.update(jobInfo);
|
|
208
|
+ xxlJobInfoDao.update(exists_jobInfo);
|
206
|
209
|
return ReturnT.SUCCESS;
|
207
|
210
|
} else {
|
208
|
211
|
return new ReturnT<String>(500, "更新任务失败");
|
|
@@ -215,11 +218,13 @@ public class XxlJobServiceImpl implements IXxlJobService {
|
215
|
218
|
|
216
|
219
|
@Override
|
217
|
220
|
public ReturnT<String> remove(int jobGroup, String jobName) {
|
|
221
|
+ XxlJobInfo xxlJobInfo = xxlJobInfoDao.load(jobGroup, jobName);
|
|
222
|
+
|
218
|
223
|
try {
|
219
|
224
|
XxlJobDynamicScheduler.removeJob(jobName, String.valueOf(jobGroup));
|
220
|
225
|
xxlJobInfoDao.delete(jobGroup, jobName);
|
221
|
226
|
xxlJobLogDao.delete(jobGroup, jobName);
|
222
|
|
- xxlJobLogGlueDao.delete(jobGroup, jobName);
|
|
227
|
+ xxlJobLogGlueDao.deleteByJobId(xxlJobInfo.getId());
|
223
|
228
|
return ReturnT.SUCCESS;
|
224
|
229
|
} catch (SchedulerException e) {
|
225
|
230
|
e.printStackTrace();
|