Idea实现定时任务

定时任务

什么是定时任务?

可以自动在项目中根据设定的时长定期执行对应的操作

实现方式

Spring 3.0 版本之后自带定时任务,提供了@EnableScheduling注解和@Scheduled注解来实现定时任务功能。

使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式:

1、基于注解(@Scheduled)

2、基于注解设定多线程定时任务

1、基于注解(@Scheduled)

1.1 @Scheduled和@EnableScheduling

基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响。

@EnableScheduling注解: 在配置类上使用,开启计划任务的支持(类上)。

@Scheduled注解: 来声明这是一个任务,包括 cron,fixDelay,fixRate 等类型(方法上,需先开启计划任务的支持)。

1.1.1开启定时任务

SpringBoot 项目在项目启动类上添加 @EnableScheduling 注解即可开启定时任务管理。

1.1.2添加定时任务

1.1.2.1 fixedRate

finexRate:间隔的时间(单位为毫秒)

这时候就可以在下方定义测试方法,添加@Scheduling注解,开启一个定时方法

此时上面的方法每五秒执行一次,下面的方法每10秒执行一次,这个时候我们运行看一下控制台会输出什么

此时可以看到,在启动后立马执行了第一次,而第一次执行的顺序也是随机的,后面的每次执行都是根据定义的时长来进行轮流执行

如果遇到两个方法同一时间执行,则会根据谁的间隔时间短来判断,故上方是(朵拉)先执行

1.1.2.2 cron

该参数接收一个cron表达式,cron表达式是一个字符串,字符串以5或6个空格隔开,分开共6或7个域,每一个域代表一个含义。

cron 表达式语法:

格式:[秒] [分] [小时] [日] [月] [周] [年]

序号说明是否必填允许填写的值允许的通配符
10-59, - * /
20-59, - * /
3小时0-23, - * /
41-31, - * ? / L W
51-12 or JAN-DEC, - * /
61-7 or SUN-SAT, - * ? / L #
7empty 或 1970-2099, - * /

通配符说明:

*表示所有值. 例如:在分的字段上设置 "*",表示每一分钟都会触发。

? 表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为"?" 具体设置为 0 0 0 10 * ?

-表示区间。例如 在小时上设置 "10-12",表示 10,11,12点都会触发。

, 表示指定多个值,例如在周字段上设置 "MON,WED,FRI" 表示周一,周三和周五触发

/ 用于递增触发。如在秒上面设置"5/15" 表示从5秒开始,每增15秒触发(5,20,35,50)。在月字段上设置'1/3'所示每月1号开始,每隔三天触发一次。

L 表示最后的意思。在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会依据是否是润年[leap]), 在周字段上表示星期六,相当于"7"或"SAT"。如果在"L"前加上数字,则表示该数据的最后一个。例如在周字段上设置"6L"这样的格式,则表示“本月最后一个星期五"

W 表示离指定日期的最近那个工作日(周一至周五). 例如在日字段上设置"15W",表示离每月15号最近的那个工作日触发。如果15号正好是周六,则找最近的周五(14号)触发, 如果15号是周未,则找最近的下周一(16号)触发.如果15号正好在工作日(周一至周五),则就在该天触发。如果指定格式为 "1W",它则表示每月1号往后最近的工作日触发。如果1号正是周六,则将在3号下周一触发。(注,"W"前只能设置具体的数字,不允许区间"-").

# 序号(表示每月的第几个周几),例如在周字段上设置"6#3"表示在每月的第三个周六.注意如果指定"#5",正好第五周没有周六,则不会触发该配置(用在母亲节和父亲节再合适不过了)

现在,我们逐个解析

(1)*

任何地方都可使用,表示所有

现在就实现了每秒提醒朵拉吃饭,这样可以保证朵拉的饮食,防止变瘦

(2)?

仅可以在日期星期几中使用,表示不在乎时间

此图是实现在每月的第一天上午10点运行,但由于一个月只能实现一次,目前无控制台输出

例如:八月份的1号是周一,但九月份的1号不是周一,但是使用了就可以实现每月一号都输出

(3)/

任何地方都可使用,表示多久一次

