Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenDocCN
xxl-job
提交
2f2ed563
X
xxl-job
项目概览
OpenDocCN
/
xxl-job
通知
11
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
X
xxl-job
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
2f2ed563
编写于
12月 22, 2017
作者:
许雪里
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
告警邮件样式优化;邮件组件调整为commons-email简化邮件操作;
上级
ecd9a47f
变更
7
显示空白变更内容
内联
并排
Showing
7 changed file
with
155 addition
and
107 deletion
+155
-107
doc/XXL-JOB官方文档.md
doc/XXL-JOB官方文档.md
+1
-0
pom.xml
pom.xml
+1
-0
xxl-job-admin/pom.xml
xxl-job-admin/pom.xml
+4
-4
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
...a/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
+48
-19
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java
...src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java
+23
-0
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java
...n/src/main/java/com/xxl/job/admin/core/util/MailUtil.java
+34
-84
xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java
...dmin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java
+44
-0
未找到文件。
doc/XXL-JOB官方文档.md
浏览文件 @
2f2ed563
...
...
@@ -1079,6 +1079,7 @@ Tips: 历史版本(V1.3.x)目前已经Release至稳定版本, 进入维护阶段
-
14、失败重试:调度中心调度失败且启用"失败重试"策略时,将会自动重试一次;执行器执行失败且回调失败重试状态时,也将会自动重试一次;
-
15、Log地址格式兼容,支持非"/"结尾路径配置;
-
16、JobHandler提供init/destroy方法,支持在JobHandler初始化和销毁时进行附加操作;
-
17、告警邮件样式优化;邮件组件调整为commons-email简化邮件操作;
### TODO LIST
...
...
pom.xml
浏览文件 @
2f2ed563
...
...
@@ -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>
...
...
xxl-job-admin/pom.xml
浏览文件 @
2f2ed563
...
...
@@ -124,11 +124,11 @@
<version>
${httpclient.version}
</version>
</dependency>
<!--
javax.
mail -->
<!--
commons-e
mail -->
<dependency>
<groupId>
javax.mail
</groupId>
<artifactId>
mail
</artifactId>
<version>
${mail.version}
</version>
<groupId>
org.apache.commons
</groupId>
<artifactId>
commons-e
mail
</artifactId>
<version>
${
commons-e
mail.version}
</version>
</dependency>
<!-- quartz :quartz-2.2.3/c3p0-0.9.1.1/slf4j-api-1.6.6 -->
...
...
xxl-job-admin/src/main/java/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
浏览文件 @
2f2ed563
...
...
@@ -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,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
=
"<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
*
...
...
@@ -110,31 +153,17 @@ public class JobFailMonitorHelper {
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
}
String
title
=
"调度中心监控报警"
;
String
content
=
MessageFormat
.
format
(
mailBodyTemplate
,
group
!=
null
?
group
.
getTitle
():
"null"
,
JobKeyUtil
.
formatJobKey
(
info
),
info
.
getJobDesc
());
public
void
toStop
(){
toStop
=
true
;
// interrupt and wait
monitorThread
.
interrupt
();
try
{
monitorThread
.
join
();
}
catch
(
InterruptedException
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
MailUtil
.
sendMail
(
email
,
title
,
content
);
}
}
// producer
public
static
void
monitor
(
int
jobLogId
){
getInstance
().
queue
.
offer
(
jobLogId
);
// TODO, custom alarm strategy, such as sms
}
}
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java
0 → 100644
浏览文件 @
2f2ed563
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
()));
}
}
xxl-job-admin/src/main/java/com/xxl/job/admin/core/util/MailUtil.java
浏览文件 @
2f2ed563
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"
);
public
static
boolean
sendMail
(
String
toAddress
,
String
mailSubject
,
String
mailBody
){
helper
.
setFrom
(
username
,
sendNick
);
helper
.
setTo
(
toAddress
);
helper
.
setSubject
(
mailSubject
);
helper
.
setText
(
mailBody
,
mailBodyIsHtml
);
try
{
// Create the email message
HtmlEmail
email
=
new
HtmlEmail
();
// 设置收件人抄送的名片和地址(相当于群发)
//helper.setCc(InternetAddress.parse(MimeUtility.encodeText("邮箱001") + " <@163.com>," + MimeUtility.encodeText("邮箱002") + " <@foxmail.com>"));
//email.setDebug(true); // 将会打印一些log
//email.setTLS(true); // 是否TLS校验,,某些邮箱需要TLS安全校验,同理有SSL校验
//email.setSSL(true);
// 内嵌文件,第1个参数为cid标识这个文件,第2个参数为资源
//helper.addInline(MimeUtility.encodeText(inLineFile.getName()), inLineFile);
email
.
setHostName
(
host
);
email
.
setSmtpPort
(
Integer
.
valueOf
(
port
));
//email.setSslSmtpPort(port);
email
.
setAuthenticator
(
new
DefaultAuthenticator
(
username
,
password
));
email
.
setCharset
(
Charset
.
defaultCharset
().
name
());
// 添加附件
/*if (ArrayUtils.isNotEmpty(attachments)) {
for (File file : attachments) {
helper.addAttachment(MimeUtility.encodeText(file.getName()), file);
}
}*/
email
.
setFrom
(
username
,
sendNick
);
email
.
addTo
(
toAddress
);
email
.
setSubject
(
mailSubject
);
email
.
setMsg
(
mailBody
);
// 群发
//MimeMessage[] mailMessages = { mimeMessage };
//email.attach(attachment); // add the attachment
mailSender
.
send
(
mimeMessage
);
email
.
send
();
// send the email
return
true
;
}
catch
(
Exception
e
)
{
}
catch
(
E
mailE
xception
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
++;
}
}
}));
}
return
false
;
}
}
xxl-job-admin/src/test/java/com/xxl/job/dao/impl/MailUtilTest.java
0 → 100644
浏览文件 @
2f2ed563
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
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录