当前位置: 首页 > news >正文

定时任务:springboot集成xxl-job-core(一)

springboot:2.7.2

xxl-job-core: 2.3.0

一、集成xxl-job

1. 在gitee上下载xxl-job项目

git clone https://gitee.com/xuxueli0323/xxl-job.git

2. 执行以下目录下的sql

/xxl-job-2.3.0/doc/db/tables_xxl_job.sql

3. 在xxl-job-admin的项目中配置数据库信息

### xxl-job, datasource
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/xxl_job?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai
spring.datasource.username=root
spring.datasource.password=root_psw
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

4. 在xxl-job-2.3.0项目中执行 mvn clean install, 下载依赖

若报错gpg相关依赖插件没有,我目前是将pom中涉及gpg的部分暂时注释掉了

<!-- GPG -->
                    <!-- <plugin>
                        <groupId>org.apache.maven.plugins</groupId>
                        <artifactId>maven-gpg-plugin</artifactId>
                        <version>${maven-gpg-plugin.version}</version>
                        <configuration>
                            <useAgent>false</useAgent>
                        </configuration>
                        <executions>
                            <execution>
                                <phase>verify</phase>
                                <goals>
                                    <goal>sign</goal>
                                </goals>
                            </execution>
                        </executions>
                    </plugin> -->

5. 执行以下命令,启动xxl-job-admin

cd E:\workspace\prac\xxl-job-2.3.0\xxl-job-admin\target

java -jar xxl-job-admin-2.3.0.jar

6. 登录xxl-job-admin,账密:admin/123456

7. 项目中引入依赖

<!--xxl-job-core-->
<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>${xxl-job-version}</version>
</dependency>

 8. application.yml配置

xxl:job:admin:addresses: http://127.0.0.1:8080/xxl-job-adminexecutor:appname: xxl-job-executor  # 执行器名称,需唯一ip: 127.0.0.1                    # 执行器IP(可选)port: 9999                       # 执行器端口(可选)logpath: logs/xxl-job            # 日志路径logretentiondays: 30             # 日志保留天数

 9. 配置类XxlJobConfig

package com.yifeng.prac.config.xxljob;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: EstellaQ* @Date: 2025/6/1 16:32* @Description: xxl-job config**/
@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.address}")private String address;@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;@Beanpublic XxlJobSpringExecutor xxlJobExecutor() {logger.info(">>>>>>>>>>> xxl-job config init.");XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();xxlJobSpringExecutor.setAdminAddresses(adminAddresses);xxlJobSpringExecutor.setAppname(appname);xxlJobSpringExecutor.setAddress(address);xxlJobSpringExecutor.setIp(ip);xxlJobSpringExecutor.setPort(port);xxlJobSpringExecutor.setAccessToken(accessToken);xxlJobSpringExecutor.setLogPath(logPath);xxlJobSpringExecutor.setLogRetentionDays(logRetentionDays);return xxlJobSpringExecutor;}/*** 针对多网卡、容器内部署等情况,可借助 "spring-cloud-commons" 提供的 "InetUtils" 组件灵活定制注册IP;**      1、引入依赖:*          <dependency>*             <groupId>org.springframework.cloud</groupId>*             <artifactId>spring-cloud-commons</artifactId>*             <version>${version}</version>*         </dependency>**      2、配置文件,或者容器启动变量*          spring.cloud.inetutils.preferred-networks: 'xxx.xxx.xxx.'**      3、获取IP*          String ip_ = inetUtils.findFirstNonLoopbackHostInfo().getIpAddress();*/
}

 10. 执行器示例