朵拉每时每刻都能提醒吃饭,此时李勇杰不乐意了,为什么朵拉可以有人提醒,而自己没有,所以现在来提醒李勇杰吃东西

如果是上方朵拉的提醒方式,那么李勇杰就会撑死,所以我们要对他进行区间提醒,防止李勇杰被撑死了

此时可以看到,这时候我们使用传统的方式,李勇杰就会被撑死

那么肯定不能设定这么短的提醒时间

这个时候就可以实现从0点开始,每隔6小时提醒一次(时间过长不展示)

(4)-

任何地方都可使用,表示区间

上方的/是隔多久执行一次,并不能准确到某个时间点,如果要实现在9点22点之间每个小时都能提醒

就可以 使用到区间

上方这张图表示从9点22点之间,并且每分钟的0秒30秒之间,每秒都提醒一次

此时控制台就会根据间隔时间输出

(5),

在任何地方都可以使用、表示多种选择

如果此时想自定义的提醒,而不是根据指定间隔来提醒,这样就可以使用来实现

此图表达的意思是:在9-22点时间内,每执行到0,10,15,30,32,38,40,48,55秒的时候,就会给出提醒,这样就可以实现无规则的提醒

这里就可以看到每次到了指定的时间,就会提醒一次,这样就实现了无规则提醒

下方是一些经典案例

0 0 12 * * ?每天12点触发
0 15 10 ? * *每天10点15分触发
0 15 10 * * ?每天10点15分触发
0 15 10 * * ? *每天10点15分触发
0 15 10 * * ? 20052005年每天10点15分触发
0 * 14 * * ?每天下午的 2点到2点59分每分触发
0 0/5 14 * * ?每天下午的 2点到2点59分(整点开始,每隔5分触发)
0 0-5 14 * * ?每天下午的 2点到2点05分每分触发
0 10,44 14 ? 3 WED3月分每周三下午的 2点10分和2点44分触发
0 15 10 ? * MON-FRI从周一到周五每天上午的10点15分触发
0 15 10 15 * ?每月15号上午10点15分触发
0 15 10 L * ?每月最后一天的10点15分触发
0 15 10 ? * 6L每月最后一周的星期五的10点15分触发
0 15 10 ? * 6L 2002-2005从2002年到2005年每月最后一周的星期五的10点15分触发
0 15 10 ? * 6#3每月的第三周的星期五开始触发
0 0 12 1/5 * ?每月的第一个中午开始每隔5天触发一次
0 11 11 11 11 ?每年的11月11号 11点11分触发(光棍节)

另外,cron属性接收的cron表达式支持占位符。eg:

配置文件:

time:
  cron: */5 * * * * *
  interval: 5
每5秒执行一次:

@Scheduled(cron="${time.cron}")
void testPlaceholder1() {
    System.out.println("Execute at " + System.currentTimeMillis());
}
 
@Scheduled(cron="*/${time.interval} * * * * *")
void testPlaceholder2() {
    System.out.println("Execute at " + System.currentTimeMillis());
}

结果如下:

1.1.2.3 zone

时区,接收一个 java.util.TimeZone#ID。cron表达式会基于该时区解析。默认是一个空字符串,即取服务器所在地的时区。比如我们一般使用的时区Asia/Shanghai。该字段我们一般留空。

1.1.2.4 fixedDelay

上一次执行完毕时间点之后多长时间再执行。如:

@Scheduled(fixedDelay = 5000) //上一次执行完毕时间点之后5秒再执行

1.1.2.5 fixedDelayString

与 1.2.4 fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。如:

@Scheduled(fixedDelayString = "5000") //上一次执行完毕时间点之后5秒再执行

占位符的使用:

在 application.yml 配置文件中添加如下配置:

time:
  fixedDelay: 5000
编写相关代码:

@EnableScheduling
@SpringBootApplication
public class DemoApplication
{
    @Scheduled(fixedDelayString = "${time.fixedDelay}")
   public void test2() {
        System.out.println("李勇杰,该吃*了" + DateFormat.getDateTimeInstance().format(new Date()));
    }
}

