定时任务表达式生成工具网站:https://cron.qqe2.com/
定时任务选型:
xxl-job 官方文档:https://www.xuxueli.com/xxl-job/
安装定时任务调度中心 xxl-job-admin
第一步、先导入xxl-job的数据库:
地址:https://gitee.com/xuxueli0323/xxl-job/tree/master/doc/db
修改数据库的用户名和密码并同时开启外部访问权限
docker安装xxl-job-admin 步骤:
拉取镜像
docker pull xuxueli/xxl-job-admin:2.3.1
开放端口
firewall-cmd --zone=public --add-port=8090/tcp --permanent
运行镜像
docker run -d \
--name xxl-job-admin \
-p 8090:8080 \
-e JVM_XMS=128m \
-e JVM_XMX=512m \
xuxueli/xxl-job-admin:2.3.1
创建配置挂载目录
mkdir -p /docker/xxl-job/config/application.properties
mkdir -p /docker/xxl-job/logs
复制配置
docker cp xxl-job-admin:/data/applogs/xxl-job /docker/xxl-job/logs
删除运行中的镜像
docker rm -f xxl-job-admin
完整的运行镜像
docker run -d \
--name xxl-job-admin \
-p 8090:8080 \
-e JVM_XMS=128m \
-e JVM_XMX=512m \
-v /docker/xxl-job/config/application.properties:/application.properties \
-v /docker/xxl-job/logs:/data/applogs \
xuxueli/xxl-job-admin:2.3.1
修改外部映射的配置文件application.properties中的数据源地址配置
访问:http://192.168.56.10:8090/xxl-job-admin
默认账号密码:admin、123456
spring boot项目整合 xxl-job
首先引入依赖:
<!-- https://mvnrepository.com/artifact/com.xuxueli/xxl-job-core -->
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.1</version>
</dependency>
安装好xxl-job-admin 定时任务调度中心后,在项目中配置 xxl-job 参数配置 xxl-job 参数,用于创建执行器和连接调度中心,参考如下:
@Getter
@Setter
public class XxlJobAdminProperties {private String address;
}
@Getter
@Setter
public class XxlJobExecutorProperties {/*** 执行器AppName [选填]:执行器心跳注册分组依据;为空则关闭自动注册*/private String appname;/*** 服务注册地址,优先使用该配置作为注册地址 为空时使用内嵌服务 ”IP:PORT“ 作为注册地址 从而更灵活的支持容器类型执行器动态IP和动态映射端口问题*/private String address;/*** 执行器IP [选填]:默认为空表示自动获取IP,多网卡时可手动设置指定IP ,该IP不会绑定Host仅作为通讯实用;地址信息用于 "执行器注册" 和* "调度中心请求并触发任务"*/private String ip;/*** 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9099,单机部署多个执行器时,注意要配置不同执行器端口;*/private Integer port = 9099;/*** 执行器通讯TOKEN [必填]:从配置文件中取不到值时使用默认值;*/private String accessToken = "default_token";/*** 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;*/private String logPath = "logs/applogs/xxl-job/jobhandler";/*** 执行器日志保存天数 [选填] :值大于3时生效,启用执行器Log文件定期清理功能,否则不生效;*/private Integer logRetentionDays = 30;}
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "xxl.job")
public class XxlJobProperties {@NestedConfigurationPropertyprivate XxlJobAdminProperties admin;@NestedConfigurationPropertyprivate XxlJobExecutorProperties executor;}
xxl:job:admin:address: http://192.168.56.10:8090/xxl-job-adminexecutor:address:appname: xxl-job-executor-orderip:port: 9999log-path: /data/applogs/xxl-job/jobhandlerlog-retention-days: 30access-token: default_token
特别提醒:在配置文件中配置 xxl-job 参数时,不要配置executor执行器的address 和 ip 这两个属性,自己配置容易出问题,使用默认的策略就好。
配置自定义执行器:
@Slf4j
@Configuration
public class XxlJobConfig {@Beanpublic XxlJobSpringExecutor xxlJobSpringExecutor(XxlJobProperties properties) {XxlJobSpringExecutor executor = new XxlJobSpringExecutor();executor.setAdminAddresses(properties.getAdmin().getAddress());executor.setAddress(properties.getExecutor().getAddress());executor.setAppname(properties.getExecutor().getAppname());executor.setIp(properties.getExecutor().getIp());executor.setPort(properties.getExecutor().getPort());executor.setAccessToken(properties.getExecutor().getAccessToken());executor.setLogPath(properties.getExecutor().getLogPath());executor.setLogRetentionDays(properties.getExecutor().getLogRetentionDays());return executor;}@XxlJob("xxlJobHandler")public void xxlJobHandler() {String jobParam = XxlJobHelper.getJobParam();log.info("【xxlJobHandler】 定时任务开始执行,参数为:{}", jobParam);}}
上面的配置类 XxlJobConfig 中注入的Bean就是自定义定时任务执行器,执行器下方的方法,如下:
@XxlJob("xxlJobHandler")public void xxlJobHandler() {String jobParam = XxlJobHelper.getJobParam();log.info("【xxlJobHandler】 定时任务开始执行,参数为:{}", jobParam);}
这个是一个调度任务,@XxlJob("xxlJobHandler") 注解就可以声明一个调度任务,其中的值 xxlJobHandler 就是调度任务的名称
以上步骤做完先不要启动项目,还需要在xxl-job-admin 调度中心配置执行器和调度任务
准备执行 xxlJobHandler 调度任务
来到 xxl-job-admin 调度中心,首先创建一个执行器,参考如下:
其中 AppName 为执行器名称,要和我们之前在配置文件中配置的执行器名称一致;名称 可以随便写,见名知意即可,注册方式 选择自动注册,选择自动注册后机器地址不用填。
添加完执行器后,再添加调度任务,操作如下:
最后,执行定时任务,效果如下:
需要注意的是,程序中调度任务在取调度中心的定时任务参数时,需要通过 XxlJobHelper 对象获取,例如:String jobParam = XxlJobHelper.getJobParam(); 不能直接使用方法参数接受。