在日常开发中经常遇到任务调度的需求,下面体验一下分布式调度xxl-job。
下面对xxl-job实现任务调度尝试一下。
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
XXL-JOB特性:
下载地址如下:
此处下载的版本的xxl-job-2.3.1.tar.gz,首先解压到指定目录,获取 “调度数据库初始化SQL脚本” 并执行即可。
“调度数据库初始化SQL脚本” 位置为:/xxl-job/doc/db/tables_xxl_job.sql
然后将源码导入IDE,使用maven进行编译即可,源码结构如下:
xxl-job-admin:调度中心
xxl-job-core:公共依赖
xxl-job-executor-samples:执行器Sample示例(选择合适的版本执行器,可直接使用,也可以参考其并将现有项目改造成执行器)
:xxl-job-executor-sample-springboot:Springboot版本,通过Springboot管理执行器,推荐这种方式;
:xxl-job-executor-sample-frameless:无框架版本;
调度中心配置文件地址:/xxl-job/xxl-job-admin/src/main/resources/application.properties
将mysql数据库的连接信息修改为本地数据库,将报警邮箱信息修改为自己的邮箱信息。
最后,启动调度中心服务即可。
调度中心访问地址:http://localhost:8080/xxl-job-admin
默认登录账号:admin/123456
部署执行器项目xxl-job-executor-sample-springboot中配置文件
源码中提供多种版本执行器供选择,现以 springboot 版本为例,可直接使用,也可以参考其并将现有项目改造成执行器。
其作用为负责接收“调度中心”的调度并执行;可直接部署执行器,也可以将执行器集成到现有业务项目中。
执行器配置文件地址:/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties
将配置文件中的调度中心的地址修改为本地信息,其他默认,具体详细解释参见官网。
最后,启动执行器服务即可,执行器服务部署成功。
新建一个 “GLUE模式(Java)” 运行模式的任务为例。
“GLUE模式(Java)”的执行代码托管到调度中心在线维护,相比“Bean模式任务”需要在执行器项目开发部署上线,更加简便轻量。
确认“调度中心”和“执行器”项目已经成功部署并启动;
新建任务,参考如下
点击任务右侧“GLUE”按钮,进入GLUE便捷开发界面,如下
“GLUE模式(Java)” 运行模式的任务默认已经初始化了示例任务代码,即打印Hello World。
点击任务右侧“执行一次”按钮,可手动触发一次任务的执行,或“启动”,通过Cron表达式进行任务调度触发。
点击任务右侧“日志”按钮或左侧菜单,可前往调度日志界面查看任务日志,如下
在调度日志界面,点击每个日志右侧“执行日志”按钮,可进入日志控制台查看执行日志,如下
可以将源码中的xxl-job-executor-sample-springboot项目进行改造,或新建一个springboot项目,然后参照xxl-job-executor-sample-springboot项目进行搭建。
添加依赖,如下
com.xuxueli
xxl-job-core
2.3.1
修改配置文件application.properties
# web port
server.port=8082
# 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.accessToken=default_token
### 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
添加XxlJobConfig配置
@Configuration
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value("${xxl.job.admin.addresses}")
private String adminAddresses;
@Value("${xxl.job.accessToken}")
private String accessToken;
@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.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
/**
* 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;
*
* 1、引入依赖:
*
* org.springframework.cloud
* spring-cloud-commons
* ${version}
*
*
* 2、配置文件,或者容器启动变量
* spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'
*
* 3、获取IP
* String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();
*/
}
添加定时器任务,类似如下
@Component
public class HelloXxlJob {
@XxlJob("helloJobHandler")
public void helloJobHandler() throws Exception {
XxlJobHelper.log("Hello World.");
for (int i = 0; i < 5; i++) {
XxlJobHelper.log("times :" + i);
TimeUnit.SECONDS.sleep(2);
}
}
}
在调度中心,新建调度任务,运行模式选中“BEAN模式”,JobHandler属性填写任务注解“@XxlJob”中定义的值
选择执行一次或是启动,查看日志,如下
xxl-job任务调度上手还是非常方便的,在后续的工程中可以尝试应用~
注:若需要了解更多内容,参加官网:https://www.xuxueli.com/index.html