SpringBoot定时任务(一看就会)

一、引入依赖

        定时任务是spring boot框架提供的基础能力之一,所以其依赖是在spring-boot-starter里面,但是一般开发的时候我们直接引入web依赖即可,web依赖中包含了spring-boot-starter。要注意的是Spring Boot 从版本1.3.0开始提供对定时任务的支持,本文用的依赖默认是支持定时任务的版本。

<dependencies>
    <!-- Spring Boot Web Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

二、如何使用定时任务

2.1  开启定时任务注解

使用@EnableScheduling注解开启定时任务,通常在启动类、配置类中使用该注解开启定时任务

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class YourApplication {

    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }

}

2.2  使用@Scheduled注解来创建定时任务,设置定时任务时间

        创建一个类,该类要被SpringBoot管理起来,故通常添加@Component或@Configuration注解,以将其标记为Spring组件。

        然后创建需要定时执行的方法,在方法使用@Scheduled注解来创建定时任务。使用fixedRate属性可以指定任务的执行频率,单位默认是毫秒

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class YourScheduledTask {

    @Scheduled(fixedRate = 5000) // 每隔5秒执行一次任务
    public void yourTask() {
        // 执行你的任务逻辑
    }

}

 这里设置为5000毫秒(5秒)

2.3  运行你的Spring Boot应用,定时任务将会自动执行

        请注意,在以上的例子中,定时任务是基于单个线程池来执行的,默认是一个单线程的线程池。如果需要执行大量的定时任务,或者有一些耗时的任务,你可能需要配置一个线程池来提高性能。你可以在配置文件中添加以下属性来自定义线程池配置:

# application.properties
spring.task.scheduling.pool.size=10

上述配置将创建一个大小为10的线程池。

三、cron表达式

        @Scheduled注解还可以使用cron表达式来定义定时任务的执行条件的。cron表达式由6个字段组成,分别表示秒、分、时、日、月、周几。每个字段都可以接受特定的取值范围或通配符来表示时间的匹配规则。

 在线生成cron表达式的地址:  在线Cron表达式生成器

3.1 时间范围

Cron表达式由空格分隔的6个或7个字段组成,每个字段代表一个时间单位。字段的取值范围如下:

        SpringBoot的cron表达式是不包含年(Year)的前六位

3.2 特殊字符

以下是一些示例cron表达式的用法:

  • 0 0 0 * * *:每天凌晨执行任务
  • 0 0/5 * * * *:每隔5分钟执行任务
  • 0 0 9-17 * * MON-FRI:周一至周五的9点到17点之间每小时执行任务

        在线生成cron表达式的地址:  在线Cron表达式生成器

四、异步多线程实现定时任务

        SpringBoot默认是单线程的定时任务,如果任务持续时间较长,就会将后续定时任务拖延,导致丢失任务。

        在Spring Boot中,可以使用Spring的@Async注解和TaskScheduler来实现异步多线程的定时任务。下面是一个简单的例子:

4.1  首先,在Spring Boot的主类或配置类上添加@EnableAsync注解以启用异步支持

@EnableAsync注解是SpringBoot中用于启动异步方法调用的注解

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling  //开启定时任务
@EnableAsync        //开启异步多线程支持
public class YourApplication {

    public static void main(String[] args) {
        SpringApplication.run(YourApplication.class, args);
    }

}

4.2  在定时任务上的方法上加上@Async注解(设置异步执行)

@Async 注解是 Spring 框架中用于声明一个方法是异步执行的。当你在一个类的方法上添加 @Async 注解时,Spring 会在执行该方法时开启一个新的线程来处理该方法,这样可以让你的应用程序同时执行多个任务,提高程序的效率。

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class YourScheduledTask {

    @Async
    @Scheduled(fixedRate = 5000) // 每隔5秒执行一次任务
    public void yourTask() {
        // 执行你的任务逻辑
    }

}

五、SpringBoot定时任务的实现原理

spring boot的定时任务底层其实就是使用线程池来实现的,其流程如下:

        1.首先,Spring Boot 根据配置文件中的属性创建一个 TaskScheduler(如果没有自定义线程池会使用默认线程池ThreadPoolTaskScheduler)实例作为调度器,并设置线程池的相关属性,例如核心线程数、最大线程数、队列容量等。

        2.当应用启动时,Spring Boot 会扫描所有被 @Scheduled 注解标记的方法,并将这些方法注册为定时任务。

        3.当定时任务的触发条件满足时,调度器将从线程池中选择一个线程来执行任务。

        4.执行任务时,调度器会通过 TaskExecutor(默认为 ThreadPoolTaskExecutor)实例来执行任务。它会从线程池中选择一个空闲的线程来执行被 @Scheduled 注解标记的方法。

        4.执行完成后,线程将返回到线程池中等待下一次调度。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/178302.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

写单元测试,没你想得那么简单!

前言 单元测试是什么我们就简单介绍一下&#xff1a; 单元测试是针对程序模块&#xff08;软件设计的最小单位&#xff09;来进行正确性检验的测试工作。程序单元是应用的最小可测试部件。 接下来是本人对单元测试的理解和实践。里面没有废话&#xff0c;希望每句话能说到你心…

LangChain: 类似 Flask/FastAPI 之于 Django,LangServe 就是「LangChain 自己的 FastAPI」

原文&#xff1a;LangChain: 类似 Flask/FastAPI 之于 Django&#xff0c;LangServe 就是「LangChain 自己的 FastAPI」 - 知乎 说明&#xff1a;LangServe代替 langchainserver 成为新的langchain 部署工具 官网资料&#xff1a;&#x1f99c;️&#x1f3d3; LangServe | &…

批量插入SQL 错误 [933] [42000]: ORA-00933: SQL 命令未正确结束

使用DBeaver向【oracle数据库】插入大量数据 INSERT INTO Student(name,sex,age,address,birthday) VALUES(Nike,男,18,北京,2000-01-01) ,(Nike,男,18,北京,2000-01-01) ,(Nike,女,18,北京,2000-01-01) ,(Nike,女,18,北京,2000-01-01) ,(Nike,男,18,北京,2000-01-01) ,(Nike…

【JDK源码阅读】什么是 avoid getfield opcode ?

说明&#xff1a;JDK源码版本为 Oracle JDK 8 1. 背景 阅读 java.lang.String 的源码&#xff0c;会发现有些地方注释为/* avoid getfield opcode */&#xff0c;此处的代码是将当前类定义的成员变量引用为本地变量&#xff0c;从字面意思理解&#xff0c;是为了避免使用 get…

计算机基础知识——字,字节,进制,short,byte等

目录 进制位&#xff0c;字节&#xff0c;字Byte&#xff0c;ShortByteBuf有符号数和无符号数 进制 HEX&#xff0c;Hexadecimal &#xff0c;十六进制。 DEC&#xff0c;Decimal &#xff0c;十进制。 OCT&#xff0c;Octal &#xff0c;八进制。 BIN&#xff0c;Binary &a…

基于java和uniapp的即时聊天源码

聊天IM&#xff0c;支持单聊、群聊、朋友圈、摇一摇、附近的人、收藏、扫码、机器人、文字、图片、名片、实时音视频通话等功能。用uniapp开发&#xff0c;支持打包成多终端&#xff01; 推送&#xff1a;uniPush websocket资源&#xff1a;阿里OSS&#xff08;图片、声音、视…

JMeter —— 接口自动化测试(数据驱动)

前言 之前我们的用例数据都是配置在HTTP请求中&#xff0c;每次需要增加&#xff0c;修改用例都需要打开JMeter重新编辑&#xff0c;当用例越来越多的时候&#xff0c;用例维护起来就越来越麻烦&#xff0c;有没有好的方法来解决这种情况呢&#xff1f;我们可以将用例的数据存…

vxe编辑保存表格

业务需求&#xff1a; 1、需要点击编辑时&#xff0c;全部表格显示编辑框&#xff0c;点击保存&#xff0c;全部保存。 2、因为位置问题&#xff0c;产品经理把24小时分成了两行&#xff0c;开发就得分两个表格。列标题是写死的&#xff0c;文字偏移也是写死的&#xff0c;其他…

Linux设置静态IP

Linux设置静态IP 使用ip addr查看ip&#xff0c;如下所示就是动态IP 1、什么是静态IP&#xff1f; 静态ip就是固定的ip&#xff0c;需要手动设置。静态IP地址&#xff08;又称固定IP地址&#xff09;是长期分配给一台计算机或网络设备使用的 IP 地址。一般来说&#xff0c;一…

电商平台API接口的作用到底是什么?重要性又是什么?具体接入方式?

电商平台API接口的重要性及其作用主要体现在以下几个方面&#xff1a; 数据支持&#xff1a;电商平台拥有大量的商品信息、用户信息、交易信息等大数据资产&#xff0c;而API接口提供访问这些数据的途径&#xff0c;使得其他软件、应用、网站等可以利用这些数据提供更丰富的功…

【三维几何学习】自制简单的网格可视化软件 — Mesh Visualization

自制简单的网格可视化软件 — Mesh Visualization 引言一、整体框架1.1 三角形网格1.2 界面管理1.3 VTK可视化界面 二、核心源码2.1 三角形网格&#xff1a;TriMesh类2.2 界面Widget_Mesh_Manager2.3 VTK可视化2.4 main 引言 使用PyQt自制简单的网格可视化软件 - 视频展示 本是…

Echarts实现散点图

效果图如下&#xff1a; <html><head><meta charsetutf-8><link rel"stylesheet" href"js/leaflet1.7.1/dist/leaflet.css"/><script src"js/leaflet1.7.1/dist/leaflet.js"></script><script src"…

win10 eclipse安装教程

前言&#xff1a;安装eclipse之前必须安装JDK&#xff0c;JDK是编译环境&#xff0c;eclipse是集成开发平台。 一、JDK的安装 Java Development Kit 简称 JDK (一). 官方下载地址&#xff1a; Java Archive Downloads - Java SE 8u211 and later (oracle.com) 找到&#xf…

用Stable Diffusion帮助进行卡通风格渲染

用Stable Diffusion帮助进行卡通风格渲染 正常风格渲染卡通风格贴图增加涅斐尔边缘高光效果 正常风格渲染 正常的动物写实模型 卡通风格贴图 用Stable Diffusion可以帮助我们将写实贴图转化为卡通风格&#xff08;具体参数可以自己调试&#xff0c;总体上是将提示词强度和图…

《QT从基础到进阶·三十八》QWidget实现炫酷log日志打印界面

QWidget实现了log日志的打印功能&#xff0c;不仅可以在界面显示&#xff0c;还可以生成打印日志。先来看下效果&#xff0c;源码放在文章末尾&#xff1a; LogPlugin插件类管理log所有功能&#xff0c;它可以获取Log界面并能打印正常信息&#xff0c;警告信息和错误信息&…

【101011011序列检测_2023.11.20】

源文件 tb文件in输入&#xff1a;01010‘1011011’0 VCS仿真结果 当next_state为s9时&#xff0c;out置为1

软考中级哪个科目最简单?

那必须是系统集成项目管理工程师&#xff01; 系统集成项目管理工程师考试内容少&#xff0c;题型简&#xff0c;报考门槛低&#xff0c;零基础就能报考&#xff0c;学习内容比较简单&#xff0c;接近工作和生活。 系统集成项目管理工程师证书是中国计算机技术职业资格&#…

【React-Router】嵌套路由

1. 嵌套路由 在一级路由中又内嵌了其他路由&#xff0c;这种关系就叫做嵌套路由。 2. 嵌套路由配置 // /page/About/index.js const About () > {return (<div>二级路由 About 组件</div>) }export default About// /page/Layout/index.js import { Outlet, …

Ajax技

Ajax的特点 异步提交&#xff1a;Ajax采用异步通信方式&#xff0c;能够在页面无需重新加载的情况下向服务器发送请求并接收响应数据&#xff0c;提升了用户体验。无需插件&#xff1a;Ajax是基于标准浏览器的Javascript和XMLHttpRequest对象实现的&#xff0c;无需安装插件或…