Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
X
XXL-JOB
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
靳帅
XXL-JOB
Commits
1e0ae9e5
提交
1e0ae9e5
authored
3月 12, 2016
作者:
xueli.xue
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
调度失败邮件报警
上级
0f0906ee
隐藏空白字符变更
内嵌
并排
正在显示
9 个修改的文件
包含
288 行增加
和
6 行删除
+288
-6
pom.xml
xxl-job-admin/pom.xml
+7
-0
WebExceptionResolver.java
...com/xxl/job/controller/resolver/WebExceptionResolver.java
+1
-1
JobMonitorHelper.java
...c/main/java/com/xxl/job/core/thread/JobMonitorHelper.java
+82
-0
DynamicSchedulerUtil.java
...main/java/com/xxl/job/core/util/DynamicSchedulerUtil.java
+1
-0
MailUtil.java
...b-admin/src/main/java/com/xxl/job/core/util/MailUtil.java
+181
-0
LocalNomalJobBean.java
.../main/java/com/xxl/job/service/job/LocalNomalJobBean.java
+2
-0
RemoteHttpJobBean.java
.../main/java/com/xxl/job/service/job/RemoteHttpJobBean.java
+2
-0
config.properties
xxl-job-admin/src/main/resources/config.properties
+11
-2
springmvc-context.xml
xxl-job-admin/src/main/resources/springmvc-context.xml
+1
-3
没有找到文件。
xxl-job-admin/pom.xml
浏览文件 @
1e0ae9e5
...
...
@@ -130,6 +130,13 @@
<version>
4.3.6
</version>
</dependency>
<!-- javax.mail -->
<dependency>
<groupId>
javax.mail
</groupId>
<artifactId>
mail
</artifactId>
<version>
1.4.6
</version>
</dependency>
<!-- quartz :quartz-2.2.1/c3p0-0.9.1.1/slf4j-api-1.6.6 -->
<dependency>
<groupId>
org.quartz-scheduler
</groupId>
...
...
xxl-job-admin/src/main/java/com/xxl/job/co
re
/resolver/WebExceptionResolver.java
→
xxl-job-admin/src/main/java/com/xxl/job/co
ntroller
/resolver/WebExceptionResolver.java
浏览文件 @
1e0ae9e5
package
com
.
xxl
.
job
.
co
re
.
resolver
;
package
com
.
xxl
.
job
.
co
ntroller
.
resolver
;
import
javax.servlet.http.HttpServletRequest
;
import
javax.servlet.http.HttpServletResponse
;
...
...
xxl-job-admin/src/main/java/com/xxl/job/core/thread/JobMonitorHelper.java
0 → 100644
浏览文件 @
1e0ae9e5
package
com
.
xxl
.
job
.
core
.
thread
;
import
java.text.MessageFormat
;
import
java.util.concurrent.ConcurrentHashMap
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
java.util.concurrent.LinkedBlockingQueue
;
import
java.util.concurrent.TimeUnit
;
import
org.apache.commons.lang.StringUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
com.xxl.job.client.util.HttpUtil
;
import
com.xxl.job.core.model.XxlJobInfo
;
import
com.xxl.job.core.model.XxlJobLog
;
import
com.xxl.job.core.util.DynamicSchedulerUtil
;
import
com.xxl.job.core.util.MailUtil
;
/**
* job monitor helper
* @author xuxueli 2015-9-1 18:05:56
*/
public
class
JobMonitorHelper
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
JobMonitorHelper
.
class
);
public
static
JobMonitorHelper
helper
=
new
JobMonitorHelper
();
private
ExecutorService
executor
=
Executors
.
newCachedThreadPool
();
private
LinkedBlockingQueue
<
Integer
>
queue
=
new
LinkedBlockingQueue
<
Integer
>(
0xfff8
);
private
ConcurrentHashMap
<
String
,
Integer
>
countMap
=
new
ConcurrentHashMap
<
String
,
Integer
>();
public
JobMonitorHelper
(){
// consumer
executor
.
execute
(
new
Runnable
()
{
@Override
public
void
run
()
{
while
(
true
)
{
logger
.
info
(
">>>>>>>>>>> job monitor run ... "
);
Integer
jobLogId
=
JobMonitorHelper
.
helper
.
queue
.
poll
();
if
(
jobLogId
!=
null
&&
jobLogId
>
0
)
{
XxlJobLog
log
=
DynamicSchedulerUtil
.
xxlJobLogDao
.
load
(
jobLogId
);
if
(
log
!=
null
)
{
if
(
HttpUtil
.
SUCCESS
.
equals
(
log
.
getTriggerStatus
())
&&
StringUtils
.
isBlank
(
log
.
getHandleStatus
()))
{
JobMonitorHelper
.
monitor
(
jobLogId
);
}
if
(
HttpUtil
.
SUCCESS
.
equals
(
log
.
getTriggerStatus
())
&&
HttpUtil
.
SUCCESS
.
equals
(
log
.
getHandleStatus
()))
{
// pass
}
if
(
HttpUtil
.
FAIL
.
equals
(
log
.
getTriggerStatus
())
||
HttpUtil
.
FAIL
.
equals
(
log
.
getHandleStatus
()))
{
String
monotorKey
=
log
.
getJobGroup
().
concat
(
"_"
).
concat
(
log
.
getJobName
());
Integer
count
=
countMap
.
get
(
monotorKey
);
if
(
count
==
null
)
{
count
=
new
Integer
(
0
);
}
count
+=
1
;
countMap
.
put
(
monotorKey
,
count
);
XxlJobInfo
info
=
DynamicSchedulerUtil
.
xxlJobInfoDao
.
load
(
log
.
getJobGroup
(),
log
.
getJobName
());
if
(
count
>=
info
.
getAlarmThreshold
())
{
MailUtil
.
sendMail
(
info
.
getAlarmEmail
(),
"《调度平台中心-监控报警》"
,
MessageFormat
.
format
(
"调度任务[{0}]失败报警"
,
monotorKey
),
false
,
null
);
countMap
.
remove
(
monotorKey
);
}
}
}
}
else
{
try
{
TimeUnit
.
SECONDS
.
sleep
(
20
);
}
catch
(
InterruptedException
e
)
{
e
.
printStackTrace
();
}
}
}
}
});
}
// producer
public
static
void
monitor
(
int
jobLogId
){
JobMonitorHelper
.
helper
.
queue
.
offer
(
jobLogId
);
}
}
xxl-job-admin/src/main/java/com/xxl/job/core/util/DynamicSchedulerUtil.java
浏览文件 @
1e0ae9e5
...
...
@@ -67,6 +67,7 @@ public final class DynamicSchedulerUtil implements ApplicationContextAware, Init
}
// getJobKeys
@Deprecated
public
static
List
<
Map
<
String
,
Object
>>
getJobList
(){
List
<
Map
<
String
,
Object
>>
jobList
=
new
ArrayList
<
Map
<
String
,
Object
>>();
...
...
xxl-job-admin/src/main/java/com/xxl/job/core/util/MailUtil.java
0 → 100644
浏览文件 @
1e0ae9e5
package
com
.
xxl
.
job
.
core
.
util
;
import
java.io.File
;
import
java.util.Properties
;
import
java.util.concurrent.ExecutorService
;
import
java.util.concurrent.Executors
;
import
javax.mail.internet.MimeMessage
;
import
javax.mail.internet.MimeUtility
;
import
org.apache.commons.lang.ArrayUtils
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.mail.javamail.JavaMailSender
;
import
org.springframework.mail.javamail.JavaMailSenderImpl
;
import
org.springframework.mail.javamail.MimeMessageHelper
;
/**
* 邮件发送.Util
* @author xuxueli 2016-3-12 15:06:20
*/
public
class
MailUtil
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
MailUtil
.
class
);
private
static
String
host
;
private
static
String
port
;
private
static
String
username
;
private
static
String
password
;
private
static
String
sendFrom
;
private
static
String
sendNick
;
static
{
host
=
PropertiesUtil
.
getString
(
"mail.host"
);
port
=
PropertiesUtil
.
getString
(
"mail.port"
);
username
=
PropertiesUtil
.
getString
(
"mail.username"
);
password
=
PropertiesUtil
.
getString
(
"mail.password"
);
sendFrom
=
PropertiesUtil
.
getString
(
"mail.sendFrom"
);
sendNick
=
PropertiesUtil
.
getString
(
"mail.sendNick"
);
}
/**
<!-- spring mail sender -->
<bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl" scope="singleton" >
<property name="host" value="${mail.host}" /> <!-- SMTP发送邮件的服务器的IP和端口 -->
<property name="port" value="${mail.port}" />
<property name="username" value="${mail.username}" /> <!-- 登陆SMTP邮件发送服务器的用户名和密码 -->
<property name="password" value="${mail.password}" />
<property name="javaMailProperties"> <!-- 获得邮件会话属性,验证登录邮件服务器是否成功 -->
<props>
<prop key="mail.smtp.auth">true</prop>
<prop key="prop">true</prop>
<!-- <prop key="mail.smtp.timeout">25000</prop> -->
</props>
</property>
</bean>
*/
/**
* 发送邮件 (完整版)(结合Spring)
*
* @param javaMailSender: 发送Bean
* @param sendFrom : 发送人邮箱
* @param sendNick : 发送人昵称
* @param toAddress : 收件人邮箱
* @param mailSubject : 邮件主题
* @param mailBody : 邮件正文
* @param mailBodyIsHtml: 邮件正文格式,true:HTML格式;false:文本格式
* @param files[] : 附件
*/
@SuppressWarnings
(
"null"
)
public
static
boolean
sendMailSpring
(
String
toAddress
,
String
mailSubject
,
String
mailBody
,
boolean
mailBodyIsHtml
,
File
[]
attachments
)
{
JavaMailSender
javaMailSender
=
null
;
//ResourceBundle.getInstance().getJavaMailSender();
try
{
MimeMessage
mimeMessage
=
javaMailSender
.
createMimeMessage
();
MimeMessageHelper
helper
=
new
MimeMessageHelper
(
mimeMessage
,
ArrayUtils
.
isNotEmpty
(
attachments
),
"UTF-8"
);
// 设置utf-8或GBK编码,否则邮件会有乱码;multipart,true表示文件上传
helper
.
setFrom
(
sendFrom
,
sendNick
);
helper
.
setTo
(
toAddress
);
// 设置收件人抄送的名片和地址(相当于群发了)
//helper.setCc(InternetAddress.parse(MimeUtility.encodeText("邮箱001") + " <@163.com>," + MimeUtility.encodeText("邮箱002") + " <@foxmail.com>"));
helper
.
setSubject
(
mailSubject
);
helper
.
setText
(
mailBody
,
mailBodyIsHtml
);
// 添加附件
if
(
ArrayUtils
.
isNotEmpty
(
attachments
))
{
for
(
File
file
:
attachments
)
{
helper
.
addAttachment
(
MimeUtility
.
encodeText
(
file
.
getName
()),
file
);
}
}
// 群发
//MimeMessage[] mailMessages = { mimeMessage };
javaMailSender
.
send
(
mimeMessage
);
return
true
;
}
catch
(
Exception
e
)
{
logger
.
info
(
"{}"
,
e
);
}
return
false
;
}
/**
* 发送邮件 (完整版) (纯JavaMail)
*
* @param toAddress : 收件人邮箱
* @param mailSubject : 邮件主题
* @param mailBody : 邮件正文
* @param mailBodyIsHtml: 邮件正文格式,true:HTML格式;false:文本格式
* @param inLineFile : 内嵌文件
* @param files[] : 附件
*/
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
=
System
.
getProperties
();
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
(
sendFrom
,
sendNick
);
helper
.
setTo
(
toAddress
);
helper
.
setSubject
(
mailSubject
);
helper
.
setText
(
mailBody
,
mailBodyIsHtml
);
// 添加内嵌文件,第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
);
}
}
mailSender
.
send
(
mimeMessage
);
return
true
;
}
catch
(
Exception
e
)
{
e
.
printStackTrace
();
}
return
false
;
}
static
int
total
=
0
;
public
static
void
main
(
String
[]
args
)
{
ExecutorService
exec
=
Executors
.
newCachedThreadPool
();
for
(
int
i
=
0
;
i
<
20
;
i
++)
{
exec
.
execute
(
new
Thread
(
new
Runnable
()
{
@Override
public
void
run
()
{
while
(
total
<
10
){
String
mailBody
=
"<html><head><meta http-equiv="
+
"Content-Type"
+
" content="
+
"text/html; charset=gb2312"
+
"></head><body><h1>新书快递通知</h1>你的新书快递申请已推送新书,请到<a href=''>空间"
+
"</a>中查看</body></html>"
;
sendMail
(
"ovono802302@163.com"
,
"测试邮件"
,
mailBody
,
false
,
null
);
System
.
out
.
println
(
total
);
total
++;
}
}
}));
}
}
}
xxl-job-admin/src/main/java/com/xxl/job/service/job/LocalNomalJobBean.java
浏览文件 @
1e0ae9e5
...
...
@@ -19,6 +19,7 @@ import com.xxl.job.client.util.HttpUtil;
import
com.xxl.job.client.util.JacksonUtil
;
import
com.xxl.job.core.model.XxlJobInfo
;
import
com.xxl.job.core.model.XxlJobLog
;
import
com.xxl.job.core.thread.JobMonitorHelper
;
import
com.xxl.job.core.util.DynamicSchedulerUtil
;
/**
...
...
@@ -81,6 +82,7 @@ public abstract class LocalNomalJobBean extends QuartzJobBean {
// update trigger info
DynamicSchedulerUtil
.
xxlJobLogDao
.
updateTriggerInfo
(
jobLog
);
DynamicSchedulerUtil
.
xxlJobLogDao
.
updateHandleInfo
(
jobLog
);
JobMonitorHelper
.
monitor
(
jobLog
.
getId
());
logger
.
info
(
">>>>>>>>>>> xxl-job trigger end, jobLog.id:{}, jobLog:{}"
,
jobLog
.
getId
(),
jobLog
);
}
...
...
xxl-job-admin/src/main/java/com/xxl/job/service/job/RemoteHttpJobBean.java
浏览文件 @
1e0ae9e5
...
...
@@ -18,6 +18,7 @@ import com.xxl.job.client.util.HttpUtil;
import
com.xxl.job.client.util.JacksonUtil
;
import
com.xxl.job.core.model.XxlJobInfo
;
import
com.xxl.job.core.model.XxlJobLog
;
import
com.xxl.job.core.thread.JobMonitorHelper
;
import
com.xxl.job.core.util.DynamicSchedulerUtil
;
import
com.xxl.job.core.util.PropertiesUtil
;
...
...
@@ -85,6 +86,7 @@ public class RemoteHttpJobBean extends QuartzJobBean {
// update trigger info
DynamicSchedulerUtil
.
xxlJobLogDao
.
updateTriggerInfo
(
jobLog
);
JobMonitorHelper
.
monitor
(
jobLog
.
getId
());
logger
.
info
(
">>>>>>>>>>> xxl-job trigger end, jobLog.id:{}, jobLog:{}"
,
jobLog
.
getId
(),
jobLog
);
}
...
...
xxl-job-admin/src/main/resources/config.properties
浏览文件 @
1e0ae9e5
trigger_log_url
=
http://localhost:8080/joblog/save
\ No newline at end of file
# for trigger log callback
trigger_log_url
=
http://localhost:8080/joblog/save
# for email
mail.host
=
smtp.163.com
mail.port
=
25
mail.username
=
ovono802302@163.com
mail.password
=
asdfzxcv
mail.sendFrom
=
ovono802302@163.com
mail.sendNick
=
《任务调度中心xxl-job》
\ No newline at end of file
xxl-job-admin/src/main/resources/springmvc-context.xml
浏览文件 @
1e0ae9e5
...
...
@@ -38,7 +38,7 @@
<property
name=
"order"
value=
"0"
/>
</bean>
<bean
id=
"exceptionResolver"
class=
"com.xxl.job.co
re
.resolver.WebExceptionResolver"
/>
<bean
id=
"exceptionResolver"
class=
"com.xxl.job.co
ntroller
.resolver.WebExceptionResolver"
/>
<!--
// 自定义拦截器,支持SSO登陆拦截
...
...
@@ -48,7 +48,6 @@
<bean class="com.xxl.controller.interceptor.PermissionInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
<bean id="exceptionResolver" class="com.xxl.controller.resolver.WebExceptionResolver" />
-->
</beans>
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论