SpringBoot整合XXL
XXL-JOB 是一个分布式任务调度平台,主要用于管理和执行定时任务。它适用于各种场景,例如定时任务、批处理任务、分布式任务等。XXL-JOB 提供了丰富的功能,使得任务调度变得简单、高效和可靠。以下是 XXL-JOB 的一些主要功能和特点:
分布式调度:
支持分布式任务调度,可以在多个节点上运行。
通过调度中心统一管理任务,保证任务只在一个节点上执行,避免重复执行。
简单易用:
提供了易用的 Web 管理界面,可以通过界面方便地管理和监控任务。
任务的定义和配置简单,可以通过注解或配置文件快速设置任务。
任务管理:
支持多种任务类型,包括 BEAN 模式(Spring Bean)、GLUE 模式(动态脚本)、Shell 脚本、Python 脚本等。
提供了任务的添加、删除、修改、启动、停止等基本操作。
任务执行策略:
支持多种任务执行策略,例如串行执行、并行执行、故障转移等。
可以设置任务的超时时间、重试次数等。
任务监控与报警:
提供详细的任务执行日志,方便追踪和调试任务。
支持任务执行失败的报警功能,可以通过邮件、短信等方式通知相关人员。
调度策略:
支持多种调度策略,包括 CRON 表达式、固定间隔、按天执行等。
可以设置任务的执行优先级,保证关键任务优先执行。
高可用性:
支持任务的高可用性设计,通过调度中心和执行器的心跳机制,保证任务的可靠执行。
具备集群容错能力,当一个节点宕机时,其他节点可以接管任务。
首先我们先去 GitHub 上把 xxl_job 项目拉下来 Github项目地址
idea 直接用这个地址克隆就可以了 https://github.com/xuxueli/xxl-job.git
在doc里面有一个SQL文件,我们把这个导入到自己的数据库里面
里面有这几张表
然后我改一下项目的配置文件,主要就是换一下数据库的配置
当然还有下面这两个配置,一个是用来处理报警的时候邮件推送通知的,还有一个认证用的accessToken,邮件那个我们可以不管,有需要的话自己研究一下,这个token我建议大家自己配置一下,随机字符串就行,后面我们自己项目连接xxl_job服务会需要用到这个accessToken
改好后我们就可以直接启动
我们在浏览器直接访问 http://localhost:8080/xxl-job-admin/toLogin
注意要是改了端口配置记得换成自己的,默认的是8080
默认的用户名admin 密码123456
进去后就是下面这样的
接下来我们新建一个 springboot 项目
注意箭头位置
因为我这边用的还是Java8,新版idea可能没有这个选项,所以我们把Server URL换成阿里的 https://start.aliyun.com
点击 Next
下一步里面主要是最上面的 springboot 版本,因为选的 Java8,所以这里版本不能用3.0及以上
然后就是一些基础依赖,大家看着选,最基本的web、mysql还有redis这些可以勾上,当然这里主要为了测试 xxl_job 不勾也没关系
然后点下面的Create项目就创建好了
直接改一下配置文件后缀为yml
替换掉里面的内容
注意因为xxl_job的默认端口也是8080,所以这里我换成了8081
server: port: 8081 spring: application: name: xxl-demo
然后我们启动这个项目,项目能正常启动就可以了
现在我们在这个项目里面加入 xxl_job
首先我们需要添加依赖,记得刷新一下 Maven 防止包没有下载下来
com.xuxueli xxl-job-core 2.4.0
然后在 application.yml 里面加上 xxl_job 的配置
注意下面的 accessToken 要跟之前 xxl_job 的一致
xxl: job: executor: appname: ${spring.application.name} logpath: ${spring.application.name}/xxl-job logretentiondays: 30 admin: addresses: http://127.0.0.1:8080/xxl-job-admin accessToken: default_token_123456
还需要一个加载配置文件的类
package com.sakura.xxl.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; /** * @author Sakura * @date 2024/7/12 11:07 */ @Configuration public class XxlJobConfig { private Logger logger = LoggerFactory.getLogger(XxlJobConfig.class); @Value("${xxl.job.admin.addresses}") private String adminAddresses; @Value("${xxl.job.accessToken}") private String accessToken; @Value("${xxl.job.executor.appname}") private String appname; @Value("${server.port}") private int port; @Value("${xxl.job.executor.logpath}") private String logPath; @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.setPort(port + 10000); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); return xxlJobSpringExecutor; } }
大家自己建一下目录
到这里配置就完成了,下面我们就可以开始写代码使用了
我们加一个定时任务类
package com.sakura.xxl.handler; import com.xxl.job.core.context.XxlJobHelper; import com.xxl.job.core.handler.annotation.XxlJob; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; /** * @author Sakura * @date 2024/7/12 11:14 */ @Component public class XxlJobHandler { private Logger logger = LoggerFactory.getLogger(XxlJobHandler.class); /** * 更新状态 **/ @XxlJob("demo") public void demo() { String jobParam = XxlJobHelper.getJobParam(); logger.info("任务执行" + jobParam); } }
重新启动项目,可以看到已经加载成功了
回到之前的控制台
我们新增一个执行器
注意AppName要跟项目配置文件的spring.application.name一致
刷新一下列表,如果看不到下面这个就重启一下我们的项目再刷新
接着我们去任务管理里面加上我们刚才在项目的 demo 方法
主要注意下面箭头三个位置
执行器就是我们刚才配的执行器,Cron 是我们要执行的时间,重点是JobHandler,这个要跟我们项目里面的一致
我们先执行一次测试一下
查看控制台可以看到已经执行成功了
也可以在xxl_job的控制台查看日志
注意上面只是执行了一次,并没有真正的开启服务,就是说不会按你配置的时间运行,真的开启需要你点启动
比如我把时间调成每小时每分钟都会执行
下面这个就是自动执行打印的日志
到这里xxl_job的基本使用就完成了,其它的一些使用方法大家自己研究一下