From 2f2ed56348d49195220926ba12e6f9e0e87a7afd Mon Sep 17 00:00:00 2001
From: xuxueli <931591021@qq.com>
Date: Fri, 22 Dec 2017 19:03:42 +0800
Subject: [PATCH] =?UTF-8?q?=E5=91=8A=E8=AD=A6=E9=82=AE=E4=BB=B6=E6=A0=B7?=
=?UTF-8?q?=E5=BC=8F=E4=BC=98=E5=8C=96=EF=BC=9B=E9=82=AE=E4=BB=B6=E7=BB=84?=
=?UTF-8?q?=E4=BB=B6=E8=B0=83=E6=95=B4=E4=B8=BAcommons-email=E7=AE=80?=
=?UTF-8?q?=E5=8C=96=E9=82=AE=E4=BB=B6=E6=93=8D=E4=BD=9C=EF=BC=9B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
doc/XXL-JOB官方文档.md | 1 +
pom.xml | 1 +
xxl-job-admin/pom.xml | 8 +-
.../core/thread/JobFailMonitorHelper.java | 67 +++++++---
.../xxl/job/admin/core/util/JobKeyUtil.java | 23 ++++
.../com/xxl/job/admin/core/util/MailUtil.java | 118 +++++-------------
.../com/xxl/job/dao/impl/MailUtilTest.java | 44 +++++++
7 files changed, 155 insertions(+), 107 deletions(-)
create mode 100644 xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java
create mode 100644 xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java
diff --git a/doc/XXL-JOB官方文档.md b/doc/XXL-JOB官方文档.md
index 3c546e50..8022ef56 100644
--- a/doc/XXL-JOB官方文档.md
+++ b/doc/XXL-JOB官方文档.md
@@ -1079,6 +1079,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
- 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次;
- 15、Log地址格式兼容,支持非"/"结尾路径配置;
- 16、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作;
+- 17、告警邮件样式优化;邮件组件调整为commons-email简化邮件操作;
### TODO LIST
diff --git a/pom.xml b/pom.xml
index d2f31344..fa21c08e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -34,6 +34,7 @@
1.3
1.9.2
2.6
+ 1.5
0.9.5.2
5.1.29
diff --git a/xxl-job-admin/pom.xml b/xxl-job-admin/pom.xml
index b86c7ebf..18fe16d4 100644
--- a/xxl-job-admin/pom.xml
+++ b/xxl-job-admin/pom.xml
@@ -124,11 +124,11 @@
${httpclient.version}
-
+
- javax.mail
- mail
- ${mail.version}
+ org.apache.commons
+ commons-email
+ ${commons-email.version}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
index ae0411aa..a4f617bf 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
@@ -4,6 +4,7 @@ import com.xxl.job.admin.core.model.XxlJobGroup;
import com.xxl.job.admin.core.model.XxlJobInfo;
import com.xxl.job.admin.core.model.XxlJobLog;
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
+import com.xxl.job.admin.core.util.JobKeyUtil;
import com.xxl.job.admin.core.util.MailUtil;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
@@ -28,6 +29,8 @@ public class JobFailMonitorHelper {
return instance;
}
+ // ---------------------- monitor ----------------------
+
private LinkedBlockingQueue queue = new LinkedBlockingQueue(0xfff8);
private Thread monitorThread;
@@ -97,6 +100,46 @@ public class JobFailMonitorHelper {
monitorThread.start();
}
+ public void toStop(){
+ toStop = true;
+ // interrupt and wait
+ monitorThread.interrupt();
+ try {
+ monitorThread.join();
+ } catch (InterruptedException e) {
+ logger.error(e.getMessage(), e);
+ }
+ }
+
+ // producer
+ public static void monitor(int jobLogId){
+ getInstance().queue.offer(jobLogId);
+ }
+
+
+ // ---------------------- alarm ----------------------
+
+ // email alarm template
+ private static final String mailBodyTemplate = "监控告警明细:" +
+ "
\n" +
+ " " +
+ " \n" +
+ " 执行器 | \n" +
+ " JobKey | \n" +
+ " 任务描述 | \n" +
+ " 告警类型 | \n" +
+ "
\n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " {0} | \n" +
+ " {1} | \n" +
+ " {2} | \n" +
+ " 调度失败 | \n" +
+ "
\n" +
+ " \n" +
+ "
";
+
/**
* fail alarm
*
@@ -110,10 +153,12 @@ public class JobFailMonitorHelper {
Set emailSet = new HashSet(Arrays.asList(info.getAlarmEmail().split(",")));
for (String email: emailSet) {
- String title = "《调度监控报警》(任务调度中心XXL-JOB)";
XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(Integer.valueOf(info.getJobGroup()));
- String content = MessageFormat.format("任务调度失败, 执行器名称:{0}, 任务描述:{1}.", group!=null?group.getTitle():"null", info.getJobDesc());
- MailUtil.sendMail(email, title, content, false, null);
+
+ String title = "调度中心监控报警";
+ String content = MessageFormat.format(mailBodyTemplate, group!=null?group.getTitle():"null", JobKeyUtil.formatJobKey(info), info.getJobDesc());
+
+ MailUtil.sendMail(email, title, content);
}
}
@@ -121,20 +166,4 @@ public class JobFailMonitorHelper {
}
- public void toStop(){
- toStop = true;
- // interrupt and wait
- monitorThread.interrupt();
- try {
- monitorThread.join();
- } catch (InterruptedException e) {
- logger.error(e.getMessage(), e);
- }
- }
-
- // producer
- public static void monitor(int jobLogId){
- getInstance().queue.offer(jobLogId);
- }
-
}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java
new file mode 100644
index 00000000..05378c6f
--- /dev/null
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java
@@ -0,0 +1,23 @@
+package com.xxl.job.admin.core.util;
+
+import com.xxl.job.admin.core.model.XxlJobInfo;
+
+/**
+ * job key util
+ *
+ * @author xuxueli 2017-12-22 18:48:45
+ */
+public class JobKeyUtil {
+
+ /**
+ * format job key
+ *
+ * @param xxlJobInfo
+ * @return
+ */
+ public static String formatJobKey(XxlJobInfo xxlJobInfo){
+ return String.valueOf(xxlJobInfo.getJobGroup())
+ .concat("_").concat(String.valueOf(xxlJobInfo.getId()));
+ }
+
+}
diff --git a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java
index 8c7733b5..e000b157 100644
--- a/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java
+++ b/xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java
@@ -1,19 +1,16 @@
package com.xxl.job.admin.core.util;
-import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.mail.DefaultAuthenticator;
+import org.apache.commons.mail.EmailException;
+import org.apache.commons.mail.HtmlEmail;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-import org.springframework.mail.javamail.JavaMailSenderImpl;
-import org.springframework.mail.javamail.MimeMessageHelper;
-import javax.mail.internet.MimeMessage;
-import java.io.File;
-import java.util.Properties;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
+import java.nio.charset.Charset;
/**
* 邮件发送.Util
+ *
* @author xuxueli 2016-3-12 15:06:20
*/
public class MailUtil {
@@ -33,89 +30,42 @@ public class MailUtil {
}
/**
- * 发送邮件 (完整版) (纯JavaMail)
- *
- * @param toAddress : 收件人邮箱
- * @param mailSubject : 邮件主题
- * @param mailBody : 邮件正文
- * @param mailBodyIsHtml: 邮件正文格式,true:HTML格式;false:文本格式
- * //@param inLineFile : 内嵌文件
- * @param attachments : 附件
+ *
+ * @param toAddress 收件人邮箱
+ * @param mailSubject 邮件主题
+ * @param mailBody 邮件正文
+ * @return
*/
- public static boolean sendMail (String toAddress, String mailSubject, String mailBody,
- boolean mailBodyIsHtml, File[] attachments){
- try {
- // 创建邮件发送类 JavaMailSender (用于发送多元化邮件,包括附件,图片,html 等)
- JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
- mailSender.setHost(host); // 设置邮件服务主机
- mailSender.setUsername(username); // 发送者邮箱的用户名
- mailSender.setPassword(password); // 发送者邮箱的密码
-
- // 配置文件,用于实例化java.mail.session
- Properties pro = new Properties();
- pro.put("mail.transport.protocol", "smtp");
- pro.put("mail.smtp.auth", "true"); // 登录SMTP服务器,需要获得授权 (网易163邮箱新近注册的邮箱均不能授权,测试 sohu 的邮箱可以获得授权)
- pro.put("mail.smtp.socketFactory.port", port);
- pro.put("mail.smtp.socketFactory.fallback", "false");
- mailSender.setJavaMailProperties(pro);
-
- // 创建多元化邮件 (创建 mimeMessage 帮助类,用于封装信息至 mimeMessage)
- MimeMessage mimeMessage = mailSender.createMimeMessage();
- MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, ArrayUtils.isNotEmpty(attachments), "UTF-8");
-
- helper.setFrom(username, sendNick);
- helper.setTo(toAddress);
+ public static boolean sendMail(String toAddress, String mailSubject, String mailBody){
- helper.setSubject(mailSubject);
- helper.setText(mailBody, mailBodyIsHtml);
-
- // 设置收件人抄送的名片和地址(相当于群发)
- //helper.setCc(InternetAddress.parse(MimeUtility.encodeText("邮箱001") + " <@163.com>," + MimeUtility.encodeText("邮箱002") + " <@foxmail.com>"));
+ try {
+ // Create the email message
+ HtmlEmail email = new HtmlEmail();
- // 内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源
- //helper.addInline(MimeUtility.encodeText(inLineFile.getName()), inLineFile);
-
- // 添加附件
- /*if (ArrayUtils.isNotEmpty(attachments)) {
- for (File file : attachments) {
- helper.addAttachment(MimeUtility.encodeText(file.getName()), file);
- }
- }*/
+ //email.setDebug(true); // 将会打印一些log
+ //email.setTLS(true); // 是否TLS校验,,某些邮箱需要TLS安全校验,同理有SSL校验
+ //email.setSSL(true);
- // 群发
- //MimeMessage[] mailMessages = { mimeMessage };
-
- mailSender.send(mimeMessage);
+ email.setHostName(host);
+ email.setSmtpPort(Integer.valueOf(port));
+ //email.setSslSmtpPort(port);
+ email.setAuthenticator(new DefaultAuthenticator(username, password));
+ email.setCharset(Charset.defaultCharset().name());
+
+ email.setFrom(username, sendNick);
+ email.addTo(toAddress);
+ email.setSubject(mailSubject);
+ email.setMsg(mailBody);
+
+ //email.attach(attachment); // add the attachment
+
+ email.send(); // send the email
return true;
- } catch (Exception e) {
+ } catch (EmailException e) {
logger.error(e.getMessage(), e);
+
}
return false;
}
-
- static int total = 0;
- public static void main(String[] args) {
-
- ExecutorService exec = Executors.newCachedThreadPool();
- for (int i = 0; i < 1; i++) {
- exec.execute(new Thread(new Runnable() {
- @Override
- public void run() {
- while(total < 1){
- String mailBody = "新书快递通知
你的新书快递申请已推送新书,请到空间"
- + "中查看";
-
- sendMail("931591021@qq.com", "测试邮件", mailBody, true, null);
- System.out.println(total);
- total++;
- }
- }
- }));
- }
- }
-
+
}
diff --git a/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java b/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java
new file mode 100644
index 00000000..daee21a0
--- /dev/null
+++ b/xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java
@@ -0,0 +1,44 @@
+package com.xxl.job.dao.impl;
+
+import com.xxl.job.admin.core.util.MailUtil;
+import org.junit.Test;
+
+import java.text.MessageFormat;
+
+/**
+ * email util test
+ *
+ * @author xuxueli 2017-12-22 17:16:23
+ */
+public class MailUtilTest {
+
+ @Test
+ public void registryTest() throws Exception {
+
+ String mailBodyTemplate = "监控告警明细:" +
+ "
\n" +
+ " " +
+ " \n" +
+ " 执行器 | \n" +
+ " JobKey | \n" +
+ " 任务描述 | \n" +
+ " 告警类型 | \n" +
+ "
\n" +
+ " \n" +
+ " \n" +
+ " \n" +
+ " {0} | \n" +
+ " {1} | \n" +
+ " {2} | \n" +
+ " 调度失败 | \n" +
+ "
\n" +
+ " \n" +
+ "
";
+
+ mailBodyTemplate = MessageFormat.format(mailBodyTemplate, "1_1", "分组A", "任务A1");
+
+ boolean ret = MailUtil.sendMail("931591021@qq.com", "调度中心监控报警" , mailBodyTemplate);
+ System.out.println(ret);
+ }
+
+}