告警邮件样式优化;邮件组件调整为commons-email简化邮件操作;
This commit is contained in:
parent
ecd9a47fb8
commit
2f2ed56348
|
@ -1079,6 +1079,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
|
|||
- 14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次;
|
||||
- 15、Log地址格式兼容,支持非"/"结尾路径配置;
|
||||
- 16、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作;
|
||||
- 17、告警邮件样式优化;邮件组件调整为commons-email简化邮件操作;
|
||||
|
||||
|
||||
### TODO LIST
|
||||
|
|
1
pom.xml
1
pom.xml
|
@ -34,6 +34,7 @@
|
|||
<commons-exec.version>1.3</commons-exec.version>
|
||||
<commons-beanutils.version>1.9.2</commons-beanutils.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>
|
||||
<mysql-connector-java.version>5.1.29</mysql-connector-java.version>
|
||||
|
|
|
@ -124,11 +124,11 @@
|
|||
<version>${httpclient.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- javax.mail -->
|
||||
<!-- commons-email -->
|
||||
<dependency>
|
||||
<groupId>javax.mail</groupId>
|
||||
<artifactId>mail</artifactId>
|
||||
<version>${mail.version}</version>
|
||||
<groupId>org.apache.commons</groupId>
|
||||
<artifactId>commons-email</artifactId>
|
||||
<version>${commons-email.version}</version>
|
||||
</dependency>
|
||||
|
||||
<!-- 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.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<Integer> queue = new LinkedBlockingQueue<Integer>(0xfff8);
|
||||
|
||||
private Thread monitorThread;
|
||||
|
@ -97,30 +100,6 @@ public class JobFailMonitorHelper {
|
|||
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(){
|
||||
toStop = true;
|
||||
// interrupt and wait
|
||||
|
@ -137,4 +116,54 @@ public class JobFailMonitorHelper {
|
|||
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;
|
||||
|
||||
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); // 发送者邮箱的密码
|
||||
public static boolean sendMail(String toAddress, String mailSubject, String mailBody){
|
||||
|
||||
// 配置文件,用于实例化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);
|
||||
try {
|
||||
// Create the email message
|
||||
HtmlEmail email = new HtmlEmail();
|
||||
|
||||
// 创建多元化邮件 (创建 mimeMessage 帮助类,用于封装信息至 mimeMessage)
|
||||
MimeMessage mimeMessage = mailSender.createMimeMessage();
|
||||
MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, ArrayUtils.isNotEmpty(attachments), "UTF-8");
|
||||
//email.setDebug(true); // 将会打印一些log
|
||||
//email.setTLS(true); // 是否TLS校验,,某些邮箱需要TLS安全校验,同理有SSL校验
|
||||
//email.setSSL(true);
|
||||
|
||||
helper.setFrom(username, sendNick);
|
||||
helper.setTo(toAddress);
|
||||
email.setHostName(host);
|
||||
email.setSmtpPort(Integer.valueOf(port));
|
||||
//email.setSslSmtpPort(port);
|
||||
email.setAuthenticator(new DefaultAuthenticator(username, password));
|
||||
email.setCharset(Charset.defaultCharset().name());
|
||||
|
||||
helper.setSubject(mailSubject);
|
||||
helper.setText(mailBody, mailBodyIsHtml);
|
||||
email.setFrom(username, sendNick);
|
||||
email.addTo(toAddress);
|
||||
email.setSubject(mailSubject);
|
||||
email.setMsg(mailBody);
|
||||
|
||||
// 设置收件人抄送的名片和地址(相当于群发)
|
||||
//helper.setCc(InternetAddress.parse(MimeUtility.encodeText("邮箱001") + " <@163.com>," + MimeUtility.encodeText("邮箱002") + " <@foxmail.com>"));
|
||||
//email.attach(attachment); // add the attachment
|
||||
|
||||
// 内嵌文件,第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);
|
||||
}
|
||||
}*/
|
||||
|
||||
// 群发
|
||||
//MimeMessage[] mailMessages = { mimeMessage };
|
||||
|
||||
mailSender.send(mimeMessage);
|
||||
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 = "<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