把xxl-job集成到spring boot项目中
- 工作小总结&小工具类
- 时间:2025-08-28 12:56
- 269人已阅读
🔔🔔好消息!好消息!🔔🔔
有需要的朋友👉:微信号
在我的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,并正确处理认证问题。