一、准备工作
官网:https://www.xuxueli.com/xxl-job
工具:IDEA+maven+MySQL
由于官网上提供的是MySQL,所以推荐使用MySQL
也可以自行修改为Oracle,但是比较麻烦,不仅要将MySQL脚本改为Oracle,还要将mapper.xml文件中的语句进行修改,总之很烦很烦(亲身体会)。
二、下载xxl-job稳定版(这里以2.2.0为例)
官网提供了GITHUB和GITEE两种下载方式,自行下载。
2.1 /xxl-job/doc/db/tables_xxl_job.sql脚本
2.2 将下载好的xxl-job-2.2.0,按照maven格式将源码导入IDEA中,然后使用maven进行编译即可,直接使用compile和package可。(记得修改maven仓库路径)
三、配置调度中心xxl-job-admin
3.1 pom
这里主要修改你的MySQL的版本号,根据个人的MySQL配置选择相应的版本号
3.2 application.properties
这里修改数据源配置
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job-leo-zu?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
3.3 启动项目
上述配置完成以后,启动xxl-job-admin
访问调度中心地址:http://localhost:8080/xxl-job-admin
默认登录账号密码:admin/123456
四、配置部署 执行器项目
这里可以直接使用xxl-job-2.2.0中的xxl-job-executor-sample-springboot,也可以配置自己的项目,步骤都如下:
4.1 pom
在pom文件中引入 xxl-job-core 的maven依赖
4.2 application.properties
address:调度中心地址
appname:与调度中心配置的执行器名称一致
port:可以根据自己的情况设置,默认9999
xxl:
job:
admin:
addresses: http://127.0.0.1:8080/xxl-job-admin # 调度中心地址
# 执行器通信Token[选填],非空时启用
accessToken:
executor: #
appname: cloud-payment-service-executor
ip:
port: 9999
logpath: /data/applogs/xxl-job/jobhandler
logretentiondays: 10
4.3 执行器组件配置
package com.leopard.springcloud.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;
/**
* 调度中心认证token
*/
@Value("${xxl.job.accessToken}")
private String accessToken;
/**
* 执行器名字
*/
@Value("${xxl.job.executor.appname}")
private String appname;
/**
* 执行器地址
*/
// @Value("${xxl.job.executor.address}")
// private String address;
/**
* 执行器ip,默认本机
*/
@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;
/**
* 配置初始化
* @return
* @author leo-zu 2020-10-28 21:29
*/
@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();
*/
}
上述配置完成好以后,就可以开始动手开发了。
五、开发一个项目
5.1 在调度中心配置执行器:
AppName要和之前项目中配置的appname一致
机器地址:一定要加上http://,否则会报无协议的错。然后加上主机地址和端口号
5.2 新建调度任务
JobHandler一定要和项目中的handler名称一致。
Cron表达式:设置定时任务的时间
5.3 在项目中创建hadler
由于新版,所以要加上@XxlJob(“PaymentJobHandler”):支持单个类中开发多个任务方法
package com.leopard.springcloud.job.handler;
import com.xxl.job.core.biz.model.ReturnT;
import com.xxl.job.core.handler.IJobHandler;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.xxl.job.core.log.XxlJobLogger;
import groovy.util.logging.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
/**
* @author leo-zu
* @create 2020-10-28 21:47
*/
@Slf4j
@Component
public class PaymentJobHandler extends IJobHandler {
private static transient Logger logger = LoggerFactory.getLogger(PaymentJobHandler.class);
@Override
@XxlJob("PaymentJobHandler")
public ReturnT<String> execute(String param) throws Exception {
logger.info("HELLO WORLD!");
XxlJobLogger.log("hello world");
return SUCCESS;
}
}
5.4 启动项目
- 启动项目
- 打开任务调度中心的执行任务
这里我设置的任务是每分钟执行一次定时任务,所以每隔一分钟可以看到控制台打印信息: