kerry 5 gadus atpakaļ
vecāks
revīzija
d8f57a570f

+ 23 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/config/RestConfiguration.java Parādīt failu

1
+package com.xxl.job.admin.config;
2
+
3
+import org.springframework.boot.web.client.RestTemplateBuilder;
4
+import org.springframework.context.annotation.Bean;
5
+import org.springframework.context.annotation.Configuration;
6
+import org.springframework.web.client.DefaultResponseErrorHandler;
7
+import org.springframework.web.client.RestTemplate;
8
+
9
+/**
10
+ * @author VcKerry on 2020/1/6
11
+ */
12
+
13
+@Configuration
14
+public class RestConfiguration {
15
+
16
+    @Bean
17
+    public RestTemplate restTemplate(RestTemplateBuilder builder) {
18
+        final RestTemplate restTemplate = builder.build();
19
+        restTemplate.setErrorHandler(new DefaultResponseErrorHandler());
20
+        return restTemplate;
21
+    }
22
+
23
+}

+ 6 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/conf/XxlJobAdminConfig.java Parādīt failu

7
 import org.springframework.beans.factory.annotation.Value;
7
 import org.springframework.beans.factory.annotation.Value;
8
 import org.springframework.mail.javamail.JavaMailSender;
8
 import org.springframework.mail.javamail.JavaMailSender;
9
 import org.springframework.stereotype.Component;
9
 import org.springframework.stereotype.Component;
10
+import org.springframework.web.client.RestTemplate;
10
 
11
 
11
 import javax.annotation.Resource;
12
 import javax.annotation.Resource;
12
 import javax.sql.DataSource;
13
 import javax.sql.DataSource;
82
     private JavaMailSender mailSender;
83
     private JavaMailSender mailSender;
83
     @Resource
84
     @Resource
84
     private DataSource dataSource;
85
     private DataSource dataSource;
86
+    @Resource
87
+    private RestTemplate restTemplate;
85
 
88
 
86
 
89
 
87
     public String getI18n() {
90
     public String getI18n() {
145
         return dataSource;
148
         return dataSource;
146
     }
149
     }
147
 
150
 
151
+    public RestTemplate getRestTemplate() {
152
+        return restTemplate;
153
+    }
148
 }
154
 }

+ 130 - 53
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java Parādīt failu

10
 import org.slf4j.Logger;
10
 import org.slf4j.Logger;
11
 import org.slf4j.LoggerFactory;
11
 import org.slf4j.LoggerFactory;
12
 import org.springframework.mail.javamail.MimeMessageHelper;
12
 import org.springframework.mail.javamail.MimeMessageHelper;
13
+import org.springframework.web.client.RestTemplate;
13
 
14
 
14
 import javax.mail.internet.MimeMessage;
15
 import javax.mail.internet.MimeMessage;
15
 import java.text.MessageFormat;
16
 import java.text.MessageFormat;
16
-import java.util.Arrays;
17
-import java.util.HashSet;
18
-import java.util.List;
19
-import java.util.Set;
17
+import java.text.SimpleDateFormat;
18
+import java.util.*;
20
 import java.util.concurrent.TimeUnit;
19
 import java.util.concurrent.TimeUnit;
21
 
20
 
22
 /**
21
 /**
124
     }
123
     }
125
 
124
 
126
 
125
 
127
-    // ---------------------- alarm ----------------------
126
+    /**
127
+     * fail alarm
128
+     *
129
+     * @param jobLog
130
+     */
131
+    private boolean failAlarm(XxlJobInfo info, XxlJobLog jobLog) {
132
+
133
+        if (info == null || info.getAlarmEmail() == null || info.getAlarmEmail().trim().length() == 0) {
134
+            return false;
135
+        }
136
+        boolean alarmResult = true;
137
+
138
+        // email info
139
+        XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(info.getJobGroup());
140
+        String personal = I18nUtil.getString("admin_name_full");
141
+        String title = I18nUtil.getString("jobconf_monitor");
142
+
143
+        Set<String> alarmAddressSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
144
+
145
+        for (String email : alarmAddressSet) {
146
+            try {
147
+                email = email.trim();
148
+                if (email.startsWith("http://") || email.startsWith("https://")) {
149
+                    final String content = textContent(group, info, jobLog, personal);
150
+                    alarmResult = failAlarmHttp(email, title, content, jobLog.getId());
151
+                } else if (email.startsWith("sms://")) {
152
+                    // sms 短信
153
+                } else {
154
+                    String content = emailContent(group, info, jobLog);
155
+                    alarmResult = failAlarmEmail(email, title, content, jobLog.getId(), personal);
156
+                }
157
+            } catch (Exception e) {
158
+                alarmResult = false;
159
+            }
160
+        }
161
+
162
+
163
+        // do something, custom alarm strategy, such as sms
164
+
165
+        return alarmResult;
166
+    }
167
+
168
+    // ---------------------- email alarm ----------------------
128
 
