把xxl-job集成到spring boot项目中
- 工作小总结&小工具类
- 时间:2025-08-28 12:56
- 22人已阅读
🔔🔔🔔好消息!好消息!🔔🔔🔔
有需要的朋友👉:联系凯哥
在我的spring boot maven项目中,引入xxl-job,然后可以通过xxl-job页面配置定时,我项目还是用到了token,怎么解决,请给出详细的操作步骤?
下面我为你整理了在Spring Boot项目中集成XXL-JOB并处理Token认证的详细步骤。希望能帮你顺利解决问题。
🌟 Spring Boot集成XXL-JOB及Token处理指南
XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、界面简洁、易于扩展1。下面我会详细介绍如何在Spring Boot项目中集成XXL-JOB,并妥善处理Token认证问题。
详细操作步骤
1. 添加Maven依赖
首先在项目的pom.xml
中添加XXL-JOB核心依赖:
<dependency> <groupId>com.xuxueli</groupId> <artifactId>xxl-job-core</artifactId> <version>2.3.1</version> <!-- 建议使用最新稳定版本 --> </dependency>
2. 配置Application.properties/Application.yml
根据你的配置文件类型,添加以下XXL-JOB配置:
# 调度中心部署地址(多个地址用逗号分隔)[必填] xxl.job.admin.addresses=http://your-xxl-job-admin-host:port/xxl-job-admin # 执行器通讯TOKEN [选填,但建议设置],需要与调度中心配置的token一致 xxl.job.accessToken=your_secure_token_here # 执行器AppName [必填],作为执行器心跳注册分组依据 xxl.job.executor.appname=your-app-name # 执行器IP [选填],默认为空表示自动获取IP xxl.job.executor.ip= # 执行器端口号 [选填],小于等于0则自动获取,默认9999 xxl.job.executor.port=9999 # 执行器运行日志文件存储路径 [选填] xxl.job.executor.logpath=/data/applogs/xxl-job/jobhandler # 执行器日志文件保存天数 [选填],大于等于3时生效 xxl.job.executor.logretentiondays=30
下面是主要配置参数的表格说明:
配置项 | 说明 | 必填 | 示例值 |
---|---|---|---|
xxl.job.admin.addresses | 调度中心地址,多个地址用逗号分隔 | 是 | http://localhost:8080/xxl-job-admin |
xxl.job.accessToken | 执行器与调度中心通信的Token,需与调度中心设置一致 | 否 | default_token |
xxl.job.executor.appname | 执行器名称,在调度中心注册识别 | 是 | your-app-name |
xxl.job.executor.ip | 执行器IP,不配置则自动获取 | 否 | 192.168.1.100 |
xxl.job.executor.port | 执行器端口,用于接收调度请求 | 否 | 9999 |
xxl.job.executor.logpath | 执行器日志存储路径 | 否 | /data/applogs/xxl-job/jobhandler |
xxl.job.executor.logretentiondays | 执行器日志保存天数 | 否 | 30 |
3. 创建XXL-JOB配置类
创建一个配置类,用于初始化XXL-JOB执行器:
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; @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("${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() { logger.info(">>>>>>>>>>> XXL-JOB配置初始化中..."); XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor(); xxlJobSpringExecutor.setAdminAddresses(adminAddresses); xxlJobSpringExecutor.setAppname(appname); xxlJobSpringExecutor.setIp(ip); xxlJobSpringExecutor.setPort(port); xxlJobSpringExecutor.setAccessToken(accessToken); xxlJobSpringExecutor.setLogPath(logPath); xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays); logger.info(">>>>>>>>>>> XXL-JOB配置初始化完成"); return xxlJobSpringExecutor; } }
4. 编写定时任务方法
使用@XxlJob
注解声明定时任务方法:
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; @Component public class SampleXxlJob { private Logger logger = LoggerFactory.getLogger(SampleXxlJob.class); /** * 示例任务处理程序 */ @XxlJob("demoJobHandler") public void demoJobHandler() throws Exception { // 获取任务参数 String param = XxlJobHelper.getJobParam(); logger.info("XXL-JOB任务开始执行,参数: {}", param); try { // 这里编写你的业务逻辑 // 如果你的业务需要Token认证,可以在这里调用你的Token处理逻辑 logger.info("业务逻辑执行成功"); XxlJobHelper.handleSuccess("任务执行成功"); } catch (Exception e) { logger.error("任务执行失败", e); XxlJobHelper.handleFail("任务执行失败: " + e.getMessage()); } } /** * 另一个任务示例 */ @XxlJob("anotherJobHandler") public void anotherJobHandler() throws Exception { // 你的业务逻辑 here // 使用XxlJobHelper.log记录日志,这些日志会在XXL-JOB管理界面显示 XxlJobHelper.log("XXL-JOB, Hello World."); // 执行具体业务 for (int i = 0; i < 5; i++) { XxlJobHelper.log("执行进度: " + i); Thread.sleep(1000); } XxlJobHelper.handleSuccess("任务完成"); } }
5. 处理项目中的Token认证
如果你的Spring Boot项目本身有Token认证机制(如JWT),需要确保XXL-JOB的调用不会因为认证而被拦截:
方案一:排除XXL-JOB相关路径拦截(推荐)
在你的安全配置中,排除XXL-JOB回调路径的认证:
import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @Configuration public class SecurityConfig extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.authorizeRequests() .antMatchers("/xxl-job-admin/**").permitAll() // 允许XXL-JOB管理界面访问 .antMatchers("/**/callback").permitAll() // 允许XXL-JOB执行器回调 .anyRequest().authenticated() // 其他请求需要认证 .and() .addFilterBefore(new JwtTokenFilter(), UsernamePasswordAuthenticationFilter.class); } }
方案二:为XXL-JOB调用添加特殊Token处理
如果你的架构要求所有请求都必须经过认证,可以创建专门的Token处理机制:
/** * 专门处理XXL-JOB调用的Token验证 */ @Component public class XxlJobTokenService { /** * 验证XXL-JOB调度请求的Token */ public boolean validateXxlJobToken(HttpServletRequest request) { String token = request.getHeader("XXL-JOB-TOKEN"); // 这里验证Token的逻辑,可以与调度中心设置的accessToken对比 return "your_secure_token_here".equals(token); } /** * 生成用于XXL-JOB调用的Token */ public String generateXxlJobToken() { // 生成Token的逻辑,可以是固定值或动态生成 return "your_secure_token_here"; } }
6. 在XXL-JOB管理平台配置
访问XXL-JOB调度中心:打开浏览器,输入调度中心地址
配置执行器:
进入"执行器管理"
点击"新增"
填写执行器名称(与配置文件中的
appname
一致)选择"自动注册"方式
配置任务:
进入"任务管理"
点击"新增"
选择刚创建的执行器
填写任务信息(JobHandler与代码中的
@XxlJob
值一致)设置Cron表达式和任务参数
7. 启动和测试
启动你的Spring Boot应用
查看应用日志,确认执行器注册成功
在XXL-JOB管理界面手动执行一次任务进行测试
查看任务执行日志,确认业务逻辑正确执行
注意事项
Token一致性:确保执行器配置中的
accessToken
与调度中心设置的token一致3。网络连通性:确保执行器与调度中心之间网络通畅,否则会导致执行器注册失败或任务触发失败。
端口冲突:如果同一机器部署多个执行器,需要配置不同的端口号3。
日志路径权限:确保执行器有权限读写配置的日志路径3。
任务超时处理:对于执行时间较长的任务,合理设置超时时间,避免任务阻塞9。
通过以上步骤,你应该能够在已有Token认证的Spring Boot项目中成功集成XXL-JOB,并正确处理认证问题。