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

【Spring Boot】定时任务

目录

前言

定时任务注解@Scheduled

设计一个定时任务

1.启用定时任务

2.创建定时任务

Cron 表达式详解

多线程定时任务

总结

定时任务框架xxl-job

SpringBoot继承定时任务框架

1.搭建调度中心xxl-job-admin

1.1下载项目

1.2修改配置文件端口和数据库代码

1.3连接到本地数据库,运行 db.sql

1.4启动项目,进行访问

2.在SpringBoot中运用

2.1引入依赖

 2.2编写配置文件

2.3编写xxlJob配置类

2.4创建定时任务

任务的运行与管理

高级功能

总结 


前言

在Spring Boot中,定时任务的实现通常使用@Scheduled注解。@Scheduled可以用于在指定的时间间隔或特定的时间点执行任务。Spring提供了多种方式来配置定时任务,如使用固定速率,固定延迟或Cron表达式等。如果是分布式系统或者想要时间可以灵活变化,可以选择一些定时任务框架xxl-job,elastic-job等

定时任务注解@Scheduled

设计一个定时任务

1.启用定时任务

首先,需要在 Spring Boot 应用中启用定时任务功能。可以在应用的主类或配置类中添加 @EnableScheduling 注解:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling
public class MySpringBootApplication {public static void main(String[] args) {SpringApplication.run(MySpringBootApplication.class, args);}
}

2.创建定时任务

接下来,可以创建一个带有 @Scheduled 注解的方法来定义定时任务。以下是几种常见的定时任务配置方式:

2.1. 固定速率执行任务

@Scheduled(fixedRate = 5000) 表示每隔 5 秒执行一次任务。任务的开始时间之间间隔是固定的。

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Component
public class MyScheduledTask {@Scheduled(fixedRate = 5000)public void executeTask() {System.out.println("Fixed rate task executed at " + System.currentTimeMillis());}
}

2.2. 固定延迟执行任务

@Scheduled(fixedDelay = 5000) 表示任务在上一个任务完成后的 5 秒后执行。任务完成时间和下一个任务开始时间之间的间隔是固定的。

@Component
public class MyScheduledTask {@Scheduled(fixedDelay = 5000)public void executeTask() {System.out.println("Fixed delay task executed at " + System.currentTimeMillis());}
}

2.3. 使用 Cron 表达式

@Scheduled(cron = "0 0/1 * * * ?") 表示每分钟的开始执行任务。Cron 表达式提供了更灵活和精确的时间控制。

@Component
public class MyScheduledTask {@Scheduled(cron = "0 0/1 * * * ?")public void executeTask() {System.out.println("Cron expression task executed at " + System.currentTimeMillis());}
}

Cron 表达式详解

Cron 表达式的格式如下:

秒 分 时 日 月 星期 [年]
  • :0-59
  • :0-59
  • :0-23
  • :1-31
  • :1-12
  • 星期:0-7(0 和 7 都表示周日)

常见的 Cron 表达式例子:

  • "0 0 12 * * ?" :每天中午 12 点执行
  • "0 15 10 ? * *":每天上午 10:15 执行
  • "0 0/5 * * * ?":每 5 分钟执行一次
  • "0 0 0 1 1 ?":每年 1 月 1 日午夜执行

多线程定时任务

默认情况下,所有的定时任务都在单线程中执行。如果你希望并发执行多个定时任务,可以自定义 TaskScheduler

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;@Configuration
public class SchedulingConfig {@Beanpublic ThreadPoolTaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(10);  // 设置线程池大小scheduler.setThreadNamePrefix("scheduled-task-");return scheduler;}
}

总结

在 Spring Boot 中,通过使用 @Scheduled 注解和配置定时任务,你可以轻松实现各种类型的定时任务,如固定速率执行、固定延迟执行、基于 Cron 表达式的定时任务等。根据需求,还可以配置多线程调度器或使用配置文件来动态管理定时任务的执行行为。

定时任务框架xxl-job

XXL-JOB 是一个分布式任务调度平台,旨在解决分布式系统中的任务调度问题。相比于 Spring Boot 自带的 @Scheduled 注解,XXL-JOB 提供了更加灵活和强大的任务调度能力,支持集群模式下的任务调度、任务的可视化管理、任务的失败重试等功能。

SpringBoot继承定时任务框架

1.搭建调度中心xxl-job-admin

1.1下载项目

https://github.com/xuxueli/xxl-job

1.2修改配置文件端口和数据库代码

1.3连接到本地数据库,运行 db.sql

1.4启动项目,进行访问

用户名:admin,密码:123456,这个是默认初始化的用户名和密码

2.在SpringBoot中运用