执行结果:

1.1.2.6 fixedRateString

与 1.2.1 fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

1.1.2.7 initialDelay

第一次延迟多长时间后再执行。如:

@Scheduled(initialDelay=1000, fixedRate=5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次

1.1.2.8 initialDelayString

与 1.2.7 initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

2、基于注解设定多线程定时任务

创建多线程定时任务。

package com.pjb.Task;
 
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
 
/**
 * 基于注解设定多线程定时任务
 * @author pan_junbiao
 */
@Component
@EnableScheduling   // 1.开启定时任务
@EnableAsync        // 2.开启多线程
public class MultithreadScheduleTask
{
    @Async
    @Scheduled(fixedDelay = 1000)  //间隔1秒
    public void first() throws InterruptedException {
        System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
        System.out.println();
        Thread.sleep(1000 * 10);
    }
 
    @Async
    @Scheduled(fixedDelay = 2000)
    public void second() {
        System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
        System.out.println();
    }
}

注意:由于基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响。所以这里使用 @Async 注解很关键。

从控制台可以看出,第一个定时任务和第二个定时任务互不影响;

并且,由于开启了多线程,第一个任务的执行时间也不受其本身执行时间的限制,所以需要注意可能会出现重复操作导致数据异常。

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

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

相关文章

Spark实训

实训目的: 介绍本实训的基本内容,描述知识目标、,以及本实训的预期效果等。 1、知识目标 (1)了解spark概念、基础知识、spark处理的全周期,了解spark技术是新时代对人才的新要求。 (2)掌握Linux、hadoop、spark、hive集群环境的搭建、HDFS分布文件系统的基础知识与应用…

LoViT: 用于手术阶段识别的长视频Transformer|文献速递-生成式模型与transformer在医学影像中的应用

Title 题目 LoViT: Long Video Transformer for surgical phase recognition LoViT: 用于手术阶段识别的长视频Transformer 01 文献速递介绍 快速发展的手术数据科学(SDS)领域旨在通过先进利用手术室(OR)内医疗设备采集的数据…

Microi 吾码:后端开发的创新引擎与代码艺术

目录 一、引言 二、Microi 吾码后端架构概述 三、Microi 吾码在数据处理与优化方面的应用 四、Microi 吾码与外部服务的集成 五、Microi 吾码在安全性方面的考量与实现 六、Microi 吾码的性能监控与调优 七、总结 一、引言 在当今数字化浪潮汹涌澎湃的时代,软…

Day2——需求分析与设计

教师端签到应用软件的需求分析; 产品经理如何写好产品需求文档(附模板) 需求分析是软件开发过程中的关键步骤,它确保了开发的软件能够满足用户的需求。以下是进行需求分析的具体步骤: 1. 确定分析目标 明确教师端签到…

TypeScript进阶

Typescript进阶 基础知识 JavaScript 的核心特点就是灵活,但随着项目规模的增大,灵活反而增加开发者的心智负担。例如在代码中一个变量可以被赋予字符串、布尔、数字、甚至是函数,这样就充满了不确定性。而且这些不确定性可能需要在代码运行…

Unity性能优化---动态网格组合(二)

在上一篇中,组合的是同一个材质球的网格,如果其中有不一样的材质球会发生什么?如下图: 将场景中的一个物体替换为不同的材质球 运行之后,就变成了相同的材质。 要实现组合不同材质的网格步骤如下: 在父物体…

【C++】求第二大的数详细解析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯输入描述💯解题思路分析1. 题目核心要求2. 代码实现与解析3. 核心逻辑逐步解析定义并初始化变量遍历并处理输入数据更新最大值与次大值输…

修改git_bash命令行默认显示

1 背景 Git Bash默认显示用户名、主机、全路径,对于截图而言,会泄露一些隐私。 想办法去掉这些信息。 2 代码内容 # Shows Git branch name in prompt. parse_git_branch() {git branch 2> /dev/null | sed -e /^[^*]/d -e s/* \(.*\)/ (\1)/ } # …

Windwos Hyper-v 虚拟机SSH连接失败的问题

Windwos Hyper-v 虚拟机SSH连接失败的问题 一、问题现象: hyper-v里的虚拟机和宿主机都能正常访问外网,虚拟机也做了静态IP设置,但是宿主机就是无法通过SSH连接到虚拟机。 二、解决办法: 1、打开windows的高级网络设置&#x…

android studio创建虚拟机注意事项

emulator 启动模拟器的时候,可以用 AVD 界面,也可以用命令行启动,但命令行启 动的时候要注意,系统有两个 emulator.exe ,建议使用 emulator 目录下的那个!! 创建类型为google APIs的虚拟机可从…

Spring Boot中实现JPA多数据源配置指南

本文还有配套的精品资源,点击获取 简介:本文详细介绍了在Spring Boot项目中配置和使用JPA进行多数据源管理的步骤。从引入依赖开始,到配置数据源、创建DataSource bean、定义实体和Repository,最后到配置事务管理器和使用多数据…

CSS学习记录04

CSS边框 CSS border 属性指定元素边框的样式、宽度和颜色。border-style 属性指定要显示的边框类型。dotted - 定义点线边框dashed - 定义虚线边框solid - 定义实线边框double - 定义双边框groove - 定义3D坡口边框,效果取决于border-color值ridge - 定义3D脊线边框…

【ArcGISPro】训练自己的深度学习模型并使用

本教程主要训练的是识别汽车的对象检测模型 所使用的工具如下(导出训练数据进行深度学习、训练深度学习模型、使用深度学习检测对象) 1.准备训练数据 1.1新建面矢量,构建检测对象 右键地理数据库->新建->要素类 选择面类型 1.2点击编辑窗口进行勾画汽车检测对象…

芝法酱学习笔记(1.3)——SpringBoot+mybatis plus+atomikos实现多数据源事务

一、前言 1.1 业务需求 之前我们在讲解注册和登录的时候,有一个重要的技术点忽略了过去。那就是多数据源的事务问题。 按照我们的业务需求,monitor服务可能涉及同时对监控中心数据库和企业中心数据库进行操作,而我们希望这样的操作在一个事…

Centos服务器如何访问windows的共享目录

CentOS服务器访问Windows的共享目录通常需要使用SMB/CIFS(Server Message Block/Common Internet File System)协议。以下是详细的步骤: 1、Windows端设置共享文件夹 1)右键要共享的文件夹,点击属性-->在“共享”选…