169
 
129
     // email alarm template
170
     // email alarm template
130
     private static final String mailBodyTemplate = "<h5>" + I18nUtil.getString("jobconf_monitor_detail") + ":</span>" +
171
     private static final String mailBodyTemplate = "<h5>" + I18nUtil.getString("jobconf_monitor_detail") + ":</span>" +
149
             "   </tbody>\n" +
190
             "   </tbody>\n" +
150
             "</table>";
191
             "</table>";
151
 
192
 
193
+    private String emailContent(XxlJobGroup group, XxlJobInfo info, XxlJobLog jobLog) {
194
+        // alarmContent
195
+        String alarmContent = "Alarm Job LogId=" + jobLog.getId();
196
+        if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) {
197
+            alarmContent += "<br>TriggerMsg=<br>" + jobLog.getTriggerMsg();
198
+        }
199
+        if (jobLog.getHandleCode() > 0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) {
200
+            alarmContent += "<br>HandleCode=" + jobLog.getHandleMsg();
201
+        }
202
+        return MessageFormat.format(mailBodyTemplate,
203
+                group != null ? group.getTitle() : "null",
204
+                info.getId(),
205
+                info.getJobDesc(),
206
+                alarmContent);
207
+    }
208
+
152
     /**
209
     /**
153
-     * fail alarm
210
+     * Email
154
      *
211
      *
155
-     * @param jobLog
212
+     * @param email
213
+     * @param title
214
+     * @param content
215
+     * @param jobLogId for error
216
+     * @return
156
      */
217
      */
