0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

从各个维度再次介绍Spring Boot定时任务调度

jf_78858299 来源:SpringBoot 作者:林祥纤 2023-04-12 11:01 次阅读

我们先看下本节的大纲:

(1)定时任务的几种实现方式;

(2)Spring Task入门;

(3)cronExpression配置说明;

(4)cronExpression实例;

接下来我们看看具体的每个步骤:

(1)定时任务的几种实现方式;

TimerJava自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。

Quartz :使用Quartz,这是一个功能比较强大的的调度器,可以让你的程序在指定时间执行,也可以按照某一个频度执行,配置起来稍显复杂。

SpringTask :Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。

(2)SpringTask入门;

再次我们编写一个简单的例子学习下定时器的简单应用:

(a)新建一个spring-boot-task工程;

这个步骤很简单,不多说。

(b)在pom.xml文件添加依赖,如下:

"http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xsi:schemaLocation= "http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd" >

4.0.0

com.kfit

spring-boot-task2

0.0.1-SNAPSHOT

jar

spring-boot-task2

http://maven.apache.org

<project.build.sourceEncoding>UTF-8class="hljs-name"project.build.sourceEncoding>

 

1.8class="hljs-name"java.version>
<parent>

   <groupId>org.springframework.boot<span class="hljs-name"groupId>

   <artifactId>spring-boot-starter-parent<span class="hljs-name"artifactId>

   <version>1.4.1.RELEASE<span class="hljs-name"version>

<span class="hljs-name"parent>
<dependency>

  <groupId>junit<span class="hljs-name"groupId>

  <artifactId>junit<span class="hljs-name"artifactId>

  <scope>test<span class="hljs-name"scope>

<span class="hljs-name"dependency>



    

   <dependency>

       <groupId>org.springframework.boot<span class="hljs-name"groupId>

       <artifactId>spring-boot-starter-web<span class="hljs-name"artifactId>

   <span class="hljs-name"dependency>

(c)编写启动类,App.java:

package com.kfit;

import org.springframework.boot.SpringApplication;

**import **org.springframework.boot.autoconfigure.SpringBootApplication;

/**

  • @author Angel --守护天使
  • @version v.0.1
  • @date 2017年3月26日

*/

@SpringBootApplication

**public **class App {

**public ****static ****void** main(String[] args) {

   SpringApplication. *run* (App. **class** , args);

}

}

(c)编写定时任务调度类,MyTask.java:

package com.kfit.task;

import java.util.Date;

import org.springframework.context.annotation.Configuration;

import org.springframework.scheduling.annotation.EnableScheduling;

import org.springframework.scheduling.annotation.Scheduled;

/**

  • @author Angel --守护天使
  • @version v.0.1
  • @date 2017年3月26日

*/

@Configuration

@EnableScheduling

**public **class MyTask {

/**

 * 我们希望这个方法每10秒打印一次.

 * cron:定时任务表达式.

 *

 * 指定:秒,分钟,小时,日期,月份,星期,年(可选).

 * *:任意.

 *

 */

@Scheduled(cron="0/10 * ** * *")

//@Scheduled(cron="0/10* * * * ?")

**public ****void** tast1(){

   System. ***out*** .println("MyTask.tast1(),"+**new** Date());

}



/**

 * 我们希望这个方法每1分钟打印一次.

 */

@Scheduled(cron="0 0/1 * ** *")

**public ****void** tast2(){

   System. ***out*** .println("MyTask.tast2(),"+**new** Date());

}

}

在这里有有一个地方需要特别说明下:

MyTask.tast1()

MyTask.tast1()

MyTask.tast1()

MyTask.tast2()

MyTask.tast1()


tast1: 每10秒打印1次.

task2: 每1分钟打印1次.


1分钟是60秒 = 没打印6次task1之后才能够打印1次task2.


spring task 在计算时间的时候,是根据当前服务器的系统时间进行计算.

如果是每10秒执行一次的话,那么它是从系统时间的0,10,20秒进行计算的.

如果是每1分钟执行一次的话,那么它是从系统时间的1分钟,2分钟进行计算的。

如果是这样的话,那么我会碰到这样的情况:就是当我们刚刚启动程序的时候,我们的时间