2.1引入依赖

首先,在你的 Spring Boot 项目中引入 XXL-JOB 的依赖。可以在 pom.xml 文件中添加以下依赖:

<dependency><groupId>com.xuxueli</groupId><artifactId>xxl-job-core</artifactId><version>2.3.0</version>
</dependency>
 2.2编写配置文件

接下来,需要配置 XXL-JOB。在 application.properties 中添加以下配置:


xxl.job.admin.addresses=http://127.0.0.1:8181/xxl-job-admin
xxl.job.accessToken=default_token册
xxl.job.executor.appname=xxl-job-executor-test
xxl.job.executor.address=
xxl.job.executor.ip=
xxl.job.executor.port=9999
xxl.job.executor.logpath=D:/data/applogs/xxl-job/jobhandlerxxl.job.executor.logretentiondays=30
2.3编写xxlJob配置类
package com.example.excel;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.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() {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;}
}
2.4创建定时任务

要创建一个定时任务,需要在服务中定义一个方法,并使用 @XxlJob 注解标识该方法为任务。

import com.xxl.job.core.handler.annotation.XxlJob;
import org.springframework.stereotype.Component;@Component
public class MyXxlJob {@XxlJob("mySimpleJobHandler")public void execute() throws Exception {System.out.println("XXL-JOB Task executed at " + System.currentTimeMillis());}
}

2.5在 XXL-JOB 管理平台中配置任务

登录后台后, 点击执行器管理,新增执行器

然后在任务配置页面,填写任务的基本信息,如任务名称,执行器,任务描述,CRON表达式等

在“JobHandler”字段中填写 mySimpleJobHandler(即你在代码中定义的 @XxlJob 注解的名称)

任务的运行与管理

配置完成后,你可以在 XXL-JOB 管理后台中手动触发任务执行,也可以根据配置的 CRON 表达式自动调度任务。管理后台还提供了任务执行日志查看、失败重试、任务禁用启用等功能。

高级功能

XXL-JOB 还支持一些高级功能,如:

  • 任务分片:在集群模式下,将任务分配给多个执行器。
  • 失败重试:任务失败时自动重试。
  • 任务依赖:配置任务之间的依赖关系。
  • 动态参数:支持在任务执行时动态传递参数。

总结 

使用 XXL-JOB,可以轻松实现分布式环境下的定时任务调度,并且通过管理平台实现任务的可视化管理和监控。相比 Spring 的 @Scheduled 注解,XXL-JOB 更适合于复杂的分布式任务调度场景。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • DID测试套件
  • flume系列之:flume生产环境sink重要参数理解
  • 微积分-定积分4.4(不定积分和净变化定理)
  • Spring 04: 注解开发
  • 代码随想录算法训练营第四十六天|回文子串、最长回文子序列
  • 算法急救LeetCode62题-python版(1)/ 数组、链表
  • 电子管的检测
  • day17:一文弄懂“无参装饰器”、“有参装饰器”和“叠加装饰器”
  • Echarts添加水印
  • 第八季完美童模全球人气冠军【夏沛然】荣耀加冕 见证星芒风采!
  • 【运维】Linux如何解压.rar文件
  • 微前端架构入门
  • uniapp left right 的左右模态框
  • webrtc ns 降噪之粉红噪声参数推导
  • 微软Edge浏览器
  • ES6指北【2】—— 箭头函数
  • [LeetCode] Wiggle Sort
  • [rust! #004] [译] Rust 的内置 Traits, 使用场景, 方式, 和原因
  • Fabric架构演变之路
  • HTTP中GET与POST的区别 99%的错误认识
  • javascript面向对象之创建对象
  • java中的hashCode
  • PAT A1017 优先队列
  • Quartz初级教程
  • RxJS: 简单入门
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • VUE es6技巧写法(持续更新中~~~)
  • 翻译:Hystrix - How To Use
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 数据仓库的几种建模方法
  • 吐槽Javascript系列二:数组中的splice和slice方法
  • 详解移动APP与web APP的区别
  • 项目实战-Api的解决方案
  • 小试R空间处理新库sf
  • 阿里云移动端播放器高级功能介绍
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • #include<初见C语言之指针(5)>
  • #pragma once与条件编译
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • #微信小程序(布局、渲染层基础知识)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $().each和$.each的区别
  • (10)ATF MMU转换表
  • (DenseNet)Densely Connected Convolutional Networks--Gao Huang
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (十)c52学习之旅-定时器实验
  • (算法)求1到1亿间的质数或素数
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (转载)Linux 多线程条件变量同步
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ***原理与防范
  • .NET C# 使用 iText 生成PDF
  • .NET Core 通过 Ef Core 操作 Mysql