xxl-job学习
Springboot定时任务
SpringBoot自带的定时任务框架 @Scheduled
默认是单线程执行所有任务,所以当前时刻只能有一个任务在执行,后续任务的执行要排队,任务一多或某个任务执行时间过长都是会影响到后续任务的执行。
当然,SpringBoot可通过编写配置类,配置成多线程执行定时任务。
原生定时任务框架的缺陷
1、不支持集群 如果集群了的话那么就可能出现任务重复执行的情况
2、不支持生命周期统一管理 不重启服务的情况下关闭、启动任务
3、不支持任务分片 处理有序数据时,多机器分片执行任务处理不同数据
4、不支持失败重试 任务出现异常后,不能根据任务状态重新执行任务
5、不支持动态调整 不重启服务的情况下修改参数
6、任务是把你无报警机制 任务失败后无报警机制
7、任务数据难以统计 任务数据量大的时候,对于任务执行情况无法高效的统计执行情况
总结 定时任务两要素
1、任务的动态管理(随时启动停止,更改执行时间的规则)
2、任务的执行情况(成功,失败的日志记录;失败后尝试重新启动定时任务;任务执行效率如何)
为集群而生的定时任务框架xxl-job
抽离出调度中心:负责从数据库读取相关数据,RPC远程通知集群中的某一个执行器执行任务,检测到任务失败,就重新找一个执行器执行任务。
执行任务的时间规则,参数等都存放在数据库,可以不用重启服务就能动态改变任务的执行时间规则。
示例
### web
server.port=8080
server.context-path=/xxl-job-admin
### resources
spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/static/
### freemarker
spring.freemarker.templateLoaderPath=classpath:/templates/
spring.freemarker.suffix=.ftl
spring.freemarker.charset=UTF-8
spring.freemarker.request-context-attribute=request
spring.freemarker.settings.number_format=0.##########
### mybatis
mybatis.mapper-locations=classpath:/mybatis-mapper/*Mapper.xml
### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?Unicode=true&characterEncoding=UTF-8
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource
spring.datasource.tomcat.max-wait=10000
spring.datasource.tomcat.max-active=30
spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1
spring.datasource.tomcat.validation-interval=30000
### xxl-job email
spring.mail.host=smtp.qq.com
spring.mail.port=25
spring.mail.username=1758867615@qq.com
spring.mail.password=xxx
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
### xxl-job, access token
xxl.job.accessToken=
### xxl-job, i18n (default empty as chinese, "en" as english)
xxl.job.i18n=
###还可配置RPC通信监听端口
###还可配置日志是打印到控制中心
@JobHandler
public class DemoJobHandler extends IJobHandler {
@Override
public ReturnT<String> execute(String param) throws Exception {
XxlJobLogger.log("XXL-JOB, Hello World.");
for (int i = 0; i < 5; i++) {
XxlJobLogger.log("beat at:" + i);
TimeUnit.SECONDS.sleep(2);
}
return SUCCESS;
}
}
配置文件不指定日志打印,默认就只是一条info日志