package com.yifeng.prac.job;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;import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.Arrays;
import java.util.concurrent.TimeUnit;/*** XxlJob开发示例(Bean模式)** 开发步骤:*      1、任务开发:在Spring Bean实例中,开发Job方法;*      2、注解配置:为Job方法添加注解 "@XxlJob(value="自定义jobhandler名称", init = "JobHandler初始化方法", destroy = "JobHandler销毁方法")",注解value值对应的是调度中心新建任务的JobHandler属性的值。*      3、执行日志:需要通过 "XxlJobHelper.log" 打印执行日志;*      4、任务结果:默认任务结果为 "成功" 状态,不需要主动设置;如有诉求,比如设置任务结果为失败,可以通过 "XxlJobHelper.handleFail/handleSuccess" 自主设置任务结果;** @author xuxueli 2019-12-11 21:52:51*/
@Component
public class SampleXxlJob {private static Logger logger = LoggerFactory.getLogger(SampleXxlJob.class);/*** 1、简单任务示例(Bean模式)*/@XxlJob("demoJobHandler")public void demoJobHandler() throws Exception {XxlJobHelper.log("XXL-JOB, Hello World.");for (int i = 0; i < 5; i++) {XxlJobHelper.log("beat at:" + i);TimeUnit.SECONDS.sleep(2);}// default success}/*** 2、分片广播任务*/@XxlJob("shardingJobHandler")public void shardingJobHandler() throws Exception {// 分片参数int shardIndex = XxlJobHelper.getShardIndex();int shardTotal = XxlJobHelper.getShardTotal();XxlJobHelper.log("分片参数:当前分片序号 = {}, 总分片数 = {}", shardIndex, shardTotal);// 业务逻辑for (int i = 0; i < shardTotal; i++) {if (i == shardIndex) {XxlJobHelper.log("第 {} 片, 命中分片开始处理", i);} else {XxlJobHelper.log("第 {} 片, 忽略", i);}}}/*** 3、命令行任务*/@XxlJob("commandJobHandler")public void commandJobHandler() throws Exception {String command = XxlJobHelper.getJobParam();int exitValue = -1;BufferedReader bufferedReader = null;try {// command processProcessBuilder processBuilder = new ProcessBuilder();processBuilder.command(command);processBuilder.redirectErrorStream(true);Process process = processBuilder.start();//Process process = Runtime.getRuntime().exec(command);BufferedInputStream bufferedInputStream = new BufferedInputStream(process.getInputStream());bufferedReader = new BufferedReader(new InputStreamReader(bufferedInputStream));// command logString line;while ((line = bufferedReader.readLine()) != null) {XxlJobHelper.log(line);}// command exitprocess.waitFor();exitValue = process.exitValue();} catch (Exception e) {XxlJobHelper.log(e);} finally {if (bufferedReader != null) {bufferedReader.close();}}if (exitValue == 0) {// default success} else {XxlJobHelper.handleFail("command exit value("+exitValue+") is failed");}}/*** 4、跨平台Http任务*  参数示例:*      "url: http://www.baidu.com\n" +*      "method: get\n" +*      "data: content\n";*/@XxlJob("httpJobHandler")public void httpJobHandler() throws Exception {// param parseString param = XxlJobHelper.getJobParam();if (param==null || param.trim().length()==0) {XxlJobHelper.log("param["+ param +"] invalid.");XxlJobHelper.handleFail();return;}String[] httpParams = param.split("\n");String url = null;String method = null;String data = null;for (String httpParam: httpParams) {if (httpParam.startsWith("url:")) {url = httpParam.substring(httpParam.indexOf("url:") + 4).trim();}if (httpParam.startsWith("method:")) {method = httpParam.substring(httpParam.indexOf("method:") + 7).trim().toUpperCase();}if (httpParam.startsWith("data:")) {data = httpParam.substring(httpParam.indexOf("data:") + 5).trim();}}// param validif (url==null || url.trim().length()==0) {XxlJobHelper.log("url["+ url +"] invalid.");XxlJobHelper.handleFail();return;}if (method==null || !Arrays.asList("GET", "POST").contains(method)) {XxlJobHelper.log("method["+ method +"] invalid.");XxlJobHelper.handleFail();return;}boolean isPostMethod = method.equals("POST");// requestHttpURLConnection connection = null;BufferedReader bufferedReader = null;try {// connectionURL realUrl = new URL(url);connection = (HttpURLConnection) realUrl.openConnection();// connection settingconnection.setRequestMethod(method);connection.setDoOutput(isPostMethod);connection.setDoInput(true);connection.setUseCaches(false);connection.setReadTimeout(5 * 1000);connection.setConnectTimeout(3 * 1000);connection.setRequestProperty("connection", "Keep-Alive");connection.setRequestProperty("Content-Type", "application/json;charset=UTF-8");connection.setRequestProperty("Accept-Charset", "application/json;charset=UTF-8");// do connectionconnection.connect();// dataif (isPostMethod && data!=null && data.trim().length()>0) {DataOutputStream dataOutputStream = new DataOutputStream(connection.getOutputStream());dataOutputStream.write(data.getBytes("UTF-8"));dataOutputStream.flush();dataOutputStream.close();}// valid StatusCodeint statusCode = connection.getResponseCode();if (statusCode != 200) {throw new RuntimeException("Http Request StatusCode(" + statusCode + ") Invalid.");}// resultbufferedReader = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));StringBuilder result = new StringBuilder();String line;while ((line = bufferedReader.readLine()) != null) {result.append(line);}String responseMsg = result.toString();XxlJobHelper.log(responseMsg);return;} catch (Exception e) {XxlJobHelper.log(e);XxlJobHelper.handleFail();return;} finally {try {if (bufferedReader != null) {bufferedReader.close();}if (connection != null) {connection.disconnect();}} catch (Exception e2) {XxlJobHelper.log(e2);}}}/*** 5、生命周期任务示例:任务初始化与销毁时,支持自定义相关逻辑;*/@XxlJob(value = "demoJobHandler2", init = "init", destroy = "destroy")public void demoJobHandler2() throws Exception {XxlJobHelper.log("XXL-JOB, Hello World.");}public void init(){logger.info("init");}public void destroy(){logger.info("destory");}}

二、执行器(Executor)配置

执行器是任务的实际执行节点,需要先在控制台注册。

1. 点击左侧菜单 “执行器管理” 

2. 添加执行器

