Skip to content
项目
群组
代码片段
帮助
正在加载...
登录
切换导航
X
XXL-JOB
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
分枝图
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
分枝图
统计图
创建新议题
作业
提交
议题看板
打开侧边栏
靳帅
XXL-JOB
Commits
82b4d735
提交
82b4d735
authored
12月 12, 2019
作者:
xuxueli
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
移除commons-exec,采用原生方式实现;
上级
916b541c
隐藏空白字符变更
内嵌
并排
正在显示
4 个修改的文件
包含
139 行增加
和
17 行删除
+139
-17
XXL-JOB官方文档.md
doc/XXL-JOB官方文档.md
+2
-2
pom.xml
pom.xml
+0
-2
pom.xml
xxl-job-core/pom.xml
+0
-7
ScriptUtil.java
...-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java
+137
-6
没有找到文件。
doc/XXL-JOB官方文档.md
浏览文件 @
82b4d735
...
...
@@ -1672,9 +1672,9 @@ public ReturnT<String> execute(String param) {
return ReturnT.SUCCESS;
}
```
-
2、
调度中心dispatcher servlet加载顺序优化
;
-
2、
移除commons-exec,采用原生方式实现
;
-
3、执行器回调乱码问题修复;
-
4、
[
迭代中
]
移除commons-exec,采用原生方式实现
;
-
4、
调度中心dispatcher servlet加载顺序优化
;
-
5、
[
迭代中
]
任务操作API服务调整为restful方式,降低接入成本;
...
...
pom.xml
浏览文件 @
82b4d735
...
...
@@ -34,8 +34,6 @@
<slf4j-api.version>
1.7.28
</slf4j-api.version>
<junit.version>
4.12
</junit.version>
<commons-exec.version>
1.3
</commons-exec.version>
<groovy.version>
2.5.8
</groovy.version>
<maven-source-plugin.version>
3.1.0
</maven-source-plugin.version>
...
...
xxl-job-core/pom.xml
浏览文件 @
82b4d735
...
...
@@ -29,13 +29,6 @@
<version>
${groovy.version}
</version>
</dependency>
<!-- commons-exec -->
<dependency>
<groupId>
org.apache.commons
</groupId>
<artifactId>
commons-exec
</artifactId>
<version>
${commons-exec.version}
</version>
</dependency>
<!-- spring-context -->
<dependency>
<groupId>
org.springframework
</groupId>
...
...
xxl-job-core/src/main/java/com/xxl/job/core/util/ScriptUtil.java
浏览文件 @
82b4d735
package
com
.
xxl
.
job
.
core
.
util
;
import
com.xxl.job.core.log.XxlJobLogger
;
import
org.apache.commons.exec.CommandLine
;
import
org.apache.commons.exec.DefaultExecutor
;
import
org.apache.commons.exec.PumpStreamHandler
;
import
java.io.FileOutputStream
;
import
java.io.IOException
;
import
java.io.InputStream
;
import
java.io.OutputStream
;
import
java.util.ArrayList
;
import
java.util.List
;
/**
* 1、内嵌编译器如"PythonInterpreter"无法引用扩展包,因此推荐使用java调用控制台进程方式"Runtime.getRuntime().exec()"来运行脚本(shell或python);
...
...
@@ -42,13 +43,143 @@ public class ScriptUtil {
}
/**
* 日志文件输出方式
* 脚本执行,日志文件实时输出
*
* @param command
* @param scriptFile
* @param logFile
* @param params
* @return
* @throws IOException
*/
public
static
int
execToFileB
(
String
command
,
String
scriptFile
,
String
logFile
,
String
...
params
)
throws
IOException
{
FileOutputStream
fileOutputStream
=
null
;
Thread
inputThread
=
null
;
Thread
errThread
=
null
;
try
{
// file
fileOutputStream
=
new
FileOutputStream
(
logFile
,
true
);
// command
List
<
String
>
cmdarray
=
new
ArrayList
<>();
cmdarray
.
add
(
command
);
cmdarray
.
add
(
scriptFile
);
if
(
params
!=
null
&&
params
.
length
>
0
)
{
for
(
String
param:
params
)
{
cmdarray
.
add
(
param
);
}
}
String
[]
cmdarrayFinal
=
cmdarray
.
toArray
(
new
String
[
cmdarray
.
size
()]);
// process-exec
final
Process
process
=
Runtime
.
getRuntime
().
exec
(
cmdarrayFinal
);
// log-thread
final
FileOutputStream
finalFileOutputStream
=
fileOutputStream
;
inputThread
=
new
Thread
(
new
Runnable
()
{
@Override
public
void
run
()
{
try
{
copy
(
process
.
getInputStream
(),
finalFileOutputStream
,
new
byte
[
1024
]);
}
catch
(
IOException
e
)
{
XxlJobLogger
.
log
(
e
);
}
}
});
errThread
=
new
Thread
(
new
Runnable
()
{
@Override
public
void
run
()
{
try
{
copy
(
process
.
getErrorStream
(),
finalFileOutputStream
,
new
byte
[
1024
]);
}
catch
(
IOException
e
)
{
XxlJobLogger
.
log
(
e
);
}
}
});
inputThread
.
start
();
errThread
.
start
();
// process-wait
int
exitValue
=
process
.
waitFor
();
// exit code: 0=success, 1=error
// log-thread join
inputThread
.
join
();
errThread
.
join
();
return
exitValue
;
}
catch
(
Exception
e
)
{
XxlJobLogger
.
log
(
e
);
return
-
1
;
}
finally
{
if
(
fileOutputStream
!=
null
)
{
try
{
fileOutputStream
.
close
();
}
catch
(
IOException
e
)
{
XxlJobLogger
.
log
(
e
);
}
}
if
(
inputThread
!=
null
&&
inputThread
.
isAlive
())
{
inputThread
.
interrupt
();
}
if
(
errThread
!=
null
&&
errThread
.
isAlive
())
{
errThread
.
interrupt
();
}
}
}
/**
* 数据流Copy(Input自动关闭,Output不处理)
*
* @param inputStream
* @param outputStream
* @param buffer
* @return
* @throws IOException
*/
private
static
long
copy
(
InputStream
inputStream
,
OutputStream
outputStream
,
byte
[]
buffer
)
throws
IOException
{
try
{
long
total
=
0
;
for
(;;)
{
int
res
=
inputStream
.
read
(
buffer
);
if
(
res
==
-
1
)
{
break
;
}
if
(
res
>
0
)
{
total
+=
res
;
if
(
outputStream
!=
null
)
{
outputStream
.
write
(
buffer
,
0
,
res
);
}
}
}
outputStream
.
flush
();
//out = null;
inputStream
.
close
();
inputStream
=
null
;
return
total
;
}
finally
{
if
(
inputStream
!=
null
)
{
inputStream
.
close
();
}
}
}
/**
* 脚本执行,日志文件实时输出
*
* 优点:支持将目标数据实时输出到指定日志文件中去
* 缺点:
* 标准输出和错误输出优先级固定,可能和脚本中顺序不一致
* Java无法实时获取
*
* <!-- commons-exec -->
* <dependency>
* <groupId>org.apache.commons</groupId>
* <artifactId>commons-exec</artifactId>
* <version>${commons-exec.version}</version>
* </dependency>
*
* @param command
* @param scriptFile
* @param logFile
...
...
@@ -56,7 +187,7 @@ public class ScriptUtil {
* @return
* @throws IOException
*/
public
static
int
execToFile
(
String
command
,
String
scriptFile
,
String
logFile
,
String
...
params
)
throws
IOException
{
/*
public static int execToFile(String command, String scriptFile, String logFile, String... params) throws IOException {
// 标准输出:print (null if watchdog timeout)
// 错误输出:logging + 异常 (still exists if watchdog timeout)
// 标准输入
...
...
@@ -92,6 +223,6 @@ public class ScriptUtil {
}
}
}
}
*/
}
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论