Spring Boot定时任务

news/2024/11/14 14:27:09/

目录

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 {@Autowiredprivate 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 {@Beanpublic TaskScheduler taskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setPoolSize(10); // 设置线程池大小// 设置其他线程池属性,如队列容量、线程名前缀等return scheduler;}
}


 


http://www.ppmy.cn/news/126606.html

相关文章

大厂纷纷押宝“元宇宙”“鸡肋”智能眼镜难成密钥

关于西方眼镜的发展史&#xff0c;可以回溯到中国元代。 1270年&#xff0c;马可波罗将在中国学习到眼镜的制作、使用方法带回了西方&#xff0c;拉开了西方眼镜发展史的序幕。 随后&#xff0c;经过555年的发展&#xff0c;到1825年&#xff0c;乔治艾利正式发明了用于矫正散…

智能手机谷歌眼镜都是嵌入式计算机,如何在手机上“运行”谷歌眼镜

腾讯数码讯(编译&#xff1a;Irene)想知道如何在Android手机上“运行”微博)眼镜吗&#xff1f;阅读下面的文章吧。 无论你怎么看待谷歌眼镜&#xff0c;你都会好奇它具体是怎样工作的。它的用户界面(UI)是怎么样的呢&#xff1f;它又是怎样从一个应用切换到另一个应用&#xf…

AR智能眼镜会成未来趋势

简述 目前&#xff0c;5G时代已经开启&#xff0c;5G人工智能也给音视频产业发展带来许多新的课题。工信部电子信息司副司长乔跃山在会上表示&#xff0c;当前&#xff0c;音视频正在加快与人工智能、5G信息显示等领域的融合&#xff0c;不断催生新业态和商业模式&#xff0c;…

谷歌智能眼镜回归,针对商业用户售价999美元

编译&#xff1a;小小 来源&#xff1a;网易智能 据CNBC报道&#xff0c;美国当地时间周一&#xff0c;谷歌发布了其最新智能眼镜——谷歌眼镜企业版2&#xff08;Google Glass Enterprise Edition 2&#xff09;&#xff0c;它是专门针对商业用户推出的增强现实&#xff08;AR…

智能眼镜前景

全球科技巨头Google、Apple在智能眼镜研发走在前列&#xff0c;分别推出了“ProjectGlass”和“iGlass”产品。如果仅知道这两家公司涉足智能眼镜&#xff0c;那么显然&#xff0c;你真OUT了。 日本相机制造商Olympus、法国Laster也纷纷加入了这场游戏。 Olympus最新发布的MEG4…

智能眼镜、语音识别等8种输入设备即将取代传统键盘

智能眼镜、语音识别等8种输入设备即将取代传统键盘 [导读]19 世纪70年代&#xff0c;当克里斯托弗&middot;莱瑟姆&middot;肖尔斯(Christopher Latham Sholes)发明QWERTY键盘时&#xff0c;他恐怕不会想到他的基本设计理念一直延续了150年&#xff0c;直至当前的数字化时…

Facebook也要玩智能眼镜

BI中文站 7月27日 报道 Facebook已清楚地表明&#xff0c;它不再仅局限于做一个社交网络。它已在很多领域与谷歌(微博)展开了竞争&#xff1a;搜索、新兴科技市场以及后台式电脑时代的计算设备。 现在&#xff0c;Facebook斥资20亿美元收购Oculus公司的交易已经完成&#xff0…

中国AR智能隐形眼镜市场竞争态势与投资规划分析报告2022-2028年

中国AR智能隐形眼镜市场竞争态势与投资规划分析报告2022-2028年 2021年中国AR智能隐形眼镜市场销售收入达到了 万元&#xff0c;预计2028年可以达到 万元&#xff0c;2022-2028期间年复合增长率(CAGR)为 %。中国市场核心厂商包括Mojo Vision、InWith、Smart Contact Lens、Raa…