XXL-JOB及Cron表达式

一、XXL-JOB简述

XXL-JOB是一个分布式任务调度平台;核心设计目标是学习简单、开发迅速、轻量级、易扩展

部分特性:
1、调度采用中心式设计,任务分布式执行;调度中心和任务执行器都支持集群部署
2、执行器会自动注册任务, 调度中心将会自动触发任务执行;
3、一旦有新执行器机器上线或者下线,下次调度时将会重新分配任务;
4、提供多种触发策略:Cron触发、固定间隔触发、固定延时触发、API(事件)触发、人工触发;
5、调度过于频繁,任务来不及处理时,可采用的策略有:
单机串行(默认):调度请求进入单机执行器后,请求进入FIFO队列并以串行方式运行;
丢弃后续调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,本次请求将会被丢弃并标记为失败;
覆盖之前调度:调度请求进入单机执行器后,发现执行器存在运行的调度任务,将会终止运行中的调度任务并清空队列,然后运行本地调度任务
6、支持自定义任务超时时间,任务运行超时将会主动中断任务;
7、可以自定义任务失败重试次数,当任务失败时将会按照预设的失败重试次数主动进行重试;
8、任务失败告警:默认提供邮件方式失败告警;配置多个邮箱地址时用逗号分隔
9、支持多种脚本任务,包括Shell、Python、NodeJS、PHP、PowerShell等类型脚本;
10、采用集群部署时,有多种丰富路由策略
故障转移:如果执行器集群中某一台机器故障,将会自动切换到正常的执行器发送调度请求
第一个:固定选择第一个机器;
最后一个:固定选择最后一个机器;
轮询:依次选取执行器管理的注册地址列表中的执行器;
随机:在执行器管理的注册地址列表中随机选取一个在线的机器;
一致性HASH:每个任务按照Hash算法固定选择某一台机器,且所有任务均匀散列在不同机器上;
最不经常使用:使用频率最低的机器优先被选举;
最近最久未使用:最久未使用的机器优先被选举;
忙碌转移:按照顺序依次进行空闲检测,第一个空闲检测成功的机器选定为目标执行器并发起调度;
分片广播:广播触发对应集群中所有机器执行一次任务,同时系统自动传递分片参数;可根据分片参数开发分片任务;

二、搭建xxl-Job

环境
Maven3+
Jdk1.8+
Mysql8.0+

2.1 执行初始化sql脚本

将源码下载并解压后,找到/xxl-job/doc/db/tables_xxl_job.sql文件到数据库中执行
其中:
xxl_job_group:执行器信息表,维护任务执行器信息;
xxl_job_info:调度扩展信息表, 用于保存XXL-JOB调度任务的扩展信息,如任务分组、任务名、机器地址、执行器、执行入参和报警邮件等等;
xxl_job_lock:任务调度锁表;
xxl_job_log:调度日志表: 用于保存XXL-JOB任务调度的历史信息,如调度结果、执行结果、调度入参、调度机器和执行器等等;
xxl_job_log_report:调度日志报表:用户存储XXL-JOB任务调度日志的报表,调度中心报表功能页面会用到;
xxl_job_logglue:任务GLUE日志:用于保存GLUE更新历史,用于支持GLUE的版本回溯功能;
GLUE是一种任务调度模式,允许用户直接在调度中心编写和执行任务代码,而无需将代码部署到执行器。
xxl_job_registry:执行器注册表,维护在线的执行器和调度中心机器地址信息;
xxl_job_user:系统用户表;

2.2 引入依赖

<dependency>
    <groupId>com.xuxueli</groupId>
    <artifactId>xxl-job-core</artifactId>
    <version>2.4.1</version>
</dependency>

2.3 xxl-job配置

源码的调度中心配置文件位置
/xxl-job/xxl-job-admin/src/main/resources/application.properties;

项目中配置中心的配置:
application.yml:

server:
  #配置中心端口;与执行器中配置保持一致
  port: 8080
  servlet:  
    context-path: /xxl-job-admin  
  
management:  
  server:  
    servlet:  
      context-path: /actuator  
  health:  
    mail:  
      enabled: false  