  • 点击 新增 按钮,填写以下信息:
字段说明
AppName执行器名称(需唯一,与执行器配置文件中 xxl.job.executor.appname 一致)
名称执行器显示名称(可自定义)
注册方式选择 自动注册(执行器启动后自动注册)
调度中心地址调度中心地址(默认 http://127.0.0.1:8080/xxl-job-admin

注意保执行器配置文件中的 xxl.job.executor.appname 与控制台配置的 AppName 一致。 

三、任务配置

任务是调度中心的核心管理单元,用于定义调度逻辑、执行策略等。

1. 进入 任务管理 页面

  • 点击左侧菜单 “任务管理” 。

2. 添加任务

  • 点击 新增 按钮,填写以下信息:

四、调度配置详解

1. 调度时间(Cron 表达式)

  • 使用标准的 Cron 表达式定义任务调度频率。
  • 示例:
    • 0 0/1 * * * ?:每分钟执行一次
    • 0 0 0 * * ?:每天凌晨执行
    • 0 0 12 * * MON-FRI:每周一至周五中午12点执行
  • 推荐工具:Cron 表达式生成器

五、任务日志查看

1. 查看任务执行日志

  • 在 任务管理 页面点击 日志 按钮,查看任务执行详情。

2. 日志文件位置

默认日志路径为 logs/xxl-job,可在执行器配置中修改:

xxl:job:executor:logpath: logs/xxl-job            # 日志路径

六、安全与高级配置(可选)

1. Token 验证

  • 在调度中心和执行器中配置相同的 token,增强安全性。

调度中心配置:

xxl.job.accessToken=your_token

执行器配置: 

xxl:
  job:
    accessToken: your_token

相关文章:

  • 14.Wifi模组(ESP8266)
  • 过滤攻击-隐私保护
  • 设计模式-行为型模式-模版方法模式
  • 【课堂笔记】生成对抗网络 Generative Adversarial Network(GAN)
  • 图像处理篇---face_recognition库实现人脸检测
  • Vue3+SpringBoot全栈开发:从零实现增删改查与分页功能
  • 字节golang后端二面
  • 用dayjs解析时间戳,我被提了bug
  • 在IIS上无法使用PUT等请求
  • 基于机器学习的心脏病预测模型构建与可解释性分析
  • 西瓜书第十章——聚类
  • buuctf-web
  • unix/linux source 命令,其历史争议、兼容性、生态、未来展望
  • 在Flutter中定义全局对象(如$http)而不需要import
  • JVM学习(七)--JVM性能监控
  • Tomcat优化篇
  • ASP.NET Core SignalR 身份认证集成指南(Identity + JWT)
  • Axure组件即拖即用:垂直折叠菜单(动态展开/收回交互)
  • APM32主控键盘全功能开发实战教程:软件部分
  • 【Java基础】Java入门教程
  • 黑马程序员上海校区/北京seo全网营销
  • 凡科做的网站百度不到/软文代写文案
  • 关键词优化排名工具/专业seo网站优化推广排名教程
  • php网站开发if的代码/国际新闻头条最新消息
  • 网站空间服务器/网络营销课程学什么
  • 免费自助建站自助建站平台/开发网站多少钱