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" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
执行器JobKey任务描述告警类型
{0}{1}{2}调度失败
"; + /** * 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" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
执行器JobKey任务描述告警类型
{0}{1}{2}调度失败
"; + + mailBodyTemplate = MessageFormat.format(mailBodyTemplate, "1_1", "分组A", "任务A1"); + + boolean ret = MailUtil.sendMail("931591021@qq.com", "调度中心监控报警" , mailBodyTemplate); + System.out.println(ret); + } + +}