#mybatis
mybatis:
	mapper-locations: classpath:/mybatis-mapper/*Mapper.xml
  
spring:
  #配置数据源信息
  datasource:
    url: jdbc:mysql://127.0.0.1:3306/xxl_job
    username: root  
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
    #多数据源 
    type: com.zaxxer.hikari.HikariDataSource  
    hikari:  
      pool-name: 连接池的名
      minimum-idle: 10  
      maximum-pool-size: 20  
      auto-commit: true  
      idle-timeout: 30000  
      max-lifetime: 900000  
      connection-timeout: 10000  
      connection-test-query: SELECT 1  
      validation-timeout: 1000  
  # 报警邮箱 
  mail:  
    host: smtp.qq.com  
    port: 25  
    username: xxx@qq.com  
    from: xxx@qq.com  
    password: xxx  
    properties:  
      mail:  
        smtp:  
          auth: true  
          starttls:  
            enable: true  
            required: true  
          socketFactory:  
            class: javax.net.ssl.SSLSocketFactory
  
xxl:  
  job:
  	#执行器通讯TOKEN [选填]:非空时启用;
    accessToken: default_token
    #调度中心国际化配置 [必填]: 默认为 "zh_CN"/中文简体
    i18n: zh_CN
    # 调度线程池最大线程配置【必填】
    triggerpool:  
      fast:  
        max: 200  
      slow:  
        max: 100
    # 调度中心日志表数据保存天数 [必填]
    logretentiondays: 30

执行器的配置:
源代码位置:/xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/resources/application.properties

项目中配置:
xxl-job.yml

xxl:  
  job:  
    admin:  
      #调度中心部署根地址 [选填],执行器将会使用该地址进行"执行器心跳注册"和"任务结果回调"
      addresses: http://127.0.0.1:8080/xxl-job-admin
    #执行器通讯TOKEN [选填]
    accessToken: default_token  
    executor:  
      appname: testJob 
      #执行器IP [选填]:默认为空表示自动获取IP  
      address: 
      ip:
      #执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999,单机部署多个执行器时,注意要配置不同执行器端口;
      port: 9999
      #执行器运行日志文件存储磁盘路径
      logpath: /data/applogs/xxl-job/jobhandler
      # 执行器日志文件保存天数 [选填] 
      logretentiondays: 30

2.4 执行器组件

源代码位置: /xxl-job/xxl-job-executor-samples/xxl-job-executor-sample-springboot/src/main/java/com/xxl/job/executor/core/config/XxlJobConfig.java

项目中使用:

@Configuration
@Slf4j
public class XxlJobConfig {
    @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() {
        log.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;
    }
}

2.5 开发任务

BEAN模式(方法形式):每个任务只需要开发一个方法,并添加”@XxlJob”注解即可

@XxlJob("jobHandler")
public void jobHandler() throws Exception {
    XxlJobHelper.log("执行成功");
}

2.6 访问调度中心

地址:http://localhost:8080/xxl-job-admin (该地址执行器将会使用到,作为回调地址)
默认登录账号 “admin/123456”

想要修改登陆密码时:
用默认密码(amdin/123456)登陆web页面,然后右上角点击修改密码
或者直接数据库中修改密码(采用MD5算法32位小写加密)

三、Cron表达式

是一个用于定义计划任务执行时间的字符串
{秒数} {分钟} {小时} {日期} {月份} {星期} {年份(可为空)}
秒:0-59之间的整数,可选
‌分:0-59之间的整数,可以使用“”表示每分钟,“-”表示范围,“/”表示步长
‌时:0-23之间的整数
‌日:1-31之间的整数,可以使用“
”表示每月的每一天,“L”表示月的最后一天,“?”表示不指定日期
‌月:1-12之间的整数或JAN-DEC
‌周:1-7之间的整数或SUN-SAT,1表示星期天,2表示星期一。可以使用“?”表示不指定星期几,使用“L”表示月的最后一个工作日

示例:
0 0 1 * * ? 每天凌晨1点执行
0 3 0 1 * ? 每个月的1号凌晨3点执行

/ 在某个域上周期性触发
0 */1 * * * ? 每隔1分钟执行一次
0 0/3 14 * * ? 在每天下午2点到下午2:55期间的每3分钟触发一次

0 0-3 14 * * ? 在每天下午2点到下午2:03期间的每1分钟触发一次

, 指的是在两个以上的时间点中都执行
0 0/3 14,15 * * ? 在每天下午2点到下午2:55期间以及3点到3点55期间每3分钟触发一次

L 表示英文中的LAST 的意思,只能在 “日”和“周”中使用
0 0 20 L * ? 每月最后一天20点执行一次

W 表示离指定日期的最近那个工作日(周一至周五)触发
0 10 10 LW * ? 每个月最后一个工作日的10点10触发任务

#表示每月的第几个周几,只能作用于 “周” 上
0 10 10 ? * 5#3 每个月第三周的星期四的10点10分触发任务

注意:
日期冲突‌:
日期和星期字段通常不会同时指定,因为它们可能会产生冲突。
如果同时指定了这两个字段,Cron表达式会优先匹配日期字段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值