Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
X
XXL-JOB
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
靳帅
XXL-JOB
Commits
2f2ed563
提交
2f2ed563
authored
12月 22, 2017
作者:
xuxueli
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
告警邮件样式优化;邮件组件调整为commons-email简化邮件操作;
上级
ecd9a47f
隐藏空白字符变更
内嵌
并排
正在显示
7 个修改的文件
包含
155 行增加
和
107 行删除
+155
-107
XXL-JOB官方文档.md
doc/XXL-JOB官方文档.md
+1
-0
pom.xml
pom.xml
+1
-0
pom.xml
xxl-job-admin/pom.xml
+4
-4
JobFailMonitorHelper.java
...a/com/xxl/job/admin/core/thread/JobFailMonitorHelper.java
+48
-19
JobKeyUtil.java
...src/main/java/com/xxl/job/admin/core/util/JobKeyUtil.java
+23
-0
MailUtil.java
...n/src/main/java/com/xxl/job/admin/core/util/MailUtil.java
+34
-84
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,10 +153,12 @@ 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
);
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
);
}
}
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"
);
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
(
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
++;
}
}
}));
}
}
}
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
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论