kerry пре 5 година
родитељ
комит
d8f57a570f

+ 23 - 0
xxl-job-admin/src/main/java/com/xxl/job/admin/config/RestConfiguration.java Прегледај датотеку

@@ -0,0 +1,23 @@
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 Прегледај датотеку

@@ -7,6 +7,7 @@ import org.springframework.beans.factory.InitializingBean;
7 7
 import org.springframework.beans.factory.annotation.Value;
8 8
 import org.springframework.mail.javamail.JavaMailSender;
9 9
 import org.springframework.stereotype.Component;
10
+import org.springframework.web.client.RestTemplate;
10 11
 
11 12
 import javax.annotation.Resource;
12 13
 import javax.sql.DataSource;
@@ -82,6 +83,8 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
82 83
     private JavaMailSender mailSender;
83 84
     @Resource
84 85
     private DataSource dataSource;
86
+    @Resource
87
+    private RestTemplate restTemplate;
85 88
 
86 89
 
87 90
     public String getI18n() {
@@ -145,4 +148,7 @@ public class XxlJobAdminConfig implements InitializingBean, DisposableBean {
145 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 Прегледај датотеку

@@ -10,13 +10,12 @@ import com.xxl.job.core.biz.model.ReturnT;
10 10
 import org.slf4j.Logger;
11 11
 import org.slf4j.LoggerFactory;
12 12
 import org.springframework.mail.javamail.MimeMessageHelper;
13
+import org.springframework.web.client.RestTemplate;
13 14
 
14 15
 import javax.mail.internet.MimeMessage;
15 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 19
 import java.util.concurrent.TimeUnit;
21 20
 
22 21
 /**
@@ -124,7 +123,49 @@ public class JobFailMonitorHelper {
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 170
     // email alarm template
130 171
     private static final String mailBodyTemplate = "<h5>" + I18nUtil.getString("jobconf_monitor_detail") + ":</span>" +
@@ -149,63 +190,99 @@ public class JobFailMonitorHelper {
149 190
             "   </tbody>\n" +
150 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 Прегледај датотеку

@@ -108,13 +108,13 @@ public class XxlJobServiceImpl implements XxlJobService {
108 108
             }
109 109
 
110 110
             // join , avoid "xxx,,"
111
-            String temp = "";
111
+            StringBuilder temp = new StringBuilder();
112 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 120
         // add in db

+ 2 - 2
xxl-job-admin/src/main/resources/templates/jobinfo/jobinfo.index.ftl Прегледај датотеку

@@ -172,7 +172,7 @@
172 172
                         <label for="lastname" class="col-sm-2 control-label">${I18n.jobinfo_field_author}<font color="red">*</font></label>
173 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 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 176
 					</div>
177 177
                     <div class="form-group">
178 178
                         <label for="firstname" class="col-sm-2 control-label">${I18n.jobinfo_field_executorparam}<font color="black">*</font></label>
@@ -368,7 +368,7 @@ exit 0
368 368
                         <label for="lastname" class="col-sm-2 control-label">${I18n.jobinfo_field_author}<font color="red">*</font></label>
369 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 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 372
                     </div>
373 373
                     <div class="form-group">
374 374
                         <label for="firstname" class="col-sm-2 control-label">${I18n.jobinfo_field_executorparam}<font color="black">*</font></label>