Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
X
XXL-JOB
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
靳帅
XXL-JOB
Commits
09d89524
提交
09d89524
authored
7月 30, 2017
作者:
xuxueli
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
执行器参数配置逻辑重构
上级
1bc5cc76
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
95 行增加
和
78 行删除
+95
-78
XxlJobExecutor.java
...c/main/java/com/xxl/job/core/executor/XxlJobExecutor.java
+63
-61
GlueFactory.java
...core/src/main/java/com/xxl/job/core/glue/GlueFactory.java
+5
-5
ScriptJobHandler.java
.../java/com/xxl/job/core/handler/impl/ScriptJobHandler.java
+3
-4
XxlJobFileAppender.java
...rc/main/java/com/xxl/job/core/log/XxlJobFileAppender.java
+5
-5
JettyServer.java
...com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java
+17
-1
ScriptUtil.java
...-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java
+2
-2
没有找到文件。
xxl-job-core/src/main/java/com/xxl/job/core/executor/XxlJobExecutor.java
浏览文件 @
09d89524
...
...
@@ -5,19 +5,15 @@ import com.xxl.job.core.biz.ExecutorBiz;
import
com.xxl.job.core.biz.impl.ExecutorBizImpl
;
import
com.xxl.job.core.handler.IJobHandler
;
import
com.xxl.job.core.handler.annotation.JobHander
;
import
com.xxl.job.core.log.XxlJobFileAppender
;
import
com.xxl.job.core.rpc.netcom.NetComClientProxy
;
import
com.xxl.job.core.rpc.netcom.NetComServerFactory
;
import
com.xxl.job.core.thread.ExecutorRegistryThread
;
import
com.xxl.job.core.thread.JobThread
;
import
com.xxl.job.core.thread.TriggerCallbackThread
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.BeansException
;
import
org.springframework.context.ApplicationContext
;
import
org.springframework.context.ApplicationContextAware
;
import
org.springframework.context.ApplicationEvent
;
import
org.springframework.context.ApplicationListener
;
import
org.springframework.context.event.ContextClosedEvent
;
import
java.util.ArrayList
;
import
java.util.List
;
...
...
@@ -27,15 +23,16 @@ import java.util.concurrent.ConcurrentHashMap;
/**
* Created by xuxueli on 2016/3/2 21:14.
*/
public
class
XxlJobExecutor
implements
ApplicationContextAware
,
ApplicationListener
{
public
class
XxlJobExecutor
implements
ApplicationContextAware
{
private
static
final
Logger
logger
=
LoggerFactory
.
getLogger
(
XxlJobExecutor
.
class
);
// ---------------------------------- param ------------------------------------
private
String
ip
;
private
int
port
=
9999
;
private
String
appName
;
private
String
adminAddresses
;
private
String
accessToken
;
p
ublic
static
String
logPath
=
"/data/applogs/xxl-job/jobhandler/"
;
p
rivate
String
logPath
;
public
void
setIp
(
String
ip
)
{
this
.
ip
=
ip
;
...
...
@@ -56,6 +53,48 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
this
.
logPath
=
logPath
;
}
// ---------------------------------- applicationContext ------------------------------------
private
static
ApplicationContext
applicationContext
;
@Override
public
void
setApplicationContext
(
ApplicationContext
applicationContext
)
throws
BeansException
{
this
.
applicationContext
=
applicationContext
;
}
public
static
ApplicationContext
getApplicationContext
()
{
return
applicationContext
;
}
// ---------------------------------- start + stop ------------------------------------
public
void
start
()
throws
Exception
{
// init admin-client
initAdminBizList
(
adminAddresses
,
accessToken
);
// init executor-jobHandlerRepository
initJobHandlerRepository
(
applicationContext
);
// init logpath
if
(
logPath
!=
null
&&
logPath
.
trim
().
length
()>
0
)
{
XxlJobFileAppender
.
logPath
=
logPath
;
}
// init executor-server
initExecutorServer
();
}
public
void
destroy
(){
// destory JobThreadRepository
if
(
JobThreadRepository
.
size
()
>
0
)
{
for
(
Map
.
Entry
<
Integer
,
JobThread
>
item:
JobThreadRepository
.
entrySet
())
{
removeJobThread
(
item
.
getKey
(),
"Web容器销毁终止"
);
}
JobThreadRepository
.
clear
();
}
// destory executor-server
stopExecutorServer
();
}
// ---------------------------------- admin-client ------------------------------------
private
static
List
<
AdminBiz
>
adminBizList
;
private
static
void
initAdminBizList
(
String
adminAddresses
,
String
accessToken
)
throws
Exception
{
...
...
@@ -76,49 +115,29 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
return
adminBizList
;
}
// ---------------------------------- job server ------------------------------------
private
NetComServerFactory
serverFactory
=
new
NetComServerFactory
();
public
void
start
()
throws
Exception
{
// init admin-client
initAdminBizList
(
adminAddresses
,
accessToken
);
// executor start
// ---------------------------------- executor-server ------------------------------------
private
NetComServerFactory
serverFactory
=
new
NetComServerFactory
();
private
void
initExecutorServer
()
throws
Exception
{
NetComServerFactory
.
putService
(
ExecutorBiz
.
class
,
new
ExecutorBizImpl
());
// rpc-service, base on jetty
NetComServerFactory
.
setAccessToken
(
accessToken
);
serverFactory
.
start
(
port
,
ip
,
appName
);
// trigger callback thread start
TriggerCallbackThread
.
getInstance
().
start
();
serverFactory
.
start
(
port
,
ip
,
appName
);
// jetty + registry
}
public
void
destroy
(){
// 1、executor registry thread stop
ExecutorRegistryThread
.
getInstance
().
toStop
();
// 2、executor stop
serverFactory
.
destroy
();
// 3、job thread repository destory
if
(
JobThreadRepository
.
size
()
>
0
)
{
for
(
Map
.
Entry
<
Integer
,
JobThread
>
item:
JobThreadRepository
.
entrySet
())
{
JobThread
jobThread
=
item
.
getValue
();
jobThread
.
toStop
(
"Web容器销毁终止"
);
jobThread
.
interrupt
();
}
JobThreadRepository
.
clear
();
}
// 4、trigger callback thread stop
TriggerCallbackThread
.
getInstance
().
toStop
();
private
void
stopExecutorServer
()
{
serverFactory
.
destroy
();
// jetty + registry + callback
}
// ---------------------------------- init job handler ------------------------------------
public
static
ApplicationContext
applicationContext
;
@Override
public
void
setApplicationContext
(
ApplicationContext
applicationContext
)
throws
BeansException
{
XxlJobExecutor
.
applicationContext
=
applicationContext
;
// ---------------------------------- job handler repository ------------------------------------
private
static
ConcurrentHashMap
<
String
,
IJobHandler
>
jobHandlerRepository
=
new
ConcurrentHashMap
<
String
,
IJobHandler
>();
public
static
IJobHandler
registJobHandler
(
String
name
,
IJobHandler
jobHandler
){
logger
.
info
(
"xxl-job register jobhandler success, name:{}, jobHandler:{}"
,
name
,
jobHandler
);
return
jobHandlerRepository
.
put
(
name
,
jobHandler
);
}
public
static
IJobHandler
loadJobHandler
(
String
name
){
return
jobHandlerRepository
.
get
(
name
);
}
private
static
void
initJobHandlerRepository
(
ApplicationContext
applicationContext
){
// init job handler action
Map
<
String
,
Object
>
serviceBeanMap
=
applicationContext
.
getBeansWithAnnotation
(
JobHander
.
class
);
...
...
@@ -134,27 +153,10 @@ public class XxlJobExecutor implements ApplicationContextAware, ApplicationListe
}
}
}
}
// ---------------------------------- destory job executor ------------------------------------
@Override
public
void
onApplicationEvent
(
ApplicationEvent
applicationEvent
)
{
if
(
applicationEvent
instanceof
ContextClosedEvent
){
// TODO
}
}
// ---------------------------------- job handler repository
private
static
ConcurrentHashMap
<
String
,
IJobHandler
>
jobHandlerRepository
=
new
ConcurrentHashMap
<
String
,
IJobHandler
>();
public
static
IJobHandler
registJobHandler
(
String
name
,
IJobHandler
jobHandler
){
logger
.
info
(
"xxl-job register jobhandler success, name:{}, jobHandler:{}"
,
name
,
jobHandler
);
return
jobHandlerRepository
.
put
(
name
,
jobHandler
);
}
public
static
IJobHandler
loadJobHandler
(
String
name
){
return
jobHandlerRepository
.
get
(
name
);
}
// ---------------------------------- job thread repository
// ---------------------------------- job thread repository
------------------------------------
private
static
ConcurrentHashMap
<
Integer
,
JobThread
>
JobThreadRepository
=
new
ConcurrentHashMap
<
Integer
,
JobThread
>();
public
static
JobThread
registJobThread
(
int
jobId
,
IJobHandler
handler
,
String
removeOldReason
){
JobThread
newJobThread
=
new
JobThread
(
jobId
,
handler
);
...
...
xxl-job-core/src/main/java/com/xxl/job/core/glue/GlueFactory.java
浏览文件 @
09d89524
...
...
@@ -52,21 +52,21 @@ public class GlueFactory {
try
{
Resource
resource
=
AnnotationUtils
.
getAnnotation
(
field
,
Resource
.
class
);
if
(
resource
.
name
()!=
null
&&
resource
.
name
().
length
()>
0
){
fieldBean
=
XxlJobExecutor
.
applicationContext
.
getBean
(
resource
.
name
());
fieldBean
=
XxlJobExecutor
.
getApplicationContext
()
.
getBean
(
resource
.
name
());
}
else
{
fieldBean
=
XxlJobExecutor
.
applicationContext
.
getBean
(
field
.
getName
());
fieldBean
=
XxlJobExecutor
.
getApplicationContext
()
.
getBean
(
field
.
getName
());
}
}
catch
(
Exception
e
)
{
}
if
(
fieldBean
==
null
)
{
fieldBean
=
XxlJobExecutor
.
applicationContext
.
getBean
(
field
.
getType
());
fieldBean
=
XxlJobExecutor
.
getApplicationContext
()
.
getBean
(
field
.
getType
());
}
}
else
if
(
AnnotationUtils
.
getAnnotation
(
field
,
Autowired
.
class
)
!=
null
)
{
Qualifier
qualifier
=
AnnotationUtils
.
getAnnotation
(
field
,
Qualifier
.
class
);
if
(
qualifier
!=
null
&&
qualifier
.
value
()!=
null
&&
qualifier
.
value
().
length
()>
0
)
{
fieldBean
=
XxlJobExecutor
.
applicationContext
.
getBean
(
qualifier
.
value
());
fieldBean
=
XxlJobExecutor
.
getApplicationContext
()
.
getBean
(
qualifier
.
value
());
}
else
{
fieldBean
=
XxlJobExecutor
.
applicationContext
.
getBean
(
field
.
getType
());
fieldBean
=
XxlJobExecutor
.
getApplicationContext
()
.
getBean
(
field
.
getType
());
}
}
...
...
xxl-job-core/src/main/java/com/xxl/job/core/handler/impl/ScriptJobHandler.java
浏览文件 @
09d89524
package
com
.
xxl
.
job
.
core
.
handler
.
impl
;
import
com.xxl.job.core.biz.model.ReturnT
;
import
com.xxl.job.core.executor.XxlJobExecutor
;
import
com.xxl.job.core.glue.GlueTypeEnum
;
import
com.xxl.job.core.handler.IJobHandler
;
import
com.xxl.job.core.log.XxlJobFileAppender
;
...
...
@@ -37,17 +36,17 @@ public class ScriptJobHandler extends IJobHandler {
String
scriptFileName
=
null
;
if
(
GlueTypeEnum
.
GLUE_SHELL
==
glueType
)
{
cmd
=
"bash"
;
scriptFileName
=
XxlJob
Executo
r
.
logPath
.
concat
(
"gluesource/"
).
concat
(
String
.
valueOf
(
jobId
)).
concat
(
"_"
).
concat
(
String
.
valueOf
(
glueUpdatetime
)).
concat
(
".sh"
);
scriptFileName
=
XxlJob
FileAppende
r
.
logPath
.
concat
(
"gluesource/"
).
concat
(
String
.
valueOf
(
jobId
)).
concat
(
"_"
).
concat
(
String
.
valueOf
(
glueUpdatetime
)).
concat
(
".sh"
);
}
else
if
(
GlueTypeEnum
.
GLUE_PYTHON
==
glueType
)
{
cmd
=
"python"
;
scriptFileName
=
XxlJob
Executo
r
.
logPath
.
concat
(
"gluesource/"
).
concat
(
String
.
valueOf
(
jobId
)).
concat
(
"_"
).
concat
(
String
.
valueOf
(
glueUpdatetime
)).
concat
(
".py"
);
scriptFileName
=
XxlJob
FileAppende
r
.
logPath
.
concat
(
"gluesource/"
).
concat
(
String
.
valueOf
(
jobId
)).
concat
(
"_"
).
concat
(
String
.
valueOf
(
glueUpdatetime
)).
concat
(
".py"
);
}
// make script file
ScriptUtil
.
markScriptFile
(
scriptFileName
,
gluesource
);
// log file
String
logFileName
=
XxlJob
Executo
r
.
logPath
.
concat
(
XxlJobFileAppender
.
contextHolder
.
get
());
String
logFileName
=
XxlJob
FileAppende
r
.
logPath
.
concat
(
XxlJobFileAppender
.
contextHolder
.
get
());
// invoke
XxlJobLogger
.
log
(
"----------- script file:"
+
scriptFileName
+
" -----------"
);
...
...
xxl-job-core/src/main/java/com/xxl/job/core/log/XxlJobFileAppender.java
浏览文件 @
09d89524
package
com
.
xxl
.
job
.
core
.
log
;
import
com.xxl.job.core.biz.model.LogResult
;
import
com.xxl.job.core.executor.XxlJobExecutor
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
...
...
@@ -20,7 +19,8 @@ public class XxlJobFileAppender {
//public static ThreadLocal<String> contextHolder = new ThreadLocal<String>();
public
static
final
InheritableThreadLocal
<
String
>
contextHolder
=
new
InheritableThreadLocal
<
String
>();
public
static
final
SimpleDateFormat
sdf
=
new
SimpleDateFormat
(
"yyyy-MM-dd"
);
public
static
String
logPath
=
"/data/applogs/xxl-job/jobhandler/"
;
/**
* log filename: yyyy-MM-dd/9999.log
*
...
...
@@ -31,7 +31,7 @@ public class XxlJobFileAppender {
public
static
String
makeLogFileName
(
Date
triggerDate
,
int
logId
)
{
// filePath/
File
filePathDir
=
new
File
(
XxlJobExecutor
.
logPath
);
File
filePathDir
=
new
File
(
logPath
);
if
(!
filePathDir
.
exists
())
{
filePathDir
.
mkdirs
();
}
...
...
@@ -66,7 +66,7 @@ public class XxlJobFileAppender {
if
(
logFileName
==
null
||
logFileName
.
trim
().
length
()==
0
)
{
return
;
}
File
logFile
=
new
File
(
XxlJobExecutor
.
logPath
,
logFileName
);
File
logFile
=
new
File
(
logPath
,
logFileName
);
if
(!
logFile
.
exists
())
{
try
{
...
...
@@ -111,7 +111,7 @@ public class XxlJobFileAppender {
if
(
logFileName
==
null
||
logFileName
.
trim
().
length
()==
0
)
{
return
new
LogResult
(
fromLineNum
,
0
,
"readLog fail, logFile not found"
,
true
);
}
File
logFile
=
new
File
(
XxlJobExecutor
.
logPath
,
logFileName
);
File
logFile
=
new
File
(
logPath
,
logFileName
);
if
(!
logFile
.
exists
())
{
return
new
LogResult
(
fromLineNum
,
0
,
"readLog fail, logFile not exists"
,
true
);
...
...
xxl-job-core/src/main/java/com/xxl/job/core/rpc/netcom/jetty/server/JettyServer.java
浏览文件 @
09d89524
package
com
.
xxl
.
job
.
core
.
rpc
.
netcom
.
jetty
.
server
;
import
com.xxl.job.core.thread.ExecutorRegistryThread
;
import
com.xxl.job.core.thread.TriggerCallbackThread
;
import
org.eclipse.jetty.server.Connector
;
import
org.eclipse.jetty.server.Handler
;
import
org.eclipse.jetty.server.Server
;
...
...
@@ -38,10 +39,16 @@ public class JettyServer {
server
.
setHandler
(
handlerc
);
try
{
// Start
the
server
// Start server
server
.
start
();
logger
.
info
(
">>>>>>>>>>>> xxl-job jetty server start success at port:{}."
,
port
);
// Start Registry-Server
ExecutorRegistryThread
.
getInstance
().
start
(
port
,
ip
,
appName
);
// Start Callback-Server
TriggerCallbackThread
.
getInstance
().
start
();
server
.
join
();
// block until thread stopped
logger
.
info
(
">>>>>>>>>>> xxl-rpc server join success, netcon={}, port={}"
,
JettyServer
.
class
.
getName
(),
port
);
}
catch
(
Exception
e
)
{
...
...
@@ -56,6 +63,8 @@ public class JettyServer {
}
public
void
destroy
()
{
// destroy server
if
(
server
!=
null
)
{
try
{
server
.
stop
();
...
...
@@ -67,6 +76,13 @@ public class JettyServer {
if
(
thread
.
isAlive
())
{
thread
.
interrupt
();
}
// destroy Registry-Server
ExecutorRegistryThread
.
getInstance
().
toStop
();
// destroy Callback-Server
TriggerCallbackThread
.
getInstance
().
toStop
();
logger
.
info
(
">>>>>>>>>>> xxl-rpc server destroy success, netcon={}"
,
JettyServer
.
class
.
getName
());
}
...
...
xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java
浏览文件 @
09d89524
package
com
.
xxl
.
job
.
core
.
util
;
import
com.xxl.job.core.
executor.XxlJobExecuto
r
;
import
com.xxl.job.core.
log.XxlJobFileAppende
r
;
import
org.apache.commons.exec.CommandLine
;
import
org.apache.commons.exec.DefaultExecutor
;
import
org.apache.commons.exec.PumpStreamHandler
;
...
...
@@ -28,7 +28,7 @@ public class ScriptUtil {
*/
public
static
void
markScriptFile
(
String
scriptFileName
,
String
content
)
throws
IOException
{
// filePath/
File
filePathDir
=
new
File
(
XxlJob
Executo
r
.
logPath
);
File
filePathDir
=
new
File
(
XxlJob
FileAppende
r
.
logPath
);
if
(!
filePathDir
.
exists
())
{
filePathDir
.
mkdirs
();
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论