告警邮件样式优化;邮件组件调整为commons-email简化邮件操作;
This commit is contained in:
parent
ecd9a47fb8
commit
2f2ed56348
|
@ -1079,6 +1079,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
||||||
- 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次;
|
- 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次;
|
||||||
- 15、Log地址格式兼容,支持非"/"结尾路径配置;
|
- 15、Log地址格式兼容,支持非"/"结尾路径配置;
|
||||||
- 16、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作;
|
- 16、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作;
|
||||||
|
- 17、告警邮件样式优化;邮件组件调整为commons-email简化邮件操作;
|
||||||
|
|
||||||
|
|
||||||
### TODO LIST
|
### TODO LIST
|
||||||
|
|
1
pom.xml
1
pom.xml
|
@ -34,6 +34,7 @@
|
||||||
<commons-exec.version>1.3</commons-exec.version>
|
<commons-exec.version>1.3</commons-exec.version>
|
||||||
<commons-beanutils.version>1.9.2</commons-beanutils.version>
|
<commons-beanutils.version>1.9.2</commons-beanutils.version>
|
||||||
<commons-lang.version>2.6</commons-lang.version>
|
<commons-lang.version>2.6</commons-lang.version>
|
||||||
|
<commons-email.version>1.5</commons-email.version>
|
||||||
|
|
||||||
<c3p0.version>0.9.5.2</c3p0.version>
|
<c3p0.version>0.9.5.2</c3p0.version>
|
||||||
<mysql-connector-java.version>5.1.29</mysql-connector-java.version>
|
<mysql-connector-java.version>5.1.29</mysql-connector-java.version>
|
||||||
|
|
|
@ -124,11 +124,11 @@
|
||||||
<version>${httpclient.version}</version>
|
<version>${httpclient.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- javax.mail -->
|
<!-- commons-email -->
|
||||||
<dependency>
|
<dependency>
|
||||||
<groupId>javax.mail</groupId>
|
<groupId>org.apache.commons</groupId>
|
||||||
<artifactId>mail</artifactId>
|
<artifactId>commons-email</artifactId>
|
||||||
<version>${mail.version}</version>
|
<version>${commons-email.version}</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
|
|
||||||
<!-- quartz :quartz-2.2.3/c3p0-0.9.1.1/slf4j-api-1.6.6 -->
|
<!-- quartz :quartz-2.2.3/c3p0-0.9.1.1/slf4j-api-1.6.6 -->
|
||||||
|
|
|
@ -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.XxlJobInfo;
|
||||||
import com.xxl.job.admin.core.model.XxlJobLog;
|
import com.xxl.job.admin.core.model.XxlJobLog;
|
||||||
import com.xxl.job.admin.core.schedule.XxlJobDynamicScheduler;
|
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.admin.core.util.MailUtil;
|
||||||
import com.xxl.job.core.biz.model.ReturnT;
|
import com.xxl.job.core.biz.model.ReturnT;
|
||||||
import com.xxl.job.core.handler.IJobHandler;
|
import com.xxl.job.core.handler.IJobHandler;
|
||||||
|
@ -28,6 +29,8 @@ public class JobFailMonitorHelper {
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ---------------------- monitor ----------------------
|
||||||
|
|
||||||
private LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(0xfff8);
|
private LinkedBlockingQueue<Integer> queue = new LinkedBlockingQueue<Integer>(0xfff8);
|
||||||
|
|
||||||
private Thread monitorThread;
|
private Thread monitorThread;
|
||||||
|
@ -97,30 +100,6 @@ public class JobFailMonitorHelper {
|
||||||
monitorThread.start();
|
monitorThread.start();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* fail alarm
|
|
||||||
*
|
|
||||||
* @param jobLog
|
|
||||||
*/
|
|
||||||
private void failAlarm(XxlJobLog jobLog){
|
|
||||||
|
|
||||||
// send monitor email
|
|
||||||
XxlJobInfo info = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobLog.getJobId());
|
|
||||||
if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) {
|
|
||||||
|
|
||||||
Set<String> emailSet = new HashSet<String>(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);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO, custom alarm strategy, such as sms
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void toStop(){
|
public void toStop(){
|
||||||
toStop = true;
|
toStop = true;
|
||||||
// interrupt and wait
|
// interrupt and wait
|
||||||
|
@ -137,4 +116,54 @@ public class JobFailMonitorHelper {
|
||||||
getInstance().queue.offer(jobLogId);
|
getInstance().queue.offer(jobLogId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// ---------------------- alarm ----------------------
|
||||||
|
|
||||||
|
// email alarm template
|
||||||
|
private static final String mailBodyTemplate = "<h5>监控告警明细:</span>" +
|
||||||
|
"<table border=\"1\" cellpadding=\"3\" style=\"border-collapse:collapse; width:80%;\" >\n" +
|
||||||
|
" <thead style=\"font-weight: bold;color: #ffffff;background-color: #ff8c00;\" >" +
|
||||||
|
" <tr>\n" +
|
||||||
|
" <td>执行器</td>\n" +
|
||||||
|
" <td>JobKey</td>\n" +
|
||||||
|
" <td>任务描述</td>\n" +
|
||||||
|
" <td>告警类型</td>\n" +
|
||||||
|
" </tr>\n" +
|
||||||
|
" <thead/>\n" +
|
||||||
|
" <tbody>\n" +
|
||||||
|
" <tr>\n" +
|
||||||
|
" <td>{0}</td>\n" +
|
||||||
|
" <td>{1}</td>\n" +
|
||||||
|
" <td>{2}</td>\n" +
|
||||||
|
" <td>调度失败</td>\n" +
|
||||||
|
" </tr>\n" +
|
||||||
|
" <tbody>\n" +
|
||||||
|
"</table>";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* fail alarm
|
||||||
|
*
|
||||||
|
* @param jobLog
|
||||||
|
*/
|
||||||
|
private void failAlarm(XxlJobLog jobLog){
|
||||||
|
|
||||||
|
// send monitor email
|
||||||
|
XxlJobInfo info = XxlJobDynamicScheduler.xxlJobInfoDao.loadById(jobLog.getJobId());
|
||||||
|
if (info!=null && info.getAlarmEmail()!=null && info.getAlarmEmail().trim().length()>0) {
|
||||||
|
|
||||||
|
Set<String> emailSet = new HashSet<String>(Arrays.asList(info.getAlarmEmail().split(",")));
|
||||||
|
for (String email: emailSet) {
|
||||||
|
XxlJobGroup group = XxlJobDynamicScheduler.xxlJobGroupDao.load(Integer.valueOf(info.getJobGroup()));
|
||||||
|
|
||||||
|
String title = "调度中心监控报警";
|
||||||
|
String content = MessageFormat.format(mailBodyTemplate, group!=null?group.getTitle():"null", JobKeyUtil.formatJobKey(info), info.getJobDesc());
|
||||||
|
|
||||||
|
MailUtil.sendMail(email, title, content);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO, custom alarm strategy, such as sms
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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()));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,19 +1,16 @@
|
||||||
package com.xxl.job.admin.core.util;
|
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.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.mail.javamail.JavaMailSenderImpl;
|
|
||||||
import org.springframework.mail.javamail.MimeMessageHelper;
|
|
||||||
|
|
||||||
import javax.mail.internet.MimeMessage;
|
import java.nio.charset.Charset;
|
||||||
import java.io.File;
|
|
||||||
import java.util.Properties;
|
|
||||||
import java.util.concurrent.ExecutorService;
|
|
||||||
import java.util.concurrent.Executors;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 邮件发送.Util
|
* 邮件发送.Util
|
||||||
|
*
|
||||||
* @author xuxueli 2016-3-12 15:06:20
|
* @author xuxueli 2016-3-12 15:06:20
|
||||||
*/
|
*/
|
||||||
public class MailUtil {
|
public class MailUtil {
|
||||||
|
@ -33,89 +30,42 @@ public class MailUtil {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 发送邮件 (完整版) (纯JavaMail)
|
|
||||||
*
|
*
|
||||||
* @param toAddress : 收件人邮箱
|
* @param toAddress 收件人邮箱
|
||||||
* @param mailSubject : 邮件主题
|
* @param mailSubject 邮件主题
|
||||||
* @param mailBody : 邮件正文
|
* @param mailBody 邮件正文
|
||||||
* @param mailBodyIsHtml: 邮件正文格式,true:HTML格式;false:文本格式
|
* @return
|
||||||
* //@param inLineFile : 内嵌文件
|
|
||||||
* @param attachments : 附件
|
|
||||||
*/
|
*/
|
||||||
public static boolean sendMail (String toAddress, String mailSubject, String mailBody,
|
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
|
try {
|
||||||
Properties pro = new Properties();
|
// Create the email message
|
||||||
pro.put("mail.transport.protocol", "smtp");
|
HtmlEmail email = new HtmlEmail();
|
||||||
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)
|
//email.setDebug(true); // 将会打印一些log
|
||||||
MimeMessage mimeMessage = mailSender.createMimeMessage();
|
//email.setTLS(true); // 是否TLS校验,,某些邮箱需要TLS安全校验,同理有SSL校验
|
||||||
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, ArrayUtils.isNotEmpty(attachments), "UTF-8");
|
//email.setSSL(true);
|
||||||
|
|
||||||
helper.setFrom(username, sendNick);
|
email.setHostName(host);
|
||||||
helper.setTo(toAddress);
|
email.setSmtpPort(Integer.valueOf(port));
|
||||||
|
//email.setSslSmtpPort(port);
|
||||||
|
email.setAuthenticator(new DefaultAuthenticator(username, password));
|
||||||
|
email.setCharset(Charset.defaultCharset().name());
|
||||||
|
|
||||||
helper.setSubject(mailSubject);
|
email.setFrom(username, sendNick);
|
||||||
helper.setText(mailBody, mailBodyIsHtml);
|
email.addTo(toAddress);
|
||||||
|
email.setSubject(mailSubject);
|
||||||
|
email.setMsg(mailBody);
|
||||||
|
|
||||||
// 设置收件人抄送的名片和地址(相当于群发)
|
//email.attach(attachment); // add the attachment
|
||||||
//helper.setCc(InternetAddress.parse(MimeUtility.encodeText("邮箱001") + " <@163.com>," + MimeUtility.encodeText("邮箱002") + " <@foxmail.com>"));
|
|
||||||
|
|
||||||
// 内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源
|
email.send(); // send the email
|
||||||
//helper.addInline(MimeUtility.encodeText(inLineFile.getName()), inLineFile);
|
|
||||||
|
|
||||||
// 添加附件
|
|
||||||
/*if (ArrayUtils.isNotEmpty(attachments)) {
|
|
||||||
for (File file : attachments) {
|
|
||||||
helper.addAttachment(MimeUtility.encodeText(file.getName()), file);
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
|
|
||||||
// 群发
|
|
||||||
//MimeMessage[] mailMessages = { mimeMessage };
|
|
||||||
|
|
||||||
mailSender.send(mimeMessage);
|
|
||||||
return true;
|
return true;
|
||||||
} catch (Exception e) {
|
} catch (EmailException e) {
|
||||||
logger.error(e.getMessage(), e);
|
logger.error(e.getMessage(), e);
|
||||||
|
|
||||||
}
|
}
|
||||||
return false;
|
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 = "<html><head><meta http-equiv="
|
|
||||||
+ "Content-Type"
|
|
||||||
+ " content="
|
|
||||||
+ "text/html; charset=gb2312"
|
|
||||||
+ "></head><body><h1>新书快递通知</h1>你的新书快递申请已推送新书,请到<a href=''>空间"
|
|
||||||
+ "</a>中查看</body></html>";
|
|
||||||
|
|
||||||
sendMail("931591021@qq.com", "测试邮件", mailBody, true, null);
|
|
||||||
System.out.println(total);
|
|
||||||
total++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 = "<h5>监控告警明细:</span>" +
|
||||||
|
"<table border=\"1\" cellpadding=\"3\" style=\"border-collapse:collapse; width:80%;\" >\n" +
|
||||||
|
" <thead style=\"font-weight: bold;color: #ffffff;background-color: #ff8c00;\" >" +
|
||||||
|
" <tr>\n" +
|
||||||
|
" <td>执行器</td>\n" +
|
||||||
|
" <td>JobKey</td>\n" +
|
||||||
|
" <td>任务描述</td>\n" +
|
||||||
|
" <td>告警类型</td>\n" +
|
||||||
|
" </tr>\n" +
|
||||||
|
" <thead/>\n" +
|
||||||
|
" <tbody>\n" +
|
||||||
|
" <tr>\n" +
|
||||||
|
" <td>{0}</td>\n" +
|
||||||
|
" <td>{1}</td>\n" +
|
||||||
|
" <td>{2}</td>\n" +
|
||||||
|
" <td>调度失败</td>\n" +
|
||||||
|
" </tr>\n" +
|
||||||
|
" <tbody>\n" +
|
||||||
|
"</table>";
|
||||||
|
|
||||||
|
mailBodyTemplate = MessageFormat.format(mailBodyTemplate, "1_1", "分组A", "任务A1");
|
||||||
|
|
||||||
|
boolean ret = MailUtil.sendMail("931591021@qq.com", "调度中心监控报警" , mailBodyTemplate);
|
||||||
|
System.out.println(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Loading…
Reference in New Issue