把xxl-job集成到spring boot项目中

简介 在我的springbootmaven项目中,引入xxl-job,然后可以通过xxl-job页面配置定时,我项目还是用到了token,怎么解决,请给出详细的操作步骤?下面我为你整理了在SpringBoot项目中集成XXL-JOB并处理Token认证的详细步骤。希望能帮你顺利解决问题。🌟SpringBoot集成XXL-JOB及Token处理指南XXL-JOB是一款轻量级分布式任务调度平台,功能丰富、

🔔🔔🔔好消息!好消息!🔔🔔🔔

有需要的朋友👉:联系凯哥 微信号 kaigejava2022

在我的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管理平台配置

  1. 访问XXL-JOB调度中心:打开浏览器,输入调度中心地址

  2. 配置执行器

    • 进入"执行器管理"

    • 点击"新增"

    • 填写执行器名称(与配置文件中的appname一致)

    • 选择"自动注册"方式

  3. 配置任务

    • 进入"任务管理"

    • 点击"新增"

    • 选择刚创建的执行器

    • 填写任务信息(JobHandler与代码中的@XxlJob值一致)

    • 设置Cron表达式和任务参数

7. 启动和测试

  1. 启动你的Spring Boot应用

  2. 查看应用日志,确认执行器注册成功

  3. 在XXL-JOB管理界面手动执行一次任务进行测试

  4. 查看任务执行日志,确认业务逻辑正确执行

注意事项

  1. Token一致性:确保执行器配置中的accessToken与调度中心设置的token一致3

  2. 网络连通性:确保执行器与调度中心之间网络通畅,否则会导致执行器注册失败或任务触发失败。

  3. 端口冲突:如果同一机器部署多个执行器,需要配置不同的端口号3

  4. 日志路径权限:确保执行器有权限读写配置的日志路径3

  5. 任务超时处理:对于执行时间较长的任务,合理设置超时时间,避免任务阻塞9

通过以上步骤,你应该能够在已有Token认证的Spring Boot项目中成功集成XXL-JOB,并正确处理认证问题。


TopTop