157
-    private boolean failAlarm(XxlJobInfo info, XxlJobLog jobLog) {
158
-        boolean alarmResult = true;
159
-
160
-        // send monitor email
161
-        if (info != null && info.getAlarmEmail() != null && info.getAlarmEmail().trim().length() > 0) {
218
+    private boolean failAlarmEmail(String email, String title, String content, Long jobLogId, String personal) throws Exception {
219
+        // make mail
220
+        try {
221
+            MimeMessage mimeMessage = XxlJobAdminConfig.getAdminConfig().getMailSender().createMimeMessage();
222
+            MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
223
+            helper.setFrom(XxlJobAdminConfig.getAdminConfig().getEmailUserName(), personal);
224
+            helper.setTo(email);
225
+            helper.setSubject(title);
226
+            helper.setText(content, true);
227
+            XxlJobAdminConfig.getAdminConfig().getMailSender().send(mimeMessage);
228
+            return true;
229
+        } catch (Exception e) {
230
+            logger.error(">>>>>>>>>>> xxl-job, job fail alarm email send error, JobLogId:{}", jobLogId, e);
231
+            throw e;
232
+        }
233
+    }
162
 
234
 
163
-            // alarmContent
164
-            String alarmContent = "Alarm Job LogId=" + jobLog.getId();
165
-            if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) {
166
-                alarmContent += "<br>TriggerMsg=<br>" + jobLog.getTriggerMsg();
167
-            }
168
-            if (jobLog.getHandleCode() > 0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) {
169
-                alarmContent += "<br>HandleCode=" + jobLog.getHandleMsg();
170
-            }
235
+    private static final String TEXT_TEMPLATE = "{0} \n\n" +
236
+            I18nUtil.getString("jobconf_monitor_detail") + ": \n\n" +
237
+            I18nUtil.getString("jobinfo_field_jobgroup") + " : {1}" + " \n\n" +
238
+            I18nUtil.getString("jobinfo_field_id") + " : {2}" + " \n\n" +
239
+            I18nUtil.getString("jobinfo_field_jobdesc") + " : {3}" + " \n\n" +
240
+            I18nUtil.getString("jobconf_monitor_alarm_title") + " : " + I18nUtil.getString("jobconf_monitor_alarm_type") + " \n\n" +
241
+            I18nUtil.getString("jobconf_monitor_alarm_content") + " : {4}" + " \n\n";
171
 
242
 
172
-            // email info
173
-            XxlJobGroup group = XxlJobAdminConfig.getAdminConfig().getXxlJobGroupDao().load(Integer.valueOf(info.getJobGroup()));
174
-            String personal = I18nUtil.getString("admin_name_full");
175
-            String title = I18nUtil.getString("jobconf_monitor");
176
-            String content = MessageFormat.format(mailBodyTemplate,
177
-                    group != null ? group.getTitle() : "null",
178
-                    info.getId(),
179
-                    info.getJobDesc(),
180
-                    alarmContent);
181
-
182
-            Set<String> emailSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
183
-            for (String email : emailSet) {
184
-
185
-                // make mail
186
-                try {
187
-                    MimeMessage mimeMessage = XxlJobAdminConfig.getAdminConfig().getMailSender().createMimeMessage();
188
-
189
-                    MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true);
190
-                    helper.setFrom(XxlJobAdminConfig.getAdminConfig().getEmailUserName(), personal);
191
-                    helper.setTo(email);
192
-                    helper.setSubject(title);
193
-                    helper.setText(content, true);
194
-
195
-                    XxlJobAdminConfig.getAdminConfig().getMailSender().send(mimeMessage);
196
-                } catch (Exception e) {
197
-                    logger.error(">>>>>>>>>>> xxl-job, job fail alarm email send error, JobLogId:{}", jobLog.getId(), e);
198
-
199
-                    alarmResult = false;
200
-                }
201
 
243
 
202
-            }
244
+    private String textContent(XxlJobGroup group, XxlJobInfo info, XxlJobLog jobLog, String personal) {
245
+        // alarmContent
246
+        String alarmContent = "Alarm Job LogId=" + jobLog.getId() + ".";
247
+        if (jobLog.getTriggerCode() != ReturnT.SUCCESS_CODE) {
248
+            alarmContent += "TriggerMsg=" + jobLog.getTriggerMsg() + ".";
203
         }
249
         }
250
+        if (jobLog.getHandleCode() > 0 && jobLog.getHandleCode() != ReturnT.SUCCESS_CODE) {
251
+            alarmContent += "HandleCode=" + jobLog.getHandleMsg() + ".";
252
+        }
253
+        return MessageFormat.format(TEXT_TEMPLATE,
254
+                personal,
255
+                group != null ? group.getTitle() : "null",
256
+                info.getId(),
257
+                info.getJobDesc(),
258
+                alarmContent);
259
+    }
204
 
260
 
205
-        // do something, custom alarm strategy, such as sms
206
-
261
+    /**
262
+     * todo only support ftqq
263
+     *
264
+     * @param url
265
+     * @param title
266
+     * @param content
267
+     * @param jobLogId
268
+     * @return
269
+     * @throws Exception
270
+     */
271
+    private boolean failAlarmHttp(String url, String title, String content, Long jobLogId) throws Exception {
207
 
272
 
208
-        return alarmResult;
273
+        try {
274
+            final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
275
+            final String format = simpleDateFormat.format(new Date());
276
+            title = title + "[" + format + "]";
277
+            final RestTemplate restTemplate = XxlJobAdminConfig.getAdminConfig().getRestTemplate();
278
+            final String forObject = restTemplate.getForObject(url, String.class, title, content);
279
+            logger.debug(">>>>>>>>>>> xxl-job, job result:{}, JobLogId:{}", forObject, jobLogId);
280
+            return true;
281
+        } catch (Exception e) {
282
+            logger.error(">>>>>>>>>>> xxl-job, job fail alarm http send error, JobLogId:{}", jobLogId, e);
283
+            throw e;
284
+        }
209
     }
285
     }
210
 
286
 
287
+
211
 }
288
 }

+ 4 - 4
xxl-job-admin/src/main/java/com/xxl/job/admin/service/impl/XxlJobServiceImpl.java Parādīt failu

