一般来讲,定时任务都会使用quartz,springboot本身也整合了Scucher做定时任务,但是,怎么来讲这都是单个服务使用的,侵入性较强。
而xxl-job是一个分布式任务调度服务框架,简单易用。因为在公司的项目中,我们已经使用了这个框架,因此,我想写篇文章介绍这个框架如何使用的。
xxl-job分布式任务调度平台已经开源了,我们可以在https://gitee.com/xuxueli0323/xxl-job.git下载源码。
里面其实有示例的,也有文档,写得还是很详细的。在这里我就下载最新的作为演示使用吧。
下载下来的项目结构是这样。
结构分析:
db目录下的是一个mysql脚本,创建任务调度平台需要的表。
xxl-job-admin是分布式调度中心的源码。
xxl-job-core是分布式调度平台的公共依赖。
xxl-job-executor-samples是分布式调度平台各个架构下的执行器例子。
执行db目录下的tables_xxl_job.sql脚本。会创建xxl_job数据库和一系列数据表,如下图。
### web
server.port=8080
server.context-path=/xxl-job-admin
### actuator
management.context-path=/actuator
management.health.mail.enabled=false
### resources
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/
### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########
### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://localhost:3306/xxl_job?Unicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=30
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.validation-interval=30000
### xxl-job email
spring.mail.host=smtp.qq.com
spring.mail.port=25
[email protected]
spring.mail.password=xxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
### xxl-job, access token
xxl.job.accessToken=
### xxl-job, i18n (default empty as chinese, "en" as english)
xxl.job.i18n=
## xxl-job, triggerpool max size
xxl.job.triggerpool.fast.max=200
xxl.job.triggerpool.slow.max=100
### xxl-job, log retention days
xxl.job.logretentiondays=30
#登录调度中心的用户名和密码
xxl.job.login.username=admin
xxl.job.login.password=123456
主要是配置好自己的数据库地址和用户名、密码,其他的都可以使用默认的。
配置好后就可以启动项目了。使用 http://localhost:8080/xxl-job-admin 访问调度中心。登录用户名/密码默认为admin/123456。
我是在springboot的基础上配置执行器的,项目需要引入公共依赖:
<!-- xxl-job-core -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>${project.parent.version}</version><!-- 版本号 -->
</dependency>
添加xxl-job配置类,代码如下:
package com.xxl.job.executor.core.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.executor.appname}")
private String appName;
@Value("${xxl.job.executor.ip}")
private String ip;
@Value("${xxl.job.executor.port}")
private int port;
@Value("${xxl.job.accessToken}")
private String accessToken;
@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.setIp(ip);
xxlJobSpringExecutor.setPort(port);
xxlJobSpringExecutor.setAccessToken(accessToken);
xxlJobSpringExecutor.setLogPath(logPath);
xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);
return xxlJobSpringExecutor;
}
}
application.properties配置如下
# web port
server.port=8081
# 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:/localhost:8080/xxl-job-admin
### xxl-job executor address
xxl.job.executor.appname=sftp-sync-service
xxl.job.executor.ip=
xxl.job.executor.port=9998
### xxl-job, access token
xxl.job.accessToken=
### xxl-job log path
xxl.job.executor.logpath=/usr/local/vvm/logs/ftp-sync-server/jobhandler
### xxl-job log retention days
xxl.job.executor.logretentiondays=30
执行器配置就配好了,然后我们就需要使用配置好的执行器创建业务代码。
package com.xxl.job.executor.service.jobhandler;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.JobHandler;
import com.xxl.job.core.log.XxlJobLogger;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;
/**
* 任务Handler示例(Bean模式)
*
* 开发步骤:
* 1、继承"IJobHandler":“com.xxl.job.core.handler.IJobHandler”;
* 2、注册到Spring容器:添加“@Component”注解,被Spring容器扫描为Bean实例;
* 3、注册到执行器工厂:添加“@JobHandler(value="自定义jobhandler名称")”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值。
* 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志;
*
* @author xuxueli 2015-12-19 19:43:36
*/
@JobHandler(value="demoJobHandler")
@Component
public class DemoJobHandler extends IJobHandler {
@Override
public ReturnT<String> execute(String param) throws Exception {
XxlJobLogger.log("XXL-JOB, Hello World.");
System.out.println(param);
for (int i = 0; i < 5; i++) {
XxlJobLogger.log("beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
System.out.println("118888888********111111");
return SUCCESS;
}
}
启动执行器。
回到调度中心,打开执行器管理,点击新增执行器,填写执行器的信息然后保存。
AppName是配置的xxl.job.executor.appname=mydemo参数
在任务管理中,选择刚才我们创建的执行器,然后点击新增
因为我们使用代码创建执行器所以运行模式是BEAN,JobHandler是我们执行器代码注解的名称@JobHandler(value=“demoJobHandler”)
到这里,我们就创建好调度任务了,在操作按钮下点击执行一次,执行一下调度任务。
然后,我们可以在调度日志中查看调度任务执行的情况了,可以查看调度结果、执行日志还可以终止任务。
到这里,xxl-job的使用基本完成了。我们可以看出xxl-job使用起来还是比较简单的,轻量化,代码耦合性比较低。
以上就是我在项目中使用xxl-job的实践过程,做个分享,喜欢的话可以关注我的个人公众号哦。