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

发布时间:2022-08-19 11:59

前言

一般来讲,定时任务都会使用quartz,springboot本身也整合了Scucher做定时任务,但是,怎么来讲这都是单个服务使用的,侵入性较强。

而xxl-job是一个分布式任务调度服务框架,简单易用。因为在公司的项目中,我们已经使用了这个框架,因此,我想写篇文章介绍这个框架如何使用的。

下载

xxl-job分布式任务调度平台已经开源了,我们可以在https://gitee.com/xuxueli0323/xxl-job.git下载源码。

里面其实有示例的,也有文档,写得还是很详细的。在这里我就下载最新的作为演示使用吧。

下载下来的项目结构是这样。

xxl-job分布式任务调度框架使用实战_第1张图片

结构分析:

db目录下的是一个mysql脚本,创建任务调度平台需要的表。

xxl-job-admin是分布式调度中心的源码。

xxl-job-core是分布式调度平台的公共依赖。

xxl-job-executor-samples是分布式调度平台各个架构下的执行器例子。

架构图

xxl-job分布式任务调度框架使用实战_第2张图片

创建数据库表

执行db目录下的tables_xxl_job.sql脚本。会创建xxl_job数据库和一系列数据表,如下图。
xxl-job分布式任务调度框架使用实战_第3张图片

调度中心配置


### 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分布式任务调度框架使用实战_第4张图片

配置执行器

我是在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参数
xxl-job分布式任务调度框架使用实战_第5张图片
在任务管理中,选择刚才我们创建的执行器,然后点击新增

xxl-job分布式任务调度框架使用实战_第6张图片
xxl-job分布式任务调度框架使用实战_第7张图片
因为我们使用代码创建执行器所以运行模式是BEAN,JobHandler是我们执行器代码注解的名称@JobHandler(value=“demoJobHandler”)

到这里,我们就创建好调度任务了,在操作按钮下点击执行一次,执行一下调度任务。

然后,我们可以在调度日志中查看调度任务执行的情况了,可以查看调度结果、执行日志还可以终止任务。

xxl-job分布式任务调度框架使用实战_第8张图片

总结

到这里,xxl-job的使用基本完成了。我们可以看出xxl-job使用起来还是比较简单的,轻量化,代码耦合性比较低。

以上就是我在项目中使用xxl-job的实践过程,做个分享,喜欢的话可以关注我的个人公众号哦。

THE END

xxl-job分布式任务调度框架使用实战_第9张图片

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号