刚好是9:39:55秒,那么就会出现5秒之后会执行1次task1和1次task2.

(d)启动运行程序进行测试:

这个大家运行完之后关注下控制台的打印信息

(3)cronExpression配置说明;

字段 允许值 允许的特殊字符
0-59 , - * /
0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / LWC
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / LC #
年(可选) 留空, 1970-2099 , - * /

特殊字符:

在Cron表达式的时间字段中,除允许设置数值外,还能你使用一些特殊的字符,提供列表、范围、通配符等功能

星号(*)

可用在所有字段下,表示对应时间域名的每一个时刻,如*用在分钟字段,表示“每分钟”。

问号(?)

只能用在日期和星期字段,代表无意义的值,比如使用L设定为当月的最后一天,则配置日期配置就没有意义了,可用?作占位符的作用。

减号(-)

表示一个范围,如在日期字段5-10,表示从五号到10号,相当于使用逗号的5,6,7,8,9,10

逗号(,)

表示一个并列有效值,比如在月份字段使用JAN,DEC表示1月和12月

斜杠(/)

x/y表示一个等步长序列,x为起始值,y为增量步长值,如在小时使用1/3相当于1,4,7,10当时用*/y时,相当于0/y

L

L(Last)只能在日期和星期字段使用,但意思不同。在日期字段,表示当月最后一天,在星期字段,表示星期六(如果按星期天为一星期的第一天的概念,星期六就是最后一天。如果L在星期字段,且前面有一个整数值X,表示“这个月的最后一个星期X”,比如3L表示某个月的最后一个星期二。

W

选择离给定日期最近的工作日(周一至周五)。例如你指定“15W”作为day of month字段的值,就意味着“每个月与15号最近的工作日”。所以,如果15号是周六,则触发器会在14号(周五)触发。如果15号是周日,则触发器会在16号(周一)触发。如果15号是周二,则触发器会在15号(周二)触发。但是,如果你指定“1W”作为day of month字段的值,且1号是周六,则触发器会在3号(周一)触发。quartz不会“跳出”月份的界限。

LW****组合

在日期字段可以组合使用LW,表示当月最后一个工作日(周一至周五)

井号(#)

只能在星期字段中使用指定每月第几个星期X。例如day of week字段的“6#3”,就意味着“每月第3个星期五”(day3=星期五,#3=第三个);“2#1”就意味着“每月第1个星期一”;“4#5”就意味着“每月第5个星期3。需要注意的是“#5”,如果在当月没有第5个星期三,则触发器不会触发。

C

只能在日期和星期字段中使用,表示计划所关联的诶其,如果日期没有被关联,相当于日历中的所有日期,如5C在日期字段相当于5号之后的第一天,1C在日期字段使用相当于星期填后的第一天

(4)cronExpression实例;

CRON表达式 含义

"0 0 12 * * ?" 每天中午十二点触发

"0 15 10 ? * *" 每天早上10:15触发

"0 15 10 * * ?" 每天早上10:15触发

"0 15 10 * * ? *" 每天早上10:15触发

"0 15 10 * * ?2005" 2005年的每天早上10:15触发

“0 * 14 * * ?" 每天从下午2点开始到2点59分每分钟一次触发

"0 0/5 14 * * ?" 每天从下午2点开始到2:55分结束每5分钟一次触发

"0 0/5 14,18 * *?" 每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发

"0 0-5 14 * * ?" 每天14:00至14:05每分钟一次触发

"0 10,44 14 ? 3WED" 三月的每周三的14:10和14:44触发

"0 15 10 ? *MON-FRI" 每个周一、周二、周三、周四、周五的10:15触发

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • JAVA
    +关注

    关注

    19

    文章

    2970

    浏览量

    104820
  • XML
    XML
    +关注

    关注

    0

    文章

    188

    浏览量

    33102
  • spring
    +关注

    关注

    0

    文章

    340

    浏览量

    14353
收藏 人收藏

    评论

    相关推荐

    Spring Boot如何实现异步任务

    Spring Boot 提供了多种方式来实现异步任务,这里介绍三种主要实现方式。 1、基于注解 @Async @Async 注解是 Spring
    的头像 发表于 09-30 10:32 1444次阅读

    Linux系统定时任务Crond

    会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作,这个crond定时任务服务就相当于我们平时早起使用的闹钟一
    发表于 07-05 06:22

    定时任务的发展史是怎么样的

    定时任务是互联网行业里最常用的服务之一,本文给大家介绍定时任务在我司的发展历程。 linux系统中一般使用crontab命令来实现,在Java世界里,使用最广泛的就是quartz了。我司
    发表于 07-18 17:38 0次下载
    <b class='flag-5'>定时任务</b>的发展史是怎么样的

    Spring Boot定时任务的重写方法

    Spring Boot应该是目前最火的java开源框架了,它简化了我们创建一个web服务的过程,让我们可以在很短时间、基本零配置就可以启动一个web服务。
    的头像 发表于 01-20 17:38 2456次阅读

    SpringBoot如何实现动态增删启停定时任务

    spring boot项目中,可以通过 @EnableScheduling 注解和@Scheduled注解实现定时任务,也可以通过SchedulingConfigurer接口来实现定时任务
    的头像 发表于 09-24 09:49 2955次阅读
    SpringBoot如何实现动态增删启停<b class='flag-5'>定时任务</b>

    Python定时任务的实现方式

    调度模块schedule实现定时任务 利用任务框架APScheduler实现定时任务 Job 作业 Trigger 触发器 Executor 执行器 Jobstore 作业存储 Eve
    的头像 发表于 10-08 15:20 5743次阅读

    说说Spring定时任务如何大规模企业级运用

    定时任务是业务应用开发中非常普遍存在的场景(如:每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表等等),解决方案很多,Spring 框架提供了一种通过注解来配置定时任务的解决方案,接入非常的
    的头像 发表于 11-04 09:36 704次阅读

    解析Golang定时任务库gron设计和原理

    正巧,最近看到了 gron 这个开源项目,它是用 Golang 实现一个并发安全的定时任务库。实现非常简单精巧,代码量也不多。今天我们就来一起结合源码看一下,怎样基于 Golang 的能力做出来一个【定时任务库】。
    的头像 发表于 12-15 13:57 1344次阅读

    xxl-job任务调度中间件解决定时任务调度问题

    xxl-job是一款非常优秀的任务调度中间件,轻量级、使用简单、支持分布式等优点,让它广泛应用在我们的项目中,解决了不少定时任务调度问题。
    的头像 发表于 01-31 09:53 1979次阅读

    求一种SpringBoot定时任务动态管理通用解决方案

    SpringBoot的定时任务的加强工具,实现对SpringBoot原生的定时任务进行动态管理,完全兼容原生@Scheduled注解,无需对原本的定时任务进行修改
    的头像 发表于 02-03 09:49 790次阅读

    Spring Boot中整合两种定时任务的方法

    框架 Quartz ,Spring Boot 源自 Spring+SpringMVC ,因此天然具备这两个 Spring 中的定时任务实现策
    的头像 发表于 04-07 14:55 1567次阅读
    <b class='flag-5'>Spring</b> <b class='flag-5'>Boot</b>中整合两种<b class='flag-5'>定时任务</b>的方法

    Spring Boot中如何使用定时任务

    本文介绍Spring Boot 中如何使用定时任务,使用非常简单,就不做过多说明了。
    的头像 发表于 04-12 10:56 984次阅读

    python定时任务实践

    由于程序需求,监测配置变化需要设置定时任务,每分钟执行一次,对任务持久化要求不高,不需要时可以关闭定时任务
    的头像 发表于 05-20 17:53 982次阅读
    python<b class='flag-5'>定时任务</b>实践

    Spring Boot Actuator快速入门

    不知道大家在写 Spring Boot 项目的过程中,使用过 Spring Boot Actuator 吗?知道 Spring
    的头像 发表于 10-09 17:11 651次阅读

    linux定时任务的用法总结

    习惯了使用 windows 的计划任务,使用 linux 中的 crontab 管理定时任务时很不适应。
    的头像 发表于 08-14 18:16 860次阅读
    linux<b class='flag-5'>定时任务</b>的用法总结