108
             }
108
             }
109
 
109
 
110
             // join , avoid "xxx,,"
110
             // join , avoid "xxx,,"
111
-            String temp = "";
111
+            StringBuilder temp = new StringBuilder();
112
             for (String item : childJobIds) {
112
             for (String item : childJobIds) {
113
-                temp += item + ",";
113
+                temp.append(item).append(",");
114
             }
114
             }
115
-            temp = temp.substring(0, temp.length() - 1);
115
+            temp = new StringBuilder(temp.substring(0, temp.length() - 1));
116
 
116
 
117
-            jobInfo.setChildJobId(temp);
117
+            jobInfo.setChildJobId(temp.toString());
118
         }
118
         }
119
 
119
 
120
         // add in db
120
         // add in db

+ 2 - 2
xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl Parādīt failu

172
                         <label for="lastname" class="col-sm-2 control-label">${I18n.jobinfo_field_author}<font color="red">*</font></label>
172
                         <label for="lastname" class="col-sm-2 control-label">${I18n.jobinfo_field_author}<font color="red">*</font></label>
173
                         <div class="col-sm-4"><input type="text" class="form-control" name="author" placeholder="${I18n.system_please_input}${I18n.jobinfo_field_author}" maxlength="50" ></div>
173
                         <div class="col-sm-4"><input type="text" class="form-control" name="author" placeholder="${I18n.system_please_input}${I18n.jobinfo_field_author}" maxlength="50" ></div>
174
                         <label for="lastname" class="col-sm-2 control-label">${I18n.jobinfo_field_alarmemail}<font color="black">*</font></label>
174
                         <label for="lastname" class="col-sm-2 control-label">${I18n.jobinfo_field_alarmemail}<font color="black">*</font></label>
175
-                        <div class="col-sm-4"><input type="text" class="form-control" name="alarmEmail" placeholder="${I18n.jobinfo_field_alarmemail_placeholder}" maxlength="100" ></div>
175
+                        <div class="col-sm-4"><input type="text" class="form-control" name="alarmEmail" placeholder="${I18n.jobinfo_field_alarmemail_placeholder}" maxlength="255" ></div>
176
 					</div>
176
 					</div>
177
                     <div class="form-group">
177
                     <div class="form-group">
178
                         <label for="firstname" class="col-sm-2 control-label">${I18n.jobinfo_field_executorparam}<font color="black">*</font></label>
178
                         <label for="firstname" class="col-sm-2 control-label">${I18n.jobinfo_field_executorparam}<font color="black">*</font></label>
368
                         <label for="lastname" class="col-sm-2 control-label">${I18n.jobinfo_field_author}<font color="red">*</font></label>
368
                         <label for="lastname" class="col-sm-2 control-label">${I18n.jobinfo_field_author}<font color="red">*</font></label>
369
                         <div class="col-sm-4"><input type="text" class="form-control" name="author" placeholder="${I18n.system_please_input}${I18n.jobinfo_field_author}" maxlength="50" ></div>
369
                         <div class="col-sm-4"><input type="text" class="form-control" name="author" placeholder="${I18n.system_please_input}${I18n.jobinfo_field_author}" maxlength="50" ></div>
370
                         <label for="lastname" class="col-sm-2 control-label">${I18n.jobinfo_field_alarmemail}<font color="black">*</font></label>
370
                         <label for="lastname" class="col-sm-2 control-label">${I18n.jobinfo_field_alarmemail}<font color="black">*</font></label>
371
-                        <div class="col-sm-4"><input type="text" class="form-control" name="alarmEmail" placeholder="${I18n.jobinfo_field_alarmemail_placeholder}" maxlength="100" ></div>
371
+                        <div class="col-sm-4"><input type="text" class="form-control" name="alarmEmail" placeholder="${I18n.jobinfo_field_alarmemail_placeholder}" maxlength="255" ></div>
372
                     </div>
372
                     </div>
373
                     <div class="form-group">
373
                     <div class="form-group">
374
                         <label for="firstname" class="col-sm-2 control-label">${I18n.jobinfo_field_executorparam}<font color="black">*</font></label>
374
                         <label for="firstname" class="col-sm-2 control-label">${I18n.jobinfo_field_executorparam}<font color="black">*</font></label>