Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
X
xxljob320
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
promotion
xxljob320
Commits
9d287b54
提交
9d287b54
authored
10月 09, 2025
作者:
000516
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
删除示例执行器
上级
c7fec97e
隐藏空白字符变更
内嵌
并排
正在显示
25 个修改的文件
包含
0 行增加
和
1837 行删除
+0
-1837
pom.xml
xxl-job-executor-samples/pom.xml
+0
-24
pom.xml
...xecutor-samples/xxl-job-executor-sample-frameless/pom.xml
+0
-46
XxlJobFramelessApplication.java
...executor/sample/frameless/XxlJobFramelessApplication.java
+0
-38
FrameLessXxlJobConfig.java
...ecutor/sample/frameless/config/FrameLessXxlJobConfig.java
+0
-94
SampleXxlJob.java
...ob/executor/sample/frameless/jobhandler/SampleXxlJob.java
+0
-294
log4j.xml
...ob-executor-sample-frameless/src/main/resources/log4j.xml
+0
-28
xxl-job-executor.properties
...-frameless/src/main/resources/xxl-job-executor.properties
+0
-19
FramelessApplicationTest.java
...cutor/sample/frameless/test/FramelessApplicationTest.java
+0
-12
pom.xml
...tor-samples/xxl-job-executor-sample-springboot-ai/pom.xml
+0
-89
XxlJobAIExecutorApplication.java
...ava/com/xxl/job/executor/XxlJobAIExecutorApplication.java
+0
-17
XxlJobConfig.java
...c/main/java/com/xxl/job/executor/config/XxlJobConfig.java
+0
-65
IndexController.java
...java/com/xxl/job/executor/controller/IndexController.java
+0
-203
AIXxlJob.java
...c/main/java/com/xxl/job/executor/jobhandler/AIXxlJob.java
+0
-255
application.properties
...e-springboot-ai/src/main/resources/application.properties
+0
-36
logback.xml
...cutor-sample-springboot-ai/src/main/resources/logback.xml
+0
-28
XxlJobExecutorExampleBootApplicationTests.java
...cutor/test/XxlJobExecutorExampleBootApplicationTests.java
+0
-15
Dockerfile
...tor-samples/xxl-job-executor-sample-springboot/Dockerfile
+0
-12
pom.xml
...ecutor-samples/xxl-job-executor-sample-springboot/pom.xml
+0
-78
XxlJobExecutorApplication.java
.../java/com/xxl/job/executor/XxlJobExecutorApplication.java
+0
-17
XxlJobConfig.java
...c/main/java/com/xxl/job/executor/config/XxlJobConfig.java
+0
-83
IndexController.java
...java/com/xxl/job/executor/controller/IndexController.java
+0
-19
SampleXxlJob.java
...in/java/com/xxl/job/executor/jobhandler/SampleXxlJob.java
+0
-295
application.properties
...mple-springboot/src/main/resources/application.properties
+0
-27
logback.xml
...executor-sample-springboot/src/main/resources/logback.xml
+0
-28
XxlJobExecutorExampleBootApplicationTests.java
...cutor/test/XxlJobExecutorExampleBootApplicationTests.java
+0
-15
没有找到文件。
xxl-job-executor-samples/pom.xml
deleted
100644 → 0
浏览文件 @
c7fec97e
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
com.xuxueli
</groupId>
<artifactId>
xxl-job
</artifactId>
<version>
3.2.0
</version>
</parent>
<artifactId>
xxl-job-executor-samples
</artifactId>
<packaging>
pom
</packaging>
<modules>
<module>
xxl-job-executor-sample-frameless
</module>
<module>
xxl-job-executor-sample-springboot
</module>
<module>
xxl-job-executor-sample-springboot-ai
</module>
</modules>
<properties>
<maven.install.skip>
true
</maven.install.skip>
<maven.deploy.skip>
true
</maven.deploy.skip>
</properties>
</project>
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-frameless/pom.xml
deleted
100644 → 0
浏览文件 @
c7fec97e
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
com.xuxueli
</groupId>
<artifactId>
xxl-job-executor-samples
</artifactId>
<version>
3.2.0
</version>
</parent>
<artifactId>
xxl-job-executor-sample-frameless
</artifactId>
<packaging>
jar
</packaging>
<name>
${project.artifactId}
</name>
<description>
Example executor project for spring boot.
</description>
<url>
https://www.xuxueli.com/
</url>
<dependencies>
<!-- slf4j -->
<dependency>
<groupId>
org.slf4j
</groupId>
<artifactId>
slf4j-reload4j
</artifactId>
<version>
${slf4j-api.version}
</version>
</dependency>
<!-- junit -->
<dependency>
<groupId>
org.junit.jupiter
</groupId>
<artifactId>
junit-jupiter-engine
</artifactId>
<version>
${junit-jupiter.version}
</version>
<scope>
test
</scope>
</dependency>
<!-- xxl-job-core -->
<dependency>
<groupId>
com.xuxueli
</groupId>
<artifactId>
xxl-job-core
</artifactId>
<version>
${project.parent.version}
</version>
</dependency>
</dependencies>
</project>
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/XxlJobFramelessApplication.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
.
sample
.
frameless
;
import
com.xxl.job.executor.sample.frameless.config.FrameLessXxlJobConfig
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.util.concurrent.TimeUnit
;
/**
* @author xuxueli 2018-10-31 19:05:43
*/
public
class
XxlJobFramelessApplication
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
XxlJobFramelessApplication
.
class
);
public
static
void
main
(
String
[]
args
)
{
try
{
// start
FrameLessXxlJobConfig
.
getInstance
().
initXxlJobExecutor
();
// Blocks until interrupted
while
(
true
)
{
try
{
TimeUnit
.
HOURS
.
sleep
(
1
);
}
catch
(
InterruptedException
e
)
{
break
;
}
}
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
finally
{
// destroy
FrameLessXxlJobConfig
.
getInstance
().
destroyXxlJobExecutor
();
}
}
}
xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/config/FrameLessXxlJobConfig.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
.
sample
.
frameless
.
config
;
import
com.xxl.job.executor.sample.frameless.jobhandler.SampleXxlJob
;
import
com.xxl.job.core.executor.impl.XxlJobSimpleExecutor
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.io.IOException
;
import
java.io.InputStreamReader
;
import
java.util.Arrays
;
import
java.util.Properties
;
/**
* @author xuxueli 2018-10-31 19:05:43
*/
public
class
FrameLessXxlJobConfig
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
FrameLessXxlJobConfig
.
class
);
private
static
FrameLessXxlJobConfig
instance
=
new
FrameLessXxlJobConfig
();
public
static
FrameLessXxlJobConfig
getInstance
()
{
return
instance
;
}
private
XxlJobSimpleExecutor
xxlJobExecutor
=
null
;
/**
* init
*/
public
void
initXxlJobExecutor
()
{
// load executor prop
Properties
xxlJobProp
=
loadProperties
(
"xxl-job-executor.properties"
);
// init executor
xxlJobExecutor
=
new
XxlJobSimpleExecutor
();
xxlJobExecutor
.
setAdminAddresses
(
xxlJobProp
.
getProperty
(
"xxl.job.admin.addresses"
));
xxlJobExecutor
.
setAccessToken
(
xxlJobProp
.
getProperty
(
"xxl.job.admin.accessToken"
));
xxlJobExecutor
.
setTimeout
(
Integer
.
valueOf
(
xxlJobProp
.
getProperty
(
"xxl.job.admin.timeout"
)));
xxlJobExecutor
.
setAppname
(
xxlJobProp
.
getProperty
(
"xxl.job.executor.appname"
));
xxlJobExecutor
.
setAddress
(
xxlJobProp
.
getProperty
(
"xxl.job.executor.address"
));
xxlJobExecutor
.
setIp
(
xxlJobProp
.
getProperty
(
"xxl.job.executor.ip"
));
xxlJobExecutor
.
setPort
(
Integer
.
valueOf
(
xxlJobProp
.
getProperty
(
"xxl.job.executor.port"
)));
xxlJobExecutor
.
setLogPath
(
xxlJobProp
.
getProperty
(
"xxl.job.executor.logpath"
));
xxlJobExecutor
.
setLogRetentionDays
(
Integer
.
valueOf
(
xxlJobProp
.
getProperty
(
"xxl.job.executor.logretentiondays"
)));
// registry job bean
xxlJobExecutor
.
setXxlJobBeanList
(
Arrays
.
asList
(
new
SampleXxlJob
()));
// start executor
try
{
xxlJobExecutor
.
start
();
}
catch
(
Exception
e
)
{
logger
.
error
(
e
.
getMessage
(),
e
);
}
}
/**
* destroy
*/
public
void
destroyXxlJobExecutor
()
{
if
(
xxlJobExecutor
!=
null
)
{
xxlJobExecutor
.
destroy
();
}
}
public
static
Properties
loadProperties
(
String
propertyFileName
)
{
InputStreamReader
in
=
null
;
try
{
ClassLoader
loder
=
Thread
.
currentThread
().
getContextClassLoader
();
in
=
new
InputStreamReader
(
loder
.
getResourceAsStream
(
propertyFileName
),
"UTF-8"
);;
if
(
in
!=
null
)
{
Properties
prop
=
new
Properties
();
prop
.
load
(
in
);
return
prop
;
}
}
catch
(
IOException
e
)
{
logger
.
error
(
"load {} error!"
,
propertyFileName
);
}
finally
{
if
(
in
!=
null
)
{
try
{
in
.
close
();
}
catch
(
IOException
e
)
{
logger
.
error
(
"close {} error!"
,
propertyFileName
);
}
}
}
return
null
;
}
}
xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/java/com/xxl/job/executor/sample/frameless/jobhandler/SampleXxlJob.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
.
sample
.
frameless
.
jobhandler
;
import
com.xxl.job.core.context.XxlJobHelper
;
import
com.xxl.job.core.handler.annotation.XxlJob
;
import
com.xxl.job.core.util.GsonTool
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
java.io.BufferedInputStream
;
import
java.io.BufferedReader
;
import
java.io.DataOutputStream
;
import
java.io.InputStreamReader
;
import
java.net.HttpURLConnection
;
import
java.net.URL
;
import
java.nio.charset.StandardCharsets
;
import
java.util.Arrays
;
import
java.util.HashSet
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.concurrent.TimeUnit
;
/**
* XxlJob开发示例(Bean模式)
*
* 开发步骤:
* 1、任务开发:在Spring Bean实例中,开发Job方法;
* 2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
* 3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
* 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
*
* @author xuxueli 2019-12-11 21:52:51
*/
public
class
SampleXxlJob
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
SampleXxlJob
.
class
);
/**
* 1、简单任务示例(Bean模式)
*/
@XxlJob
(
"demoJobHandler"
)
public
void
demoJobHandler
()
throws
Exception
{
XxlJobHelper
.
log
(
"XXL-JOB, Hello World."
);
for
(
int
i
=
0
;
i
<
5
;
i
++)
{
XxlJobHelper
.
log
(
"beat at:"
+
i
);
TimeUnit
.
SECONDS
.
sleep
(
2
);
}
// default success
}
/**
* 2、分片广播任务
*/
@XxlJob
(
"shardingJobHandler"
)
public
void
shardingJobHandler
()
throws
Exception
{
// 分片参数
int
shardIndex
=
XxlJobHelper
.
getShardIndex
();
int
shardTotal
=
XxlJobHelper
.
getShardTotal
();
XxlJobHelper
.
log
(
"分片参数:当前分片序号 = {}, 总分片数 = {}"
,
shardIndex
,
shardTotal
);
// 业务逻辑
for
(
int
i
=
0
;
i
<
shardTotal
;
i
++)
{
if
(
i
==
shardIndex
)
{
XxlJobHelper
.
log
(
"第 {} 片, 命中分片开始处理"
,
i
);
}
else
{
XxlJobHelper
.
log
(
"第 {} 片, 忽略"
,
i
);
}
}
}
/**
* 3、命令行任务
*
* 参数示例:"ls -a" 或者 "pwd"
*/
@XxlJob
(
"commandJobHandler"
)
public
void
commandJobHandler
()
throws
Exception
{
String
command
=
XxlJobHelper
.
getJobParam
();
int
exitValue
=
-
1
;
BufferedReader
bufferedReader
=
null
;
try
{
// valid
if
(
command
==
null
||
command
.
trim
().
isEmpty
())
{
XxlJobHelper
.
handleFail
(
"command empty."
);
return
;
}
// command split
String
[]
commandArray
=
command
.
split
(
" "
);
// command process
ProcessBuilder
processBuilder
=
new
ProcessBuilder
();
processBuilder
.
command
(
commandArray
);
processBuilder
.
redirectErrorStream
(
true
);
Process
process
=
processBuilder
.
start
();
//Process process = Runtime.getRuntime().exec(command);
BufferedInputStream
bufferedInputStream
=
new
BufferedInputStream
(
process
.
getInputStream
());
bufferedReader
=
new
BufferedReader
(
new
InputStreamReader
(
bufferedInputStream
));
// command log
String
line
;
while
((
line
=
bufferedReader
.
readLine
())
!=
null
)
{
XxlJobHelper
.
log
(
line
);
}
// command exit
process
.
waitFor
();
exitValue
=
process
.
exitValue
();
}
catch
(
Exception
e
)
{
XxlJobHelper
.
log
(
e
);
}
finally
{
if
(
bufferedReader
!=
null
)
{
bufferedReader
.
close
();
}
}
if
(
exitValue
==
0
)
{
// default success
}
else
{
XxlJobHelper
.
handleFail
(
"command exit value("
+
exitValue
+
") is failed"
);
}
}
/**
* 4、跨平台Http任务
*
* 参数示例:
* <pre>
* {
* "url": "http://www.baidu.com",
* "method": "get",
* "data": "hello world"
* }
* </pre>
*/
@XxlJob
(
"httpJobHandler"
)
public
void
httpJobHandler
()
throws
Exception
{
// param
String
param
=
XxlJobHelper
.
getJobParam
();
if
(
param
==
null
||
param
.
trim
().
length
()==
0
)
{
XxlJobHelper
.
log
(
"param["
+
param
+
"] invalid."
);
XxlJobHelper
.
handleFail
();
return
;
}
// param parse
String
url
;
String
method
;
String
data
;
try
{
Map
<
String
,
String
>
paramMap
=
GsonTool
.
fromJson
(
param
,
Map
.
class
);
url
=
paramMap
.
get
(
"url"
);
method
=
paramMap
.
get
(
"method"
);
data
=
paramMap
.
get
(
"data"
);
}
catch
(
Exception
e
)
{
XxlJobHelper
.
log
(
e
);
XxlJobHelper
.
handleFail
();
return
;
}
// param valid
if
(
url
==
null
||
url
.
trim
().
isEmpty
())
{
XxlJobHelper
.
log
(
"url["
+
url
+
"] invalid."
);
XxlJobHelper
.
handleFail
();
return
;
}
if
(!
isValidDomain
(
url
))
{
XxlJobHelper
.
log
(
"url["
+
url
+
"] not allowed."
);
XxlJobHelper
.
handleFail
();
return
;
}
if
(
method
==
null
||
!
Arrays
.
asList
(
"GET"
,
"POST"
).
contains
(
method
.
toUpperCase
()))
{
XxlJobHelper
.
log
(
"method["
+
method
+
"] invalid."
);
XxlJobHelper
.
handleFail
();
return
;
}
method
=
method
.
toUpperCase
();
boolean
isPostMethod
=
method
.
equals
(
"POST"
);
// request
HttpURLConnection
connection
=
null
;
BufferedReader
bufferedReader
=
null
;
try
{
// connection
URL
realUrl
=
new
URL
(
url
);
connection
=
(
HttpURLConnection
)
realUrl
.
openConnection
();
// connection setting
connection
.
setRequestMethod
(
method
);
connection
.
setDoOutput
(
isPostMethod
);
connection
.
setDoInput
(
true
);
connection
.
setUseCaches
(
false
);
connection
.
setReadTimeout
(
5
*
1000
);
connection
.
setConnectTimeout
(
3
*
1000
);
connection
.
setRequestProperty
(
"connection"
,
"Keep-Alive"
);
connection
.
setRequestProperty
(
"Content-Type"
,
"application/json;charset=UTF-8"
);
connection
.
setRequestProperty
(
"Accept-Charset"
,
"application/json;charset=UTF-8"
);
// do connection
connection
.
connect
();
// data
if
(
isPostMethod
&&
data
!=
null
&&
!
data
.
trim
().
isEmpty
())
{
DataOutputStream
dataOutputStream
=
new
DataOutputStream
(
connection
.
getOutputStream
());
dataOutputStream
.
write
(
data
.
getBytes
(
StandardCharsets
.
UTF_8
));
dataOutputStream
.
flush
();
dataOutputStream
.
close
();
}
// valid StatusCode
int
statusCode
=
connection
.
getResponseCode
();
if
(
statusCode
!=
200
)
{
throw
new
RuntimeException
(
"Http Request StatusCode("
+
statusCode
+
") Invalid."
);
}
// result
bufferedReader
=
new
BufferedReader
(
new
InputStreamReader
(
connection
.
getInputStream
(),
StandardCharsets
.
UTF_8
));
StringBuilder
result
=
new
StringBuilder
();
String
line
;
while
((
line
=
bufferedReader
.
readLine
())
!=
null
)
{
result
.
append
(
line
);
}
String
responseMsg
=
result
.
toString
();
XxlJobHelper
.
log
(
responseMsg
);
return
;
}
catch
(
Exception
e
)
{
XxlJobHelper
.
log
(
e
);
XxlJobHelper
.
handleFail
();
return
;
}
finally
{
try
{
if
(
bufferedReader
!=
null
)
{
bufferedReader
.
close
();
}
if
(
connection
!=
null
)
{
connection
.
disconnect
();
}
}
catch
(
Exception
e2
)
{
XxlJobHelper
.
log
(
e2
);
}
}
}
// domain white-list, for httpJobHandler
private
static
Set
<
String
>
DOMAIN_WHITE_LIST
=
new
HashSet
<
String
>(
Arrays
.
asList
(
"http://www.baidu.com"
,
"http://cn.bing.com"
));
// valid if domain is in white-list
private
boolean
isValidDomain
(
String
url
)
{
if
(
url
==
null
||
DOMAIN_WHITE_LIST
.
isEmpty
())
{
return
false
;
}
for
(
String
prefix
:
DOMAIN_WHITE_LIST
)
{
if
(
url
.
startsWith
(
prefix
))
{
return
true
;
}
}
return
false
;
}
/**
* 5、生命周期任务示例:任务初始化与销毁时,支持自定义相关逻辑;
*/
@XxlJob
(
value
=
"demoJobHandler2"
,
init
=
"init"
,
destroy
=
"destroy"
)
public
void
demoJobHandler2
()
throws
Exception
{
XxlJobHelper
.
log
(
"XXL-JOB, Hello World."
);
}
public
void
init
(){
logger
.
info
(
"init"
);
}
public
void
destroy
(){
logger
.
info
(
"destroy"
);
}
}
xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/resources/log4j.xml
deleted
100644 → 0
浏览文件 @
c7fec97e
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE log4j:configuration PUBLIC "-//log4j/log4j Configuration//EN" "log4j.dtd">
<log4j:configuration
xmlns:log4j=
"http://jakarta.apache.org/log4j/"
threshold=
"null"
debug=
"null"
>
<appender
name=
"CONSOLE"
class=
"org.apache.log4j.ConsoleAppender"
>
<param
name=
"Target"
value=
"System.out"
/>
<layout
class=
"org.apache.log4j.PatternLayout"
>
<param
name=
"ConversionPattern"
value=
"%-d{yyyy-MM-dd HH:mm:ss} xxl-job-executor-sample-frameless [%c]-[%t]-[%M]-[%L]-[%p] %m%n"
/>
</layout>
</appender>
<appender
name=
"FILE"
class=
"org.apache.log4j.DailyRollingFileAppender"
>
<param
name=
"file"
value=
"/data/applogs/xxl-job/xxl-job-executor-sample-frameless.log"
/>
<param
name=
"append"
value=
"true"
/>
<param
name=
"encoding"
value=
"UTF-8"
/>
<layout
class=
"org.apache.log4j.PatternLayout"
>
<param
name=
"ConversionPattern"
value=
"%-d{yyyy-MM-dd HH:mm:ss} xxl-job-executor-sample-frameless [%c]-[%t]-[%M]-[%L]-[%p] %m%n"
/>
</layout>
</appender>
<root>
<level
value=
"INFO"
/>
<appender-ref
ref=
"CONSOLE"
/>
<appender-ref
ref=
"FILE"
/>
</root>
</log4j:configuration>
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/main/resources/xxl-job-executor.properties
deleted
100644 → 0
浏览文件 @
c7fec97e
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses
=
http://127.0.0.1:8080/xxl-job-admin
### xxl-job access-token
xxl.job.admin.accessToken
=
default_token
### xxl-job timeout by second, default 3s
xxl.job.admin.timeout
=
3
### xxl-job executor appname
xxl.job.executor.appname
=
xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address
=
### xxl-job executor server-info
xxl.job.executor.ip
=
xxl.job.executor.port
=
9998
### xxl-job executor log-path
xxl.job.executor.logpath
=
/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays
=
30
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-frameless/src/test/java/com/xxl/job/executor/sample/frameless/test/FramelessApplicationTest.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
.
sample
.
frameless
.
test
;
import
org.junit.jupiter.api.Test
;
public
class
FramelessApplicationTest
{
@Test
public
void
test
(){
System
.
out
.
println
(
"111"
);
}
}
xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/pom.xml
deleted
100644 → 0
浏览文件 @
c7fec97e
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
com.xuxueli
</groupId>
<artifactId>
xxl-job-executor-samples
</artifactId>
<version>
3.2.0
</version>
</parent>
<artifactId>
xxl-job-executor-sample-springboot-ai
</artifactId>
<packaging>
jar
</packaging>
<name>
${project.artifactId}
</name>
<description>
Example executor project for spring boot.
</description>
<url>
https://www.xuxueli.com/
</url>
<properties>
<spring-ai.version>
1.0.1
</spring-ai.version>
<dify-java-client.version>
1.1.7
</dify-java-client.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
${spring-boot.version}
</version>
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- spring-boot-starter-web (spring-webmvc + tomcat) -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
<!-- xxl-job-core -->
<dependency>
<groupId>
com.xuxueli
</groupId>
<artifactId>
xxl-job-core
</artifactId>
<version>
${project.parent.version}
</version>
</dependency>
<!-- spring-ai -->
<dependency>
<groupId>
org.springframework.ai
</groupId>
<artifactId>
spring-ai-starter-model-ollama
</artifactId>
<version>
${spring-ai.version}
</version>
</dependency>
<!-- dify -->
<dependency>
<groupId>
io.github.imfangs
</groupId>
<artifactId>
dify-java-client
</artifactId>
<version>
${dify-java-client.version}
</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- spring-boot-maven-plugin (提供了直接运行项目的插件:如果是通过parent方式继承spring-boot-starter-parent则不用此插件) -->
<plugin>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-maven-plugin
</artifactId>
<!--<version>${spring-boot.version}</version>-->
<executions>
<execution>
<goals>
<goal>
repackage
</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/XxlJobAIExecutorApplication.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
/**
* @author xuxueli 2018-10-28 00:38:13
*/
@SpringBootApplication
public
class
XxlJobAIExecutorApplication
{
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
XxlJobAIExecutorApplication
.
class
,
args
);
}
}
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/config/XxlJobConfig.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
.
config
;
import
com.xxl.job.core.executor.impl.XxlJobSpringExecutor
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
/**
* xxl-job config
*
* @author xuxueli 2017-04-28
*/
@Configuration
public
class
XxlJobConfig
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
XxlJobConfig
.
class
);
@Value
(
"${xxl.job.admin.addresses}"
)
private
String
adminAddresses
;
@Value
(
"${xxl.job.admin.accessToken}"
)
private
String
accessToken
;
@Value
(
"${xxl.job.admin.timeout}"
)
private
int
timeout
;
@Value
(
"${xxl.job.executor.appname}"
)
private
String
appname
;
@Value
(
"${xxl.job.executor.address}"
)
private
String
address
;
@Value
(
"${xxl.job.executor.ip}"
)
private
String
ip
;
@Value
(
"${xxl.job.executor.port}"
)
private
int
port
;
@Value
(
"${xxl.job.executor.logpath}"
)
private
String
logPath
;
@Value
(
"${xxl.job.executor.logretentiondays}"
)
private
int
logRetentionDays
;
@Bean
public
XxlJobSpringExecutor
xxlJobExecutor
()
{
logger
.
info
(
">>>>>>>>>>> xxl-job config init."
);
XxlJobSpringExecutor
xxlJobSpringExecutor
=
new
XxlJobSpringExecutor
();
xxlJobSpringExecutor
.
setAdminAddresses
(
adminAddresses
);
xxlJobSpringExecutor
.
setAppname
(
appname
);
xxlJobSpringExecutor
.
setAddress
(
address
);
xxlJobSpringExecutor
.
setIp
(
ip
);
xxlJobSpringExecutor
.
setPort
(
port
);
xxlJobSpringExecutor
.
setAccessToken
(
accessToken
);
xxlJobSpringExecutor
.
setTimeout
(
timeout
);
xxlJobSpringExecutor
.
setLogPath
(
logPath
);
xxlJobSpringExecutor
.
setLogRetentionDays
(
logRetentionDays
);
return
xxlJobSpringExecutor
;
}
}
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/controller/IndexController.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
.
controller
;
//package com.xxl.job.executor.mvc.controller;
import
com.fasterxml.jackson.core.JsonProcessingException
;
import
com.fasterxml.jackson.databind.ObjectMapper
;
import
io.github.imfangs.dify.client.DifyClientFactory
;
import
io.github.imfangs.dify.client.DifyWorkflowClient
;
import
io.github.imfangs.dify.client.callback.WorkflowStreamCallback
;
import
io.github.imfangs.dify.client.enums.ResponseMode
;
import
io.github.imfangs.dify.client.event.*
;
import
io.github.imfangs.dify.client.model.workflow.WorkflowRunRequest
;
import
io.github.imfangs.dify.client.model.workflow.WorkflowRunResponse
;
import
jakarta.annotation.Resource
;
import
jakarta.servlet.http.HttpServletResponse
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.ai.chat.client.ChatClient
;
import
org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor
;
import
org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor
;
import
org.springframework.ai.chat.memory.MessageWindowChatMemory
;
import
org.springframework.ai.ollama.OllamaChatModel
;
import
org.springframework.ai.ollama.api.OllamaOptions
;
import
org.springframework.boot.autoconfigure.EnableAutoConfiguration
;
import
org.springframework.stereotype.Controller
;
import
org.springframework.web.bind.annotation.GetMapping
;
import
org.springframework.web.bind.annotation.RequestMapping
;
import
org.springframework.web.bind.annotation.RequestParam
;
import
org.springframework.web.bind.annotation.ResponseBody
;
import
reactor.core.publisher.Flux
;
import
reactor.core.publisher.FluxSink
;
import
java.util.HashMap
;
import
java.util.Map
;
import
java.util.function.Consumer
;
@Controller
@EnableAutoConfiguration
public
class
IndexController
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
IndexController
.
class
);
@RequestMapping
(
"/"
)
@ResponseBody
String
index
()
{
return
"xxl job ai executor running."
;
}
// --------------------------------- ollama chat ---------------------------------
@Resource
private
OllamaChatModel
ollamaChatModel
;
private
String
prompt
=
"你好,你是一个研发工程师,擅长解决技术类问题。"
;
private
String
modle
=
"qwen3:0.6b"
;
/**
* ChatClient 简单调用
*/
@GetMapping
(
"/chat/simple"
)
@ResponseBody
public
String
simpleChat
(
@RequestParam
(
value
=
"input"
)
String
input
)
{
// build chat-client
ChatClient
ollamaChatClient
=
ChatClient
.
builder
(
ollamaChatModel
)
.
defaultAdvisors
(
MessageChatMemoryAdvisor
.
builder
(
MessageWindowChatMemory
.
builder
().
build
()).
build
())
.
defaultAdvisors
(
SimpleLoggerAdvisor
.
builder
().
build
())
.
build
();
// call ollama
String
response
=
ollamaChatClient
.
prompt
(
prompt
)
.
user
(
input
)
.
options
(
OllamaOptions
.
builder
().
model
(
modle
).
build
())
.
call
()
.
content
();
logger
.
info
(
"result: "
+
response
);
return
response
;
}
/**
* ChatClient 流式调用
*/
@GetMapping
(
"/chat/stream"
)
public
Flux
<
String
>
streamChat
(
HttpServletResponse
response
,
@RequestParam
(
value
=
"input"
)
String
input
)
{
response
.
setCharacterEncoding
(
"UTF-8"
);
// build chat-client
ChatClient
ollamaChatClient
=
ChatClient
.
builder
(
ollamaChatModel
)
.
defaultAdvisors
(
MessageChatMemoryAdvisor
.
builder
(
MessageWindowChatMemory
.
builder
().
build
()).
build
())
.
defaultAdvisors
(
SimpleLoggerAdvisor
.
builder
().
build
())
.
build
();
// call ollama
return
ollamaChatClient
.
prompt
(
prompt
)
.
user
(
input
)
.
options
(
OllamaOptions
.
builder
().
model
(
modle
).
build
())
.
stream
()
.
content
();
}
// --------------------------------- dify workflow ---------------------------------
// dify config sample
private
final
String
apiKey
=
"app-46gHBiqUb5jqAHl9TDWwnRZ8"
;
private
final
String
baseUrl
=
"http://localhost/v1"
;
@GetMapping
(
"/dify/simple"
)
@ResponseBody
public
String
difySimple
(
@RequestParam
(
required
=
false
,
value
=
"input"
)
String
input
)
throws
Exception
{
Map
<
String
,
Object
>
inputs
=
new
HashMap
<>();
inputs
.
put
(
"input"
,
input
);
// request
WorkflowRunRequest
request
=
WorkflowRunRequest
.
builder
()
.
inputs
(
inputs
)
.
responseMode
(
ResponseMode
.
BLOCKING
)
.
user
(
"user-123"
)
.
build
();
// invoke
DifyWorkflowClient
workflowClient
=
DifyClientFactory
.
createWorkflowClient
(
baseUrl
,
apiKey
);
WorkflowRunResponse
response
=
workflowClient
.
runWorkflow
(
request
);
// response
return
write2Json
(
response
.
getData
().
getOutputs
());
}
private
String
write2Json
(
Object
obj
)
{
if
(
obj
==
null
)
{
return
"null"
;
}
try
{
return
new
ObjectMapper
().
writeValueAsString
(
obj
);
}
catch
(
JsonProcessingException
e
)
{
return
obj
.
toString
();
}
}
@GetMapping
(
"/dify/stream"
)
public
Flux
<
String
>
difyStream
(
@RequestParam
(
required
=
false
,
value
=
"input"
)
String
input
)
{
Map
<
String
,
Object
>
inputs
=
new
HashMap
<>();
inputs
.
put
(
"input"
,
input
);
// request
WorkflowRunRequest
request
=
WorkflowRunRequest
.
builder
()
.
inputs
(
inputs
)
.
responseMode
(
ResponseMode
.
STREAMING
)
.
user
(
"user-123"
)
.
build
();
// invoke
DifyWorkflowClient
workflowClient
=
DifyClientFactory
.
createWorkflowClient
(
baseUrl
,
apiKey
);
return
Flux
.
create
(
new
Consumer
<
FluxSink
<
String
>>()
{
@Override
public
void
accept
(
FluxSink
<
String
>
sink
)
{
try
{
workflowClient
.
runWorkflowStream
(
request
,
new
WorkflowStreamCallback
()
{
@Override
public
void
onWorkflowStarted
(
WorkflowStartedEvent
event
)
{
sink
.
next
(
"工作流开始: "
+
write2Json
(
event
.
getData
()));
}
@Override
public
void
onNodeStarted
(
NodeStartedEvent
event
)
{
sink
.
next
(
"节点开始: "
+
write2Json
(
event
.
getData
()));
}
@Override
public
void
onNodeFinished
(
NodeFinishedEvent
event
)
{
sink
.
next
(
"节点完成: "
+
write2Json
(
event
.
getData
().
getOutputs
()));
}
@Override
public
void
onWorkflowFinished
(
WorkflowFinishedEvent
event
)
{
sink
.
next
(
"工作流完成: "
+
write2Json
(
event
.
getData
().
getOutputs
()));
sink
.
complete
();
}
@Override
public
void
onError
(
ErrorEvent
event
)
{
sink
.
error
(
new
RuntimeException
(
event
.
getMessage
()));
}
@Override
public
void
onException
(
Throwable
throwable
)
{
sink
.
error
(
throwable
);
}
});
}
catch
(
Exception
e
)
{
throw
new
RuntimeException
(
e
);
}
}
});
}
}
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/java/com/xxl/job/executor/jobhandler/AIXxlJob.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
.
jobhandler
;
import
com.xxl.job.core.context.XxlJobHelper
;
import
com.xxl.job.core.handler.annotation.XxlJob
;
import
com.xxl.job.core.util.GsonTool
;
import
io.github.imfangs.dify.client.DifyClientFactory
;
import
io.github.imfangs.dify.client.DifyWorkflowClient
;
import
io.github.imfangs.dify.client.enums.ResponseMode
;
import
io.github.imfangs.dify.client.model.workflow.WorkflowRunRequest
;
import
io.github.imfangs.dify.client.model.workflow.WorkflowRunResponse
;
import
jakarta.annotation.Resource
;
import
org.springframework.ai.chat.client.ChatClient
;
import
org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor
;
import
org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor
;
import
org.springframework.ai.chat.memory.MessageWindowChatMemory
;
import
org.springframework.ai.ollama.OllamaChatModel
;
import
org.springframework.ai.ollama.api.OllamaOptions
;
import
org.springframework.stereotype.Component
;
import
java.util.HashMap
;
import
java.util.Map
;
/**
* AI 任务开发示例
*
* @author xuxueli 2025-04-06
*/
@Component
public
class
AIXxlJob
{
// --------------------------------- ollama chat ---------------------------------
@Resource
private
OllamaChatModel
ollamaChatModel
;
/**
* 1、ollama Chat任务
*
* 参数示例:格式见 OllamaParam
* <pre>
* {
* "input": "{输入信息,必填信息}",
* "prompt": "{模型prompt,可选信息}"
* }
* </pre>
*/
@XxlJob
(
"ollamaJobHandler"
)
public
void
ollamaJobHandler
()
{
// param
String
param
=
XxlJobHelper
.
getJobParam
();
if
(
param
==
null
||
param
.
trim
().
isEmpty
())
{
XxlJobHelper
.
log
(
"param is empty."
);
XxlJobHelper
.
handleFail
();
return
;
}
// ollama param
OllamaParam
ollamaParam
=
null
;
try
{
ollamaParam
=
GsonTool
.
fromJson
(
param
,
OllamaParam
.
class
);
if
(
ollamaParam
.
getPrompt
()==
null
||
ollamaParam
.
getPrompt
().
isBlank
())
{
ollamaParam
.
setPrompt
(
"你是一个研发工程师,擅长解决技术类问题。"
);
}
if
(
ollamaParam
.
getInput
()
==
null
||
ollamaParam
.
getInput
().
isBlank
())
{
XxlJobHelper
.
log
(
"input is empty."
);
XxlJobHelper
.
handleFail
();
return
;
}
if
(
ollamaParam
.
getModel
()==
null
||
ollamaParam
.
getModel
().
isBlank
())
{
ollamaParam
.
setModel
(
"qwen3:0.6b"
);
}
}
catch
(
Exception
e
)
{
XxlJobHelper
.
log
(
new
RuntimeException
(
"OllamaParam parse error"
,
e
));
XxlJobHelper
.
handleFail
();
return
;
}
// input
XxlJobHelper
.
log
(
"<br><br><b>【Input】: "
+
ollamaParam
.
getInput
()+
"</b><br><br>"
);
// build chat-client
ChatClient
ollamaChatClient
=
ChatClient
.
builder
(
ollamaChatModel
)
.
defaultAdvisors
(
MessageChatMemoryAdvisor
.
builder
(
MessageWindowChatMemory
.
builder
().
build
()).
build
())
.
defaultAdvisors
(
SimpleLoggerAdvisor
.
builder
().
build
())
.
build
();
// call ollama
String
response
=
ollamaChatClient
.
prompt
(
ollamaParam
.
getPrompt
())
.
user
(
ollamaParam
.
getInput
())
.
options
(
OllamaOptions
.
builder
().
model
(
ollamaParam
.
getModel
()).
build
())
.
call
()
.
content
();
XxlJobHelper
.
log
(
"<br><br><b>【Output】: "
+
response
+
"</b><br><br>"
);
}
private
static
class
OllamaParam
{
private
String
input
;
private
String
prompt
;
private
String
model
;
public
String
getInput
()
{
return
input
;
}
public
void
setInput
(
String
input
)
{
this
.
input
=
input
;
}
public
String
getPrompt
()
{
return
prompt
;
}
public
void
setPrompt
(
String
prompt
)
{
this
.
prompt
=
prompt
;
}
public
String
getModel
()
{
return
model
;
}
public
void
setModel
(
String
model
)
{
this
.
model
=
model
;
}
}
// --------------------------------- dify workflow ---------------------------------
/**
* 2、dify Workflow任务
*
* 参数示例:格式见 DifyParam
* <pre>
* {
* "inputs":{ // inputs 为dify工作流任务参数;参数不固定,结合各自 workflow 自行定义。
* "input":"{用户输入信息}" // 该参数为示例变量,需要 workflow 的“开始”节点 自定义参数 “input”,可自行调整或删除。
* },
* "user": "{用户标识,选填}"
* }
* </pre>
*/
@XxlJob
(
"difyWorkflowJobHandler"
)
public
void
difyWorkflowJobHandler
()
throws
Exception
{
// param
String
param
=
XxlJobHelper
.
getJobParam
();
if
(
param
==
null
||
param
.
trim
().
isEmpty
())
{
XxlJobHelper
.
log
(
"param is empty."
);
XxlJobHelper
.
handleFail
();
return
;
}
// param parse
DifyParam
difyParam
;
try
{
difyParam
=
GsonTool
.
fromJson
(
param
,
DifyParam
.
class
);
if
(
difyParam
.
getInputs
()
==
null
)
{
difyParam
.
setInputs
(
new
HashMap
<>());
}
if
(
difyParam
.
getUser
()
==
null
)
{
difyParam
.
setUser
(
"xxl-job"
);
}
if
(
difyParam
.
getBaseUrl
()==
null
||
difyParam
.
getApiKey
()==
null
)
{
XxlJobHelper
.
log
(
"baseUrl or apiKey invalid."
);
XxlJobHelper
.
handleFail
();
return
;
}
}
catch
(
Exception
e
)
{
XxlJobHelper
.
log
(
new
RuntimeException
(
"DifyParam parse error"
,
e
));
XxlJobHelper
.
handleFail
();
return
;
}
// dify param
XxlJobHelper
.
log
(
"<br><br><b>【inputs】: "
+
difyParam
.
getInputs
()
+
"</b><br><br>"
);
// dify request
WorkflowRunRequest
request
=
WorkflowRunRequest
.
builder
()
.
inputs
(
difyParam
.
getInputs
())
.
responseMode
(
ResponseMode
.
BLOCKING
)
.
user
(
difyParam
.
getUser
())
.
build
();
// dify invoke
DifyWorkflowClient
workflowClient
=
DifyClientFactory
.
createWorkflowClient
(
difyParam
.
getBaseUrl
(),
difyParam
.
getApiKey
());
WorkflowRunResponse
response
=
workflowClient
.
runWorkflow
(
request
);
// response
XxlJobHelper
.
log
(
"<br><br><b>【Output】: "
+
response
.
getData
().
getOutputs
()+
"</b><br><br>"
);
}
private
static
class
DifyParam
{
/**
* dify input, 允许传入 Dify App 定义的各变量值
*/
private
Map
<
String
,
Object
>
inputs
;
/**
* dify user
*/
private
String
user
;
/**
* dify baseUrl
*/
private
String
baseUrl
;
/**
* dify apiKey
*/
private
String
apiKey
;
public
Map
<
String
,
Object
>
getInputs
()
{
return
inputs
;
}
public
void
setInputs
(
Map
<
String
,
Object
>
inputs
)
{
this
.
inputs
=
inputs
;
}
public
String
getUser
()
{
return
user
;
}
public
void
setUser
(
String
user
)
{
this
.
user
=
user
;
}
public
String
getBaseUrl
()
{
return
baseUrl
;
}
public
void
setBaseUrl
(
String
baseUrl
)
{
this
.
baseUrl
=
baseUrl
;
}
public
String
getApiKey
()
{
return
apiKey
;
}
public
void
setApiKey
(
String
apiKey
)
{
this
.
apiKey
=
apiKey
;
}
}
}
xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/resources/application.properties
deleted
100644 → 0
浏览文件 @
c7fec97e
# web port
server.port
=
8082
# no web
#spring.main.web-environment=false
server.servlet.encoding.force
=
true
server.servlet.encoding.charset
=
UTF-8
# log config
logging.config
=
classpath:logback.xml
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses
=
http://127.0.0.1:8080/xxl-job-admin
### xxl-job, access token
xxl.job.admin.accessToken
=
default_token
### xxl-job timeout by second, default 3s
xxl.job.admin.timeout
=
3
### xxl-job executor appname
xxl.job.executor.appname
=
xxl-job-executor-sample-ai
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address
=
### xxl-job executor server-info
xxl.job.executor.ip
=
xxl.job.executor.port
=
9997
### xxl-job executor log-path
xxl.job.executor.logpath
=
/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays
=
30
### ollama
spring.ai.model.chat
=
ollama
### ollama url
spring.ai.ollama.base-url
=
http://localhost:11434
xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/main/resources/logback.xml
deleted
100644 → 0
浏览文件 @
c7fec97e
<?xml version="1.0" encoding="UTF-8"?>
<configuration
debug=
"false"
scan=
"true"
scanPeriod=
"1 seconds"
>
<contextName>
logback
</contextName>
<property
name=
"log.path"
value=
"${LOG_HOME:-/data/applogs}/xxl-job/xxl-job-executor-sample-springboot-ai.log"
/>
<appender
name=
"console"
class=
"ch.qos.logback.core.ConsoleAppender"
>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<appender
name=
"file"
class=
"ch.qos.logback.core.rolling.RollingFileAppender"
>
<file>
${log.path}
</file>
<rollingPolicy
class=
"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"
>
<fileNamePattern>
${log.path}.%d{yyyy-MM-dd}.log
</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<root
level=
"info"
>
<appender-ref
ref=
"console"
/>
<!--<appender-ref ref="file"/>-->
</root>
</configuration>
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-springboot-ai/src/test/java/com/xxl/job/executor/test/XxlJobExecutorExampleBootApplicationTests.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
.
test
;
import
org.junit.jupiter.api.Test
;
import
org.springframework.boot.test.context.SpringBootTest
;
@SpringBootTest
public
class
XxlJobExecutorExampleBootApplicationTests
{
@Test
public
void
test
()
{
System
.
out
.
println
(
11
);
}
}
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-springboot/Dockerfile
deleted
100644 → 0
浏览文件 @
c7fec97e
FROM
openjdk:8-jre-slim
MAINTAINER
xuxueli
ENV
PARAMS=""
ENV
TZ=PRC
RUN
ln
-snf
/usr/share/zoneinfo/
$TZ
/etc/localtime
&&
echo
$TZ
>
/etc/timezone
ADD
target/xxl-job-executor-sample-springboot-*.jar /app.jar
ENTRYPOINT
["sh","-c","java -jar $JAVA_OPTS /app.jar $PARAMS"]
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-springboot/pom.xml
deleted
100644 → 0
浏览文件 @
c7fec97e
<?xml version="1.0" encoding="UTF-8"?>
<project
xmlns=
"http://maven.apache.org/POM/4.0.0"
xmlns:xsi=
"http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation=
"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>
4.0.0
</modelVersion>
<parent>
<groupId>
com.xuxueli
</groupId>
<artifactId>
xxl-job-executor-samples
</artifactId>
<version>
3.2.0
</version>
</parent>
<artifactId>
xxl-job-executor-sample-springboot
</artifactId>
<packaging>
jar
</packaging>
<name>
${project.artifactId}
</name>
<description>
Example executor project for spring boot.
</description>
<url>
https://www.xuxueli.com/
</url>
<properties>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot (依赖管理:继承一些默认的依赖,工程需要依赖的jar包的管理,申明其他dependency的时候就不需要version) -->
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-parent
</artifactId>
<version>
${spring-boot.version}
</version>
<type>
pom
</type>
<scope>
import
</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- spring-boot-starter-web (spring-webmvc + tomcat) -->
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-web
</artifactId>
</dependency>
<dependency>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-starter-test
</artifactId>
<scope>
test
</scope>
</dependency>
<!-- xxl-job-core -->
<dependency>
<groupId>
com.xuxueli
</groupId>
<artifactId>
xxl-job-core
</artifactId>
<version>
${project.parent.version}
</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- spring-boot-maven-plugin (提供了直接运行项目的插件:如果是通过parent方式继承spring-boot-starter-parent则不用此插件) -->
<plugin>
<groupId>
org.springframework.boot
</groupId>
<artifactId>
spring-boot-maven-plugin
</artifactId>
<!--<version>${spring-boot.version}</version>-->
<executions>
<execution>
<goals>
<goal>
repackage
</goal>
</goals>
</execution>
</executions>
<configuration>
<fork>
true
</fork>
</configuration>
</plugin>
</plugins>
</build>
</project>
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/XxlJobExecutorApplication.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
;
import
org.springframework.boot.SpringApplication
;
import
org.springframework.boot.autoconfigure.SpringBootApplication
;
/**
* @author xuxueli 2018-10-28 00:38:13
*/
@SpringBootApplication
public
class
XxlJobExecutorApplication
{
public
static
void
main
(
String
[]
args
)
{
SpringApplication
.
run
(
XxlJobExecutorApplication
.
class
,
args
);
}
}
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/config/XxlJobConfig.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
.
config
;
import
com.xxl.job.core.executor.impl.XxlJobSpringExecutor
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.beans.factory.annotation.Value
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
/**
* xxl-job config
*
* @author xuxueli 2017-04-28
*/
@Configuration
public
class
XxlJobConfig
{
private
Logger
logger
=
LoggerFactory
.
getLogger
(
XxlJobConfig
.
class
);
@Value
(
"${xxl.job.admin.addresses}"
)
private
String
adminAddresses
;
@Value
(
"${xxl.job.admin.accessToken}"
)
private
String
accessToken
;
@Value
(
"${xxl.job.admin.timeout}"
)
private
int
timeout
;
@Value
(
"${xxl.job.executor.appname}"
)
private
String
appname
;
@Value
(
"${xxl.job.executor.address}"
)
private
String
address
;
@Value
(
"${xxl.job.executor.ip}"
)
private
String
ip
;
@Value
(
"${xxl.job.executor.port}"
)
private
int
port
;
@Value
(
"${xxl.job.executor.logpath}"
)
private
String
logPath
;
@Value
(
"${xxl.job.executor.logretentiondays}"
)
private
int
logRetentionDays
;
@Bean
public
XxlJobSpringExecutor
xxlJobExecutor
()
{
logger
.
info
(
">>>>>>>>>>> xxl-job config init."
);
XxlJobSpringExecutor
xxlJobSpringExecutor
=
new
XxlJobSpringExecutor
();
xxlJobSpringExecutor
.
setAdminAddresses
(
adminAddresses
);
xxlJobSpringExecutor
.
setAppname
(
appname
);
xxlJobSpringExecutor
.
setAddress
(
address
);
xxlJobSpringExecutor
.
setIp
(
ip
);
xxlJobSpringExecutor
.
setPort
(
port
);
xxlJobSpringExecutor
.
setAccessToken
(
accessToken
);
xxlJobSpringExecutor
.
setTimeout
(
timeout
);
xxlJobSpringExecutor
.
setLogPath
(
logPath
);
xxlJobSpringExecutor
.
setLogRetentionDays
(
logRetentionDays
);
return
xxlJobSpringExecutor
;
}
/**
* 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
*
* 1、引入依赖:
* <dependency>
* <groupId>org.springframework.cloud</groupId>
* <artifactId>spring-cloud-commons</artifactId>
* <version>${version}</version>
* </dependency>
*
* 2、配置文件,或者容器启动变量
* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
*
* 3、获取IP
* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
*/
}
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/controller/IndexController.java
deleted
100644 → 0
浏览文件 @
c7fec97e
//package com.xxl.job.executor.mvc.controller;
//
//import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
//import org.springframework.stereotype.Controller;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.ResponseBody;
//
//@Controller
//@EnableAutoConfiguration
//public class IndexController {
//
// @RequestMapping("/")
// @ResponseBody
// String index() {
// return "xxl job executor running.";
// }
//
//}
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/jobhandler/SampleXxlJob.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
.
jobhandler
;
import
com.xxl.job.core.context.XxlJobHelper
;
import
com.xxl.job.core.handler.annotation.XxlJob
;
import
com.xxl.job.core.util.GsonTool
;
import
org.slf4j.Logger
;
import
org.slf4j.LoggerFactory
;
import
org.springframework.stereotype.Component
;
import
java.io.BufferedInputStream
;
import
java.io.BufferedReader
;
import
java.io.DataOutputStream
;
import
java.io.InputStreamReader
;
import
java.net.HttpURLConnection
;
import
java.net.URL
;
import
java.nio.charset.StandardCharsets
;
import
java.util.Arrays
;
import
java.util.HashSet
;
import
java.util.Map
;
import
java.util.Set
;
import
java.util.concurrent.TimeUnit
;
/**
* XxlJob开发示例(Bean模式)
*
* 开发步骤:
* 1、任务开发:在Spring Bean实例中,开发Job方法;
* 2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。
* 3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;
* 4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;
*
* @author xuxueli 2019-12-11 21:52:51
*/
@Component
public
class
SampleXxlJob
{
private
static
Logger
logger
=
LoggerFactory
.
getLogger
(
SampleXxlJob
.
class
);
/**
* 1、简单任务示例(Bean模式)
*/
@XxlJob
(
"demoJobHandler"
)
public
void
demoJobHandler
()
throws
Exception
{
XxlJobHelper
.
log
(
"XXL-JOB, Hello World."
);
for
(
int
i
=
0
;
i
<
5
;
i
++)
{
XxlJobHelper
.
log
(
"beat at:"
+
i
);
TimeUnit
.
SECONDS
.
sleep
(
2
);
}
// default success
}
/**
* 2、分片广播任务
*/
@XxlJob
(
"shardingJobHandler"
)
public
void
shardingJobHandler
()
throws
Exception
{
// 分片参数
int
shardIndex
=
XxlJobHelper
.
getShardIndex
();
int
shardTotal
=
XxlJobHelper
.
getShardTotal
();
XxlJobHelper
.
log
(
"分片参数:当前分片序号 = {}, 总分片数 = {}"
,
shardIndex
,
shardTotal
);
// 业务逻辑
for
(
int
i
=
0
;
i
<
shardTotal
;
i
++)
{
if
(
i
==
shardIndex
)
{
XxlJobHelper
.
log
(
"第 {} 片, 命中分片开始处理"
,
i
);
}
else
{
XxlJobHelper
.
log
(
"第 {} 片, 忽略"
,
i
);
}
}
}
/**
* 3、命令行任务
*
* 参数示例:"ls -a" 或者 "pwd"
*/
@XxlJob
(
"commandJobHandler"
)
public
void
commandJobHandler
()
throws
Exception
{
String
command
=
XxlJobHelper
.
getJobParam
();
int
exitValue
=
-
1
;
BufferedReader
bufferedReader
=
null
;
try
{
// valid
if
(
command
==
null
||
command
.
trim
().
length
()==
0
)
{
XxlJobHelper
.
handleFail
(
"command empty."
);
return
;
}
// command split
String
[]
commandArray
=
command
.
split
(
" "
);
// command process
ProcessBuilder
processBuilder
=
new
ProcessBuilder
();
processBuilder
.
command
(
commandArray
);
processBuilder
.
redirectErrorStream
(
true
);
Process
process
=
processBuilder
.
start
();
//Process process = Runtime.getRuntime().exec(command);
BufferedInputStream
bufferedInputStream
=
new
BufferedInputStream
(
process
.
getInputStream
());
bufferedReader
=
new
BufferedReader
(
new
InputStreamReader
(
bufferedInputStream
));
// command log
String
line
;
while
((
line
=
bufferedReader
.
readLine
())
!=
null
)
{
XxlJobHelper
.
log
(
line
);
}
// command exit
process
.
waitFor
();
exitValue
=
process
.
exitValue
();
}
catch
(
Exception
e
)
{
XxlJobHelper
.
log
(
e
);
}
finally
{
if
(
bufferedReader
!=
null
)
{
bufferedReader
.
close
();
}
}
if
(
exitValue
==
0
)
{
// default success
}
else
{
XxlJobHelper
.
handleFail
(
"command exit value("
+
exitValue
+
") is failed"
);
}
}
/**
* 4、跨平台Http任务
*
* 参数示例:
* <pre>
* {
* "url": "http://www.baidu.com",
* "method": "get",
* "data": "hello world"
* }
* </pre>
*/
@XxlJob
(
"httpJobHandler"
)
public
void
httpJobHandler
()
throws
Exception
{
// param
String
param
=
XxlJobHelper
.
getJobParam
();
if
(
param
==
null
||
param
.
trim
().
length
()==
0
)
{
XxlJobHelper
.
log
(
"param["
+
param
+
"] invalid."
);
XxlJobHelper
.
handleFail
();
return
;
}
// param parse
String
url
;
String
method
;
String
data
;
try
{
Map
<
String
,
String
>
paramMap
=
GsonTool
.
fromJson
(
param
,
Map
.
class
);
url
=
paramMap
.
get
(
"url"
);
method
=
paramMap
.
get
(
"method"
);
data
=
paramMap
.
get
(
"data"
);
}
catch
(
Exception
e
)
{
XxlJobHelper
.
log
(
e
);
XxlJobHelper
.
handleFail
();
return
;
}
// param valid
if
(
url
==
null
||
url
.
trim
().
isEmpty
())
{
XxlJobHelper
.
log
(
"url["
+
url
+
"] invalid."
);
XxlJobHelper
.
handleFail
();
return
;
}
if
(!
isValidDomain
(
url
))
{
XxlJobHelper
.
log
(
"url["
+
url
+
"] not allowed."
);
XxlJobHelper
.
handleFail
();
return
;
}
if
(
method
==
null
||
!
Arrays
.
asList
(
"GET"
,
"POST"
).
contains
(
method
.
toUpperCase
()))
{
XxlJobHelper
.
log
(
"method["
+
method
+
"] invalid."
);
XxlJobHelper
.
handleFail
();
return
;
}
method
=
method
.
toUpperCase
();
boolean
isPostMethod
=
method
.
equals
(
"POST"
);
// request
HttpURLConnection
connection
=
null
;
BufferedReader
bufferedReader
=
null
;
try
{
// connection
URL
realUrl
=
new
URL
(
url
);
connection
=
(
HttpURLConnection
)
realUrl
.
openConnection
();
// connection setting
connection
.
setRequestMethod
(
method
);
connection
.
setDoOutput
(
isPostMethod
);
connection
.
setDoInput
(
true
);
connection
.
setUseCaches
(
false
);
connection
.
setReadTimeout
(
5
*
1000
);
connection
.
setConnectTimeout
(
3
*
1000
);
connection
.
setRequestProperty
(
"connection"
,
"Keep-Alive"
);
connection
.
setRequestProperty
(
"Content-Type"
,
"application/json;charset=UTF-8"
);
connection
.
setRequestProperty
(
"Accept-Charset"
,
"application/json;charset=UTF-8"
);
// do connection
connection
.
connect
();
// data
if
(
isPostMethod
&&
data
!=
null
&&
!
data
.
trim
().
isEmpty
())
{
DataOutputStream
dataOutputStream
=
new
DataOutputStream
(
connection
.
getOutputStream
());
dataOutputStream
.
write
(
data
.
getBytes
(
StandardCharsets
.
UTF_8
));
dataOutputStream
.
flush
();
dataOutputStream
.
close
();
}
// valid StatusCode
int
statusCode
=
connection
.
getResponseCode
();
if
(
statusCode
!=
200
)
{
throw
new
RuntimeException
(
"Http Request StatusCode("
+
statusCode
+
") Invalid."
);
}
// result
bufferedReader
=
new
BufferedReader
(
new
InputStreamReader
(
connection
.
getInputStream
(),
StandardCharsets
.
UTF_8
));
StringBuilder
result
=
new
StringBuilder
();
String
line
;
while
((
line
=
bufferedReader
.
readLine
())
!=
null
)
{
result
.
append
(
line
);
}
String
responseMsg
=
result
.
toString
();
XxlJobHelper
.
log
(
responseMsg
);
return
;
}
catch
(
Exception
e
)
{
XxlJobHelper
.
log
(
e
);
XxlJobHelper
.
handleFail
();
return
;
}
finally
{
try
{
if
(
bufferedReader
!=
null
)
{
bufferedReader
.
close
();
}
if
(
connection
!=
null
)
{
connection
.
disconnect
();
}
}
catch
(
Exception
e2
)
{
XxlJobHelper
.
log
(
e2
);
}
}
}
// domain white-list, for httpJobHandler
private
static
Set
<
String
>
DOMAIN_WHITE_LIST
=
new
HashSet
<
String
>(
Arrays
.
asList
(
"http://www.baidu.com"
,
"http://cn.bing.com"
));
// valid if domain is in white-list
private
boolean
isValidDomain
(
String
url
)
{
if
(
url
==
null
||
DOMAIN_WHITE_LIST
.
isEmpty
())
{
return
false
;
}
for
(
String
prefix
:
DOMAIN_WHITE_LIST
)
{
if
(
url
.
startsWith
(
prefix
))
{
return
true
;
}
}
return
false
;
}
/**
* 5、生命周期任务示例:任务初始化与销毁时,支持自定义相关逻辑;
*/
@XxlJob
(
value
=
"demoJobHandler2"
,
init
=
"init"
,
destroy
=
"destroy"
)
public
void
demoJobHandler2
()
throws
Exception
{
XxlJobHelper
.
log
(
"XXL-JOB, Hello World."
);
}
public
void
init
(){
logger
.
info
(
"init"
);
}
public
void
destroy
(){
logger
.
info
(
"destroy"
);
}
}
xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties
deleted
100644 → 0
浏览文件 @
c7fec97e
# web port
server.port
=
8081
# no web
#spring.main.web-environment=false
# log config
logging.config
=
classpath:logback.xml
### xxl-job admin address list, such as "http://address" or "http://address01,http://address02"
xxl.job.admin.addresses
=
http://127.0.0.1:8080/xxl-job-admin
### xxl-job, access token
xxl.job.admin.accessToken
=
default_token
### xxl-job timeout by second, default 3s
xxl.job.admin.timeout
=
3
### xxl-job executor appname
xxl.job.executor.appname
=
xxl-job-executor-sample
### xxl-job executor registry-address: default use address to registry , otherwise use ip:port if address is null
xxl.job.executor.address
=
### xxl-job executor server-info
xxl.job.executor.ip
=
xxl.job.executor.port
=
9999
### xxl-job executor log-path
xxl.job.executor.logpath
=
/data/applogs/xxl-job/jobhandler
### xxl-job executor log-retention-days
xxl.job.executor.logretentiondays
=
30
xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/logback.xml
deleted
100644 → 0
浏览文件 @
c7fec97e
<?xml version="1.0" encoding="UTF-8"?>
<configuration
debug=
"false"
scan=
"true"
scanPeriod=
"1 seconds"
>
<contextName>
logback
</contextName>
<property
name=
"log.path"
value=
"${LOG_HOME:-/data/applogs}/xxl-job/xxl-job-executor-sample-springboot.log"
/>
<appender
name=
"console"
class=
"ch.qos.logback.core.ConsoleAppender"
>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<appender
name=
"file"
class=
"ch.qos.logback.core.rolling.RollingFileAppender"
>
<file>
${log.path}
</file>
<rollingPolicy
class=
"ch.qos.logback.core.rolling.TimeBasedRollingPolicy"
>
<fileNamePattern>
${log.path}.%d{yyyy-MM-dd}.log
</fileNamePattern>
</rollingPolicy>
<encoder>
<pattern>
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
</pattern>
</encoder>
</appender>
<root
level=
"info"
>
<appender-ref
ref=
"console"
/>
<!--<appender-ref ref="file"/>-->
</root>
</configuration>
\ No newline at end of file
xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/test/java/com/xxl/job/executor/test/XxlJobExecutorExampleBootApplicationTests.java
deleted
100644 → 0
浏览文件 @
c7fec97e
package
com
.
xxl
.
job
.
executor
.
test
;
import
org.junit.jupiter.api.Test
;
import
org.springframework.boot.test.context.SpringBootTest
;
@SpringBootTest
public
class
XxlJobExecutorExampleBootApplicationTests
{
@Test
public
void
test
()
{
System
.
out
.
println
(
11
);
}
}
\ No newline at end of file
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论