Spring Boot 定时任务篇

29人阅读 评论(0) 收藏 举报
分类:

需求缘起:在之前的一篇文章中就介绍过《Spring Boot定时任务》,在录制这节视频的时候,发现太简单了,对于初学者来说的话,还是有点困难。本节博客从各个维度再次介绍下定时任务调度。我们先看下本节的大纲:

(1)定时任务的几种实现方式;
(2)Spring Task入门;
(3)cronExpression配置说明;
(4)cronExpression实例;

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

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

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

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

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

(2)Spring Task入门;

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

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

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

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

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>

   <groupId>com.gtja</groupId>
   <artifactId>springboot-quartz</artifactId>
   <version>0.0.1-SNAPSHOT</version>
   <packaging>jar</packaging>

   <name>springboot-quartz</name>
   <description>Demo project for Spring Boot</description>

   <parent>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-parent</artifactId>
      <version>2.0.1.RELEASE</version>
      <relativePath/> <!-- lookup parent from repository -->
   </parent>

   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
      <java.version>1.8</java.version>
   </properties>

   <dependencies>
      <!-- 定时器任务 quartz需要导入的坐标 -->
      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-quartz</artifactId>
      </dependency>

      <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-test</artifactId>
         <scope>test</scope>
      </dependency>
   </dependencies>

   <build>
      <plugins>
         <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
         </plugin>
      </plugins>
   </build>


</project>

 注意:Springboot版本1.5X有的不支持整合quartz的需要手动的添加(具体的可以自己尝试版本!!)

quartz

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

package com.kfit;

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

 


@SpringBootApplication

public class App {

    public static void main(String[] args) {

       SpringApplication.run(App.classargs);

    }

}

 

(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;

 


@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 = 没打印6task1之后才能够打印1task2.

--------------------------

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

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

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

 

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

 

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

(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 ? 3 WED"    三月的每周三的14:10和14:44触发
"0 15 10 ? * MON-FRI"   每个周一、周二、周三、周四、周五的10:15触发
查看评论

112. Spring Boot 定时任务升级篇【从零开始学Spring Boot】

【原创文章,转载请注明出处】 【本篇博客,有配套视频,视频地址:《Spring Boot定时任务》,公众号中点击下面的阅读原文,视频中讲解的更详细】 需求缘起:在之前的一篇文章中就介绍过《Spring...
  • zmken497300
  • zmken497300
  • 2017-03-28 16:13:54
  • 753

3.spring Boot 定时任务升级篇(动态添加修改删除定时任务)

【本篇博客,有配套视频,视频地址:《http://www.youku.com/index/y404》,公众号中点击下面的阅读原文,视频中讲解的更详细】     需求缘起:在发布了《Spring ...
  • fujiawei3710
  • fujiawei3710
  • 2017-12-26 18:52:26
  • 442

Spring Boot 菜鸟教程 14 动态修改定时任务cron参数

动态修改定时任务cron参数 不需要重启应用就可以动态的改变Cron表达式的值 不能使用@Scheduled(cron = "${jobs.cron}")实现...
  • JE_GE
  • JE_GE
  • 2016-12-03 21:17:35
  • 10585

Spring Boot配置定时任务(实例)

SpringBoot的定时任务可以直接使用自带的Scheduled,它相当于一个轻量级的Quartz,它可以让我们直接使用注解来完成定时任务的配置。详情如下@Configuration @Enable...
  • m0_37885618
  • m0_37885618
  • 2017-08-15 16:35:13
  • 5601

Spring Boot (教程十三:定时任务)

GitHub 地址:https://github.com/asd821300801/Spring-Boot.git Spring Boot (教程十三:定时任务)...
  • gfd54gd5f46
  • gfd54gd5f46
  • 2017-08-18 16:02:38
  • 1035

Spring Boot 菜鸟教程 13 注解定时任务

注解 @Scheduled(cron = “0/5 * * * * ?”) 相当于原来的xml版本的如下配置 task:scheduled ref="scheduledTask" method=...
  • JE_GE
  • JE_GE
  • 2016-12-02 17:46:46
  • 4266

maven工程-基于springboot定时任务

  • 2016年07月21日 18:18
  • 9.41MB
  • 下载

spring boot中定时任务的使用

主要用到两个注解: @Scheduled(fixedDelay = 5000) @EnableScheduling 其中@Scheduled有参数fixedDelay和fixedRate 前者是以...
  • amanicspater
  • amanicspater
  • 2017-05-31 10:17:57
  • 776

6、spring-boot 定时任务和异步实现

使用@Scheduled创建定时任务使用@Async实现异步调用
  • wanbf123
  • wanbf123
  • 2017-06-01 13:54:44
  • 1248

spring boot实现定时任务

1. 定时任务实现方式 定时任务实现方式:     Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程...
  • zhang_oracle
  • zhang_oracle
  • 2017-08-15 10:57:41
  • 333
    个人资料
    等级:
    访问量: 234
    积分: 137
    排名: 116万+
    文章存档