JVM, JRE 和 JDK

JRE: Java Runtime Environment, Java 运行环境. JDK: Java Development Kit, Java 开发工具包. JRE JVM 核心类库 运行工具 JDK JVM 核心类库 开发工具 JVM: Java Virtual Machine, Java 虚拟机. 核心类库: Java 已经写好的东西, 直接拿来用即可. 开发工具: 包括 …

图数据库 | 13、图数据库架构设计——高性能计算架构再续

书接上文 图数据库 | 12、图数据库架构设计——高性能计算架构​​​​​​。昨天老夫就图数据库架构设计中的 实时图计算系统架构、图数据库模式与数据模型、核心引擎如何处理不同的数据类型、图计算引擎中的数据结构 这四块内容进行了展开讲解,今儿继续往下、往深…

Linux Cgroup学习笔记

文章目录 Cgroup(Control Group)引言简介Cgroup v1通用接口文件blkio子系统cpu子系统cpuacct子系统cpuset子系统devices子系统freezer子系统hugetlb子系统memory子系统net_cls子系统net_prio子系统perf_event子系统pids子系统misc子系统 Cgroup V2基础操作组织进程和线程popula…

R语言 | 峰峦图 / 山脊图

目的:为展示不同数据分布的差异。 1. ggplot2 实现 # 准备数据 datmtcars[, c("mpg", "cyl")] colnames(dat)c("value", "type") head(dat) # value type #Mazda RX4 21.0 6 #Mazda RX4 Wag …

java+ssm+mysql收纳培训网

项目介绍: 使用javassmmysql开发的收纳视频培训网,系统包含超级管理员,系统管理员、培训师、用户角色,功能如下: 超级管理员:管理员管理;用户管理(培训师、用户)&#…