建议阅读前可先参考文章链接
XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用。
如果是单机并且定时任务不多的情况,可以选择Timer注解@Scheduled或者Cron工具类等方式来实现,但是这有个缺点,那就是定时任务会写死在代码中,一旦启动,就不能暂停或者修改。如果修改的话,整个还项目要重新编译,这属实非常的麻烦。
一、部署xxl-job调度中心
(一)下载源码
xxl-job源码地址:
GitHub - xuxueli/xxl-job: A distributed task scheduling framework.(分布式任务调度平台XXL-JOB)
2.4.1版本为例:https://github.com/xuxueli/xxl-job/archive/refs/tags/2.4.1.tar.gz
xxl-job文档地址:
(二)初始化数据库
找到xxl-job安装包xxl-job-2.4.1/doc/db/路径下的tables_xxl_job.sql文件,连接到mysql数据库,导入到mysql中
执行sql脚本后,会生成以下8张表:
(三)修改配置文件application.properties
1、修改server.port,服务端口号
2、修改数据库的URL和账号密码
然后打包上传,并运行jar包,使服务运行起来
地址栏输入http://IP或者域名:8666/xxl-job-admin/
xxl-job-admin 账号:admin 密码:123456 (初始状态下)
二、部署SpringBoot项目
(一)引入Maven依赖
<!-- SpringBoot集成Xxl-Job -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
<version>2.4.1</version>
</dependency>
(二)修改SpringBoot项目关于xxl-job的配置文件
在我们的springboot项目的 application-dev.yml 配置文件中新增xxl-job配置信息
注:
如果 accessToken 不设置的话,最好把它注释掉,或者 输入xxl-job 默认的 default_token ,否则调用的时候容易引起获取不到token的报错
注:
1、xxl.job.admin.address是xxl-job-admin服务部署的IP地址
2、确认执行器的注册地址正确无误。检查两个地址是否均正确录入并与执行器实际部署的地址对应。
3、确认执行器的注册成功。可以在xxl-job-admin的"执行器管理"页面确认两个执行器均处于在线状态。
4、检查任务调度配置。在任务调度配置中,确保你的任务绑定了正确的执行器,并且任务的JobHandler名称与执行器中注册的JobHandler名称一致。
【1】在xxl-job-admin的"任务管理"页面,找到你的任务并编辑
【2】在任务编辑页面的"基本设置"中,确认"任务路由策略"选择了"单一机器"或"故障转移",以便指定任务绑定的执行器
【3】在"GLUE类型"为Bean模式下,确保"JobHandler"字段的值与执行器中注册的JobHandler名称完全匹配
5、检查执行器配置。在执行器部署的服务器上,确认xxl.job.executor.appname、xxl.job.executor.address和xxl.job.executor.ip等属性的配置与xxl-job-admin上的执行器配置一致
【1】确认执行器的appname与xxl-job-admin中的执行器配置相同
【2】确认执行器的address和ip与xxl-job-admin中的执行器配置相同
【3】执行器即SpringBoot项目中带有@XxlJob("xxlJobTest")注解,执行器的IP地址即SpringBoot项目中带有@XxlJob("xxlJobTest")注解部署服务的IP地址!!!
# Xxl-Job分布式定时任务调度中心
xxl:
job:
admin:
# 调度中心部署跟地址 [选填]:如调度中心集群部署存在多个地址则用逗号分隔。
addresses: http://localhost:8666/xxl-job-admin
# addresses: http://IP:8666/xxl-job-admin
# 执行器通讯TOKEN [选填]:非空时启用 系统默认 default_token
accessToken: default_token
executor:
# 执行器的应用名称
appname: test-xxl-job
# 执行器注册 [选填]:优先使用该配置作为注册地址
address:
# 执行器IP [选填]:默认为空表示自动获取IP
ip:
# 执行器端口号 [选填]:小于等于0则自动获取;默认端口为9999
port: 9999
# 执行器运行日志文件存储磁盘路径 [选填] :需要对该路径拥有读写权限;为空则使用默认路径;
logpath: D:\Codes\logs
#logpath: /data/logs/mls/job
# 执行器日志文件保存天数 [选填] : 过期日志自动清理, 限制值大于等于3时生效; 否则, 如-1, 关闭自动清理功能;
logretentiondays: 7
(三)创建配置类
/**
* xxlJob
*/
@Slf4j
@Configuration
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;
}
}
(四)创建执行器
@Slf4j
@Component
public class XxlJobTest {
@XxlJob("xxlJobTest")
public ReturnT<String> xxlJobTest(String date) {
// log.info("---------xxlJobTest定时任务执行成功--------");
System.out.println("---------xxlJobTest定时任务执行成功--------");
return ReturnT.SUCCESS;
}
}
三、通过调度中心进行任务调度
(一)执行器管理--新增执行器
(二)任务管理--新增任务
(三)任务调度中心发起任务调度
四、配置告警邮件通知
项目上线后,调度任务执行失败,当无告警信息时,只有再数据出现错误,进行问题定位和分析时,才会知道执行结果信息,每次出现问题,不能及时的知晓对于运维而言,很不友好。
但是xxl-job中具备这个能力,具体配置项参考下面详细信息。
xxl-job-admin服务配置
在application.properties中针对邮件告警配置项有如下信息:
### xxl-job, email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=xxxx@qq.com
spring.mail.from=xxxx@qq.com
spring.mail.password=xxxxx
spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory
这里的配置信息,是配置一个邮件发送方信息。也就是:出现告警信息时,邮件发送者。
这里用的是我个人的QQ邮箱。但这里需要注意一点:
spring.mail.password 不是设置密码,是设置 授权码
邮件授权码
进入QQ邮箱的设置,找到账户
在账户项中下滑至POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV服务。
选择生成授权码。需要发送确认短信信息,当发送成功后,将会获得当前邮箱的授权码信息。
将授权码信息复制粘贴到spring.mail.password中即可!
具体使用
五、常见问题
1、报错 msg:job handler [demoJobHandler] not found.
这个问题有多重因素,要逐个排查
1、执行器地址对不对
2、jobHandler的名称对不对
3、jobConfig是否加载
4、jobHandler是否加载
XxlJobConfig 确认是否加载
发现果然没有加载,这个是启动的时候就加载。
@XxlJob(“demoJobHandler”) 所在类是否加载
实际上也没有加载,这个是使用的时候加载,所以方法里的日志不会直接打出来。
Application的package及子package的类会自动加载,否则不会加载。调整下未加载类到Application的package及子package即可。
另外一种思路:
Application放到高层级的目录,例如直接放到com目录下
2、xxl-job报错 xxl-job registry fail, registryParam:RegistryParam{registryGroup=‘EXECUTOR’, registryKey=‘xxl-job-invoice-api’, registryValue=‘http://xx:9990/’}, registryResult:ReturnT [code=500, msg=The access token is wrong., content=null]
注册报错,一般是配置问题。例如这里就是accessToken错了。当然其他情况也可能是ip地址错了,看具体报错吧
3、xxl-job-admin的Web界面账号密码在哪设置
默认是在代码里面写死了,可以在JobInfoControllerTest 中的login方法中修改
public class JobInfoControllerTest extends AbstractSpringMvcTest {
private static Logger logger = LoggerFactory.getLogger(JobInfoControllerTest.class);
private Cookie cookie;
@BeforeEach
public void login() throws Exception {
MvcResult ret = mockMvc.perform(
post("/login")
.contentType(MediaType.APPLICATION_FORM_URLENCODED)
.param("userName", "admin")
.param("password", "123456")
).andReturn();
cookie = ret.getResponse().getCookie(LoginService.LOGIN_IDENTITY_KEY);
}
}