Spring Boot定时任务

news2024/9/21 19:01:04

目录

1.概述

2.Spring Boot定时任务

2.1.快速使用

2.2.cron表达式

3.业务示例

3.1.业务描述

3.2.业务实现

4.实现原理

5.自定义线程池


1.概述

在某些业务场景中,需要定时执行一些任务,有可能是定时统计然后生成报表,有可能是定时发起一个任务。最近在工作中就正好遇见一个定时发起问卷任务的一个业务场景,此处集合业务场景聊聊如何用spring boot来实现功能。

2.Spring Boot定时任务

2.1.快速使用

spring boot支持了定时任务,通过很简单的配置就可以使用。

依赖:

定时任务是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.2.cron表达式

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

下面是cron表达式的每个字段的含义和可接受的取值:

  1. 秒(0-59)
  2. 分钟(0-59)
  3. 小时(0-23)
  4. 日(1-31)
  5. 月(1-12或JAN-DEC)
  6. 周几(0-7或SUN-SAT,其中0和7都表示周日)

除了具体的取值范围,cron表达式还支持一些特殊字符和符号:

  • 星号(*):表示匹配任意值。例如,使用星号在秒字段中,表示任务在每一秒都会被触发。
  • 问号(?):仅在日期和周几字段中使用,表示不指定具体的值。如果你想在日期字段中匹配任意值,但同时又想在周几字段中指定具体值,就可以使用问号。
  • 斜线(/):用于指定增量。例如,在分钟字段中使用5/10,表示从第5分钟开始,每隔10分钟触发一次。
  • 逗号(,):用于列举多个值。例如,在周几字段中使用1,3,5,表示任务在周一、周三和周五触发。
  • 连接符(-):用于指定范围。例如,在小时字段中使用9-17,表示任务在9点到17点之间触发。

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

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

3.业务示例

3.1.业务描述

需求:

  • 管理人员新建一个问卷调查任务,任务在固定时间发起,固定时间结束。
  • 任务开始后,系统的每个用户会收到一份问卷
  • 任务结束后,用户不可再答题

实体关系:

整个实体关系很简单,就是一个任务一种模板,一个任务多份问卷,一个模板N份问卷,一个问卷一个用户。

问卷里记录了模板内容、任务ID、用户ID。

3.2.业务实现

问卷调查任务类:

这里使用JPA去访问数据库

@Entity
@Table(name = "survey_task")
public class SurveyTask {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String taskName;

    private LocalDateTime startTime;

    // 其他属性和对应的getter/setter方法
}

定时任务:

这里只是简单的写了一下定时任务的逻辑,实际的代码实现从简。

@Service
public class SurveyTaskScheduler {

    @Autowired
    private SurveyTaskRepository surveyTaskRepository;

    @Scheduled(cron = "0 0 0 * * *") // 每天凌晨执行
    public void distributeSurveyTemplates() {
        LocalDate today = LocalDate.now();
        LocalDateTime startOfDay = today.atStartOfDay();

        List<SurveyTask> surveyTasks = surveyTaskRepository.findByStartTime(startOfDay);

        for (SurveyTask task : surveyTasks) {
            // 根据任务分发问卷模板给用户的逻辑
            // ...
            System.out.println("分发问卷模板给用户: " + task.getTaskName());
        }
    }
}

启动定时任务:

@SpringBootApplication
@EnableScheduling
public class MyApp {

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

4.实现原理

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

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

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

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

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

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

5.自定义线程池

如果在 Spring Boot 中没有显式配置线程池,那么会使用默认的线程池配置。但是有时候可能我们也需要自定义线程池,自定义线程池的示例如下:

@Configuration
public class CustomThreadPoolConfig {
    
    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10); // 设置线程池大小
        // 设置其他线程池属性,如队列容量、线程名前缀等
        
        return scheduler;
    }
}


 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python自定义函数

