数据库|xxl-job分布式任务调度框架使用实战

前言 一般来讲,定时任务都会使用quartz,springboot本身也整合了Scucher做定时任务,但是,怎么来讲这都是单个服务使用的,侵入性较强。
而xxl-job是一个分布式任务调度服务框架,简单易用。因为在公司的项目中,我们已经使用了这个框架,因此,我想写篇文章介绍这个框架如何使用的。
下载 xxl-job分布式任务调度平台已经开源了,我们可以在https://gitee.com/xuxueli0323/xxl-job.git下载源码。
里面其实有示例的,也有文档,写得还是很详细的。在这里我就下载最新的作为演示使用吧。
下载下来的项目结构是这样。
数据库|xxl-job分布式任务调度框架使用实战
文章图片

结构分析:
db目录下的是一个mysql脚本,创建任务调度平台需要的表。
xxl-job-admin是分布式调度中心的源码。
xxl-job-core是分布式调度平台的公共依赖。
【数据库|xxl-job分布式任务调度框架使用实战】xxl-job-executor-samples是分布式调度平台各个架构下的执行器例子。
架构图 数据库|xxl-job分布式任务调度框架使用实战
文章图片

创建数据库表 执行db目录下的tables_xxl_job.sql脚本。会创建xxl_job数据库和一系列数据表,如下图。
数据库|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 spring.mail.username=xxx@qq.com 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。
数据库|xxl-job分布式任务调度框架使用实战
文章图片

配置执行器 我是在springboot的基础上配置执行器的,项目需要引入公共依赖:
com.xuxueli xxl-job-core ${project.parent.version}

添加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="https://www.it610.com/article/自定义jobhandler名称")”注解,注解value值对应的是调度中心新建任务的JobHandler属性的值。 * 4、执行日志:需要通过 "XxlJobLogger.log" 打印执行日志; * * @author xuxueli 2015-12-19 19:43:36 */ @JobHandler(value="https://www.it610.com/article/demoJobHandler") @Component public class DemoJobHandler extends IJobHandler {@Override public ReturnT 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参数
数据库|xxl-job分布式任务调度框架使用实战
文章图片

在任务管理中,选择刚才我们创建的执行器,然后点击新增
数据库|xxl-job分布式任务调度框架使用实战
文章图片

数据库|xxl-job分布式任务调度框架使用实战
文章图片

因为我们使用代码创建执行器所以运行模式是BEAN,JobHandler是我们执行器代码注解的名称@JobHandler(value=https://www.it610.com/article/“demoJobHandler”)
到这里,我们就创建好调度任务了,在操作按钮下点击执行一次,执行一下调度任务。
然后,我们可以在调度日志中查看调度任务执行的情况了,可以查看调度结果、执行日志还可以终止任务。
数据库|xxl-job分布式任务调度框架使用实战
文章图片

总结 到这里,xxl-job的使用基本完成了。我们可以看出xxl-job使用起来还是比较简单的,轻量化,代码耦合性比较低。
以上就是我在项目中使用xxl-job的实践过程,做个分享,喜欢的话可以关注我的个人公众号哦。
THE END 数据库|xxl-job分布式任务调度框架使用实战
文章图片

    推荐阅读