提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
前言
本篇介绍xxl-job定时任务调用,使用的Nacos作为服务的注册中心一、xxl-job服务
xxl-job 设计分两个模块:
调度模块 : 负责管理调度信息,按照调度配置发出调度请求,自身不承担业务代码。调度系统
执行模块: 负责接收调度请求并执行任务逻辑.
若项目中没有集成,可以git下载到本地运行服务
xxl-job github 地址:https://github.com/xuxueli/xxl-job
二、使用步骤
1.引入依赖
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.2.0</version>
</dependency>
2.添加配置
方式一:application.yml添加配置
xxl:
job:
login:
username: admin
password: admin
admin:
address: http://127.0.0.1:8080/xxl-job-admin
executor:
address:
appname: xxlJob
ip:
port: 9999
logpath: /data/applogs/xxl-job/jobhandler
logretentiondays: 30
accessToken:
方式二:Nacos添加配置
3.引入配置文件
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.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* xxl-job config
* 运用到 Nacos Config相关属性
* 此处开启@Configuration将会去一直注册到 xxl-job 默认关闭
*/
@Configuration
@RefreshScope
@ConditionalOnProperty(name = "xxl.open",havingValue = "true")
public class XxlJobConfig {
private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class);
@Value(value = "${xxl.job.admin.addresses:}")
private String adminAddresses;
@Value(value = "${xxl.job.accessToken:}")
private String accessToken;
@Value(value = "${xxl.job.executor.appname:}")
private String appname;
@Value(value = "${xxl.job.executor.address:}")
private String address;
@Value(value = "${xxl.job.executor.ip:}")
private String ip;
@Value(value = "${xxl.job.executor.port:}")
private int port;
@Value(value = "${xxl.job.executor.logpath:}")
private String logPath;
@Value(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;
}
}
4.编写定时任务代码
/**
* @author: zyf
* @date: 2020/12/30
* Description:
* 方法返回类型固定,设置return ReturnT.SUCCESS; 或者ReturnT.FAIL;等
* 方法必须有参数,底层校验 Method反射对象是否有参数,没有参数会报错,无论参数是否使用
* 注解 @XxlJob的参数是任务调度中心中设置任务时设置的JobHandler
**/
@XxlJob("budgetTest")
public ReturnT<String> testBudget(String param){
System.out.println("执行了任务");
return ReturnT.SUCCESS;
}
5.创建执行器和任务
根据配置文件中的地址,进入执行器页面
1.创建执行器
2.创建任务
总结
至此已经完成了任务的创建,接下来就是查看执行器中的机器地址是否自动注册成功,这个麻烦的就是各种对应关系
配置文件中的appname对应任务执行器中的appname相同;
创建任务时的JobHandler要与任务代码中的@xxljob注解参数相同;
Nacos中的配置文件Data ID 要和项目中任务代码所在的服务的application.name相同,这里Data ID有规定的命名规范,因为我是将代码进行了修改发表的demo,没有去特意注意这里,在各个公司使用时应该都有自己的规范去进行创建;
额外介绍
1.在微服务中,可以在配置文件服务中添加注解控制定时任务的开关
2. 注解源码
注解@xxljob调用了定时任务的核心方法 initJobHandlerMethodRepository 这里做部分解析
3. 定时任务微服务远程调用
xxljob正常调用远程服务会失败,具体原因不明(不懂,请大佬赐教),可用另一种方式进行远程调用 使用RestTemplate,以下给出一个示例