当前位置:   article > 正文

一个极其简单方便的自动化任务的工具——xxl-job_xxljobconfig

xxljobconfig

前言

想必你可能遇到过一个情况:你的领导有时候会给你说一句,要不你去写一个定时任务去执行不就行了。也许你不知道怎么写,这篇文章就能让你快速掌握如何自己创建一个自动化任务。

简介

首先说说什么是自动任务吧!简而言之就是在特定时间上自动执行,不需要人为去执行。常见的自动化任务的工具有很多,比如说Quartz 、spring task、xxl-job等。但是在说这些东西执行,一定要先了解一下cron表达式

cron表达式

cron表达式是一个字符串, 用来设置定时规则, 由七部分组成, 每部分中间用空格隔开
在这里插入图片描述
另外,cron表达式还包含了一些特殊符号来设置更加灵活的定时规则。
在这里插入图片描述
光看这些可能很难理解,下面是一些例子
在这里插入图片描述
其实这个东西,你只要知道是什么就行了,刚开始的时候,直接cron表达式生成查找就行了,后面做的多了自然就知道怎么写了。

前期准备

我们先说一下xxl-job,它是一个分布式任务调度平台。
特点

  • 简单灵活

    1. 提供的有web页面可以进行管理,可以非常直观的看到具体情况
  • 丰富的任务管理功能

    1. 支持页面对任务CRUD操作;
    2. 支持在页面编写脚本任务、命令行任务、Java代码任务并执行;
    3. 支持任务级联编排,父任务执行结束后触发子任务执行;
    4. 支持设置指定任务执行节点路由策略,包括轮询、随机、广播、故障转移、忙碌转移等;
    5. 支持Cron方式、任务依赖、调度中心API接口方式触发任务执行
  • 高性能

    1. 任务调度流程全异步化设计实现,如异步调度、异步运行、异步回调等,有效对密集调度进行流量削峰
  • 高可用

    1. 任务调度中心、任务执行节点均 集群部署,支持动态扩展、故障转移
    2. 支持任务配置路由故障转移策略,执行器节点不可用是自动转移到其他节点执行
    3. 支持任务超时控制、失败重试配置
    4. 支持任务处理阻塞策略:调度当任务执行节点忙碌时来不及执行任务的处理策略,包括:串行、抛弃、覆盖策略
  • 易于监控运维

    1. 支持实时查看任务执行运行数据统计图表、任务进度监控数据、任务完整执行日志

    如何使用呢?

  1. 首先要下载源码
    在这里插入图片描述
    下载完源码之后打开就是这样的。
    首先把里面db中的表导入你的数据库中
    在这里插入图片描述
 - xxl_job_group:执行器信息表,维护任务执行器信息;
 - xxl_job_info:调度扩展信息表: 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
 - xxl_job_lock:任务调度锁表;
 - xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
 - xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
 - xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
 - xxl_job_user:系统用户表;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  1. 配置调度中心(xxl-job-admin)
    配置该模块的数据源,然后启动,就能访问到xxl-job-admin的web界面了,默认的账户密码是:admin/123456
    在这里插入图片描述
    3.使用管理中心
    建立执行器
    在这里插入图片描述
    按道理 一个项目一个执行器 便于管理。代表的意思是我们的任务用这个执行器进行执行。
    新建任务
    在这里插入图片描述
    启动就可以了
    在这里插入图片描述

springboot与xxl-job进行集成

上面说的只是说这个东西怎么用,具体集成主要分为两步。
第一步:
将你下载的xxl-job的源码中的
在这里插入图片描述
这个核心模块安装到你的maven仓库中保证你可以使用
安装步骤
在这里插入图片描述
第二步:
在你的项目里面引入xxl-job的依赖

<dependency>
            <groupId>com.xuxueli</groupId>
            <artifactId>xxl-job-core</artifactId>
            <version>2.2.0-SNAPSHOT</version>
        </dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

配置xxl-job的配置

xxl.job.admin.addresses=http://127.0.0.1:8080/xxl-job-admin

### xxl-job, access token
xxl.job.accessToken=

### xxl-job executor appname
xxl.job.executor.appname=xxl-job-executor-sample2
### 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="1 seconds">

    <contextName>logback</contextName>
    <property name="log.path" value="/data/applogs/xxl-job/xxl-job-executor-sample-springboot.log"/>

    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} %contextName [%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}.zip</fileNamePattern>
        </rollingPolicy>
        <encoder>
            <pattern>%date %level [%thread] %logger{36} [%file : %line] %msg%n
            </pattern>
        </encoder>
    </appender>

    <root level="info">
        <appender-ref ref="console"/>
        <appender-ref ref="file"/>
    </root>

</configuration>
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

编写配置类

/**
 * 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.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、引入依赖:
     *          <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();
     */


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69

创建定时任务

@Component
public class HelloJob {

    /**
     * 1、简单任务示例(Bean模式)
     */
    @XxlJob("job_hander01")
    public ReturnT<String> demoJobHandler(String param) throws Exception {

        System.out.println("当前任务执行了...."+new Date());

        return ReturnT.SUCCESS;
    }


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

这个主要是使用那个 @XxlJob 注解

注意点(三个):

  • 这个注解里面的值必须与你在xxl-job-admin中配置的
    在这里插入图片描述
    保持一致,他要根据这个进行找你配置的定时任务是哪一个

  • 上面写的logback.xml配置文件不是必须的,也可以不要

  • 使用的环境:maven3+、jdk1.8+ 、mysql5.7+

这个springboot与xxl-job的融合 ,你下的源码里面提供的也有
在这里插入图片描述
你也可以看看

项目中使用

我们有的时候不需要在xxl-job的管理界面去生成任务,可以直接去配置xxl_job_info表中的数据也是一样的。比如页面上直接配置xxl_job_info表中需要的数据即可。也可以配置一个定时任务去动态生成这些任务。
比如下方xxl-job工具类:

@Component
public class XxlJobUtil {

    private static String appname;
    private static Integer groupId;


    static XxlJobMapper xxlJobMapper;

    @Autowired
    public XxlJobUtil(XxlJobMapper mapper) {
        xxlJobMapper= mapper;
    }


    @Value("${xxl.job.executor.appname}")
    public void setAppname(String appname) {
        XxlJobUtil.appname = appname;
    }

    @PostConstruct
    public void init() {
        initGroupId();
    }




    /**
     * 初始化获取执行器id
     **/
    public static void initGroupId() {
        // 查询对应groupId:
        Map param = new HashMap();
        param.put("appName",appname);
        Integer groupId = xxlJobMapper.queryByAppName(param);
        XxlJobUtil.groupId = groupId;
    }

    /**
     * 添加任务
     * @param jobInfo 任务信息
     **/
    public static int add(XxlJobInfo jobInfo) {
        jobInfo.setJobGroup(groupId);
        return  xxlJobMapper.save(jobInfo);
    }


    /**
     * 修改任务
     **/
    public static void update(XxlJobInfo jobInfo) {
        xxlJobMapper.updateTask(jobInfo);
    }

    /**
     * 删除任务
     * @param ids 任务id
     **/
    public static void remove(List<Integer> ids) {
        xxlJobMapper.deleteTask(ids);
    }

    /**
     * 暂停任务
     * @param ids 任务id
     * @return {@link String}
     **/
    public static void pause(List<Integer> ids) {
        xxlJobMapper.pauseTask(ids);
    }

    /**
     * 开始任务
     * @param ids 任务id
     * @return {@link String}
     **/
    public static void start(List<Integer> ids) {
        xxlJobMapper.startTask(ids);
    }


}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/489235
推荐阅读