目录 1. 语法 2. 常见用法 2.1. 函数的返回值 2.2. 函数互相调用 3. 实战练习 3.1. 定义执行Linux命令的函数 1. 语法 #定义函数 def 函数名(参数1, 参数2):函数体(代码块)......#调用函数(定义函数时使用了参数&#xff0c;调用也必须使用参数) 函数名(参数1, 参数2) 定…

React学习6 路由

SPA的理解 单页Web应用&#xff08;single page web application&#xff0c;SPA&#xff09;。整个应用只有一个完整的页面。点击页面中的链接不会刷新页面&#xff0c;只会做页面的局部更新。数据都需要通过ajax请求获取, 并在前端异步展现。 什么是路由? 一个路由就是一个…

网络连接管理除了TCP三次握手,还有TCP四次挥手

网络连接管理除了TCP三次握手&#xff0c;还有TCP四次挥手 TCP三次握手&#xff0c;TCP四次挥手 网络连接管理除了TCP三次握手&#xff0c;还有TCP四次挥手TCP三次握手TCP四次挥手总结 TCP三次握手 网络通信建立连接&#xff0c;TCP会进行三次握手&#xff0c;三次握手主要是两…

【叠高高】叠蛋糕游戏的微信小程序开发流程详解

记得小时候玩过的搭积木游戏吗&#xff0c;和叠高高游戏原理差不多的&#xff0c;与之类似的还有盖高楼游戏&#xff0c;就是看谁盖的&#xff08;叠的&#xff09;最高&#xff0c;这里讲一下比较基础的叠高高游戏小程序实现过程&#xff0c;对编程感兴趣的同学可以参考学习一…

Linux Shell 实现一键部署Rust1.69

rust 前言 一门赋予每个人&#xff0c;构建可靠且高效软件能力的语言。 全世界已有数百家公司在生产环境中使用 Rust&#xff0c;以达到快速、跨平台、低资源占用的目的。很多著名且受欢迎的软件&#xff0c;例如 Firefox、 Dropbox 和 Cloudflare 都在使用 Rust。从初创公司…

网络安全工程师的入门学习路径,年薪30W不是梦!

最近看到网上有很多人在问诸如&#xff1a;“怎样成为网络信息安全工程师”等相关问题&#xff0c;这可能与近几年网络安全事件频发&#xff0c;国家对于互联网信息安全和互联网舆情的重视程度不断提升有关&#xff0c;网络信息安全工程师随之成为炙手可热的职业。 首先&#…

Web的基本漏洞--文件包含漏洞

目录 一、文件包含漏洞的介绍 1.文件包含漏洞的原理 2.常见的文件包含函数 3.文件包含漏洞的分类 本地文件包含漏洞 远程文件包含漏洞 3.文件包含漏洞的危害 4.文件包含漏洞的防范措施 5.文件包含漏洞的绕过手法 空字符绕过 超长字符绕过 一、文件包含漏洞的介绍 1…

5年经验之谈:月薪3000到30000,测试工程师的变“行”记

自我介绍下&#xff0c;我是一名转IT测试人&#xff0c;我的专业是化学&#xff0c;去化工厂实习才发现这专业的坑人之处&#xff0c;化学试剂害人不浅&#xff0c;有毒&#xff0c;易燃易爆&#xff0c;实验室经常用丙酮&#xff0c;甲醇&#xff0c;四氯化碳&#xff0c;接触…

你需要知道的 Selenium4 新特性

前言 最近又用到了Selneium&#xff0c;发现已经来到了 4.9 版本了。本篇文章来介绍下它较比 Selenium3 的一些新特性。 记录下&#xff0c;当是做笔记了。 最令人惊喜的是&#xff0c;Selenium4 会自动回收浏览器资源。 本文所使用的 Selenium 版本为 4.9.9 知识点&#x1f4…

开发一个收废品小程序步骤

随着环保意识的提升和可持续发展的迫切需求&#xff0c;废品回收成为了一个重要的议题。预约上门回收小程序的开发为用户提供了方便、快捷的废品回收服务&#xff0c;促进了废品资源的再利用和环保行动的推进。本文将介绍开发预约上门回收小程序的流程&#xff0c;以帮助开发人…

java12--本章作业

1. 第1题 public class Hello{public static void main(String[] args){Person[] persons new Person[3];persons[0] new Person("zsq", 18, "学生");persons[1] new Person("zzq", 19, "大学生");persons[2] new Person("zq…

【leetcode】1130. 叶值的最小代价生成树

1130. 叶值的最小代价生成树 1、问题描述2、解决方案2.1、动态规划2.1.1、问题分析2.1.2、代码实现 2.2、单调栈 1、问题描述 1130. 叶值的最小代价生成树 给你一个正整数数组 arr&#xff0c;考虑所有满足以下条件的二叉树&#xff1a; 每个节点都有 0 个或是 2 个子节点。数…

一文3000字实现基于Selenium+Python的web自动化测试框架

一、什么是Selenium&#xff1f; Selenium是一个基于浏览器的自动化测试工具&#xff0c;它提供了一种跨平台、跨浏览器的端到端的web自动化解决方案。Selenium主要包括三部分&#xff1a;Selenium IDE、Selenium WebDriver 和Selenium Grid。 Selenium IDE&#xff1a;Firefo…

2.4 IDEA开发词频统计项目

一、词频统计准备工作 &#xff08;一&#xff09;启动集群的HDFS与Spark 启动HDFS服务 启动Spark集群 &#xff08;二&#xff09;在HDFS上准备单词文件 在master虚拟机上创建单词文件 - words.txt 将单词文件上传到HDFS指定目录/wordcount/input 二、本地模式运行Sp…

RCE漏洞演示,墨者靶场

#案列演示 打开墨者靶场&#xff0c;黑盒#命令注入执行分析 这个功能点有这么个功能&#xff0c;进行类似的像我们电脑上ping命令&#xff0c;这相当于就满足了命令&#xff0c;明显可能出现命令执行漏洞&#xff0c;可控变量和漏洞函数都存在。第一要去分析是什么操作系统&am…

批量 ping 网段的终极方法

我们分析和判定网络故障&#xff0c;如果有 10 设备&#xff0c;100 台设备&#xff0c;1000 台设备怎么办&#xff1f;一个个 ping 过去人都要疯掉了&#xff0c;这种情况在大型网络中我们有可能遇到&#xff0c;那怎么办呢&#xff1f;来听听海翎光电小编的一点看法吧&#x…

Spark写入Hive报错Mkdir failed on :com.alibaba.jfs.JindoRequestPath

1. 报错内容 23/05/31 14:32:13 INFO [Driver] FsStats: cmdmkdirs, srcoss://sync-to-bi.[马赛克].aliyuncs.com/tmp/hive, dstnull, size0, parameterFsPermission:rwx-wx-wx, time-in-ms32, version3.5.0 23/05/31 14:32:13 ERROR [Driver] ApplicationMaster: User class …

八大技术架构——升级之路

目录 一、单机架构 简介 工作原理 架构优缺点 相关软件 二、应用数据分离架构 简介 工作原理 架构优缺点 三、应用服务集群架构 简介 出现原因 工作原理 架构优缺点 相关软件 四、读写分离/主从分离架构 简介 工作原理 架构优缺点 相关软件 五、冷热分离架…

JMeter数据库性能测试指南:全面掌握基础操作

1.网络请求时间 2.数据库查询的时间 数据库性能指标 TPS:每秒事务数&#xff08;一秒钟服务器处理的事务数&#xff0c;事务指&#xff0c;请求出去到响应回来的整个过程的时间&#xff09; QPS:每秒查询量&#xff08;就是数据库每秒执行的SQL数量&#xff0c;包含insert/…

239:设置extent:bbox,限制瓦片图的加载范围,不加载空白瓦片

第239个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers中加载geoserver发布的数据,这里主要介绍extent,设置bbox附加载layer上,目的是bbox在可视范围内才加载瓦片,否则不加载,好处是不用加载空白的瓦片数据。 直接复制下面的 vue+openlayers源代码,操作…