`

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

阅读更多

 

【视频&交流平台】

à SpringBoot视频

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à SpringCloud视频

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

【原创文章,转载请注明出处】

【本篇博客,有配套视频,视频地址:《Spring Boot定时任务,公众号中点击下面的阅读原文,视频中讲解的更详细】

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

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

 

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

 

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

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

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

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

 

2Spring Task入门;

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

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

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

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

<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.kfit</groupId>

  <artifactId>spring-boot-task2</artifactId>

  <version>0.0.1-SNAPSHOT</version>

  <packaging>jar</packaging>

 

  <name>spring-boot-task2</name>

  <url>http://maven.apache.org</url>

 

  <properties>

    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

     <!-- 指定一下jdk的版本,这里我们使用jdk 1.8 ,默认是1.6 -->

    <java.version>1.8</java.version>

  </properties>

 

 

    <!-- spring boot parent节点,引入这个之后,在下面和spring boot相关的就不需要引入版本了; -->

    <parent>

       <groupId>org.springframework.boot</groupId>

       <artifactId>spring-boot-starter-parent</artifactId>

       <version>1.4.1.RELEASE</version>

    </parent>

 

  <dependencies>

    <dependency>

      <groupId>junit</groupId>

      <artifactId>junit</artifactId>

      <scope>test</scope>

    </dependency>

   

       <!-- web支持: 1web mvc; 2restful; 3jackjson支持; 4aop ........ -->

       <dependency>

           <groupId>org.springframework.boot</groupId>

           <artifactId>spring-boot-starter-web</artifactId>

       </dependency>

   

  </dependencies>

</project>

 

c)编写启动类,App.java

package com.kfit;

 

import org.springframework.boot.SpringApplication;

import org.springframework.boot.autoconfigure.SpringBootApplication;

 

/**

 *

 * @author Angel --守护天使

 * @version v.0.1

 * @date 2017326

 */

@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 2017326

 */

@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)启动运行程序进行测试:

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

 

 

3cronExpression配置说明;

字段

允许值

允许的特殊字符

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字段的“63”,就意味着“每月第3个星期五”(day3=星期五,#3=第三个);“21”就意味着“每月第1个星期一”;“45”就意味着“每月第5个星期3。需要注意的是“#5”,如果在当月没有第5个星期三,则触发器不会触发。

C

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

 

4cronExpression实例;

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触发

 

视频&交流平台

à SpringBoot网易云课堂视频

http://study.163.com/course/introduction.htm?courseId=1004329008

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

 

分享到:
评论

相关推荐

    从零开始学Spring Boot.pdf

    从零开始学Spring Boot.pdf从零开始学Spring Boot.pdf从零开始学Spring Boot.pdf从零开始学Spring Boot.pdf从零开始学Spring Boot.pdf从零开始学Spring Boot.pdf从零开始学Spring Boot.pdf从零开始学Spring Boot.pdf...

    27. Spring Boot Junit单元测试【从零开始学Spring Boot】

    Spring Boot Junit单元测试【从零开始学Spring Boot】"的主题,深入探讨Spring Boot中Junit单元测试的使用方法和最佳实践。 首先,我们要了解什么是单元测试。单元测试是一种针对软件中的最小可测试单元(如方法)...

    31. Spring Boot导入XML配置【从零开始学Spring Boot】

    在本篇【从零开始学Spring Boot】系列教程中,我们将深入探讨如何在Spring Boot项目中导入并使用XML配置。Spring Boot以其简化Spring应用的初始搭建以及开发过程而闻名,通常推崇的是Java配置而非XML配置。然而,在...

    82. Spring Boot – 启动彩蛋【从零开始学Spring Boot】

    另外,开发者可以创建一个自定义的`Banner`类,扩展`org.springframework.boot.Banner`接口并实现`printBanner()`方法。这个方法允许你在启动时打印任何你想展示的内容,包括ASCII艺术或其他复杂格式。例如: ```...

    22. Spring Boot 拦截器HandlerInterceptor【从零开始学Spring Boot】

    在Spring Boot框架中,拦截器(HandlerInterceptor)是一种强大的机制,用于在请求处理前后执行自定义逻辑。在本文中,我们将深入探讨Spring Boot中的拦截器,了解其工作原理、如何实现以及实际应用。 首先,Spring...

    92.Spring Boot使用模板velocity【从零开始学Spring Boot】

    《Spring Boot整合Velocity模板引擎详解》 在现代Java Web开发中,Spring Boot以其简洁的配置、强大的功能和高效的开发效率,成为了许多开发者的首选框架。而Velocity作为一款轻量级的模板引擎,能够帮助我们快速...

    17. Spring Boot普通类调用bean【从零开始学Spring Boot】

    Spring Boot普通类调用bean【从零开始学Spring Boot】”旨在指导初学者如何在非Spring管理的类中访问和使用Spring容器中的bean。下面将详细讲解这个主题。 首先,了解Spring Boot的基础概念是必要的。Spring Boot...

    47. Spring Boot发送邮件【从零开始学Spring Boot】

    在本篇博文中,我们将深入探讨如何使用Spring Boot发送电子邮件,这是Spring Boot框架的一个非常实用的功能,可以帮助开发者轻松实现企业级应用中的邮件服务。通过学习本文,你可以掌握Spring Boot集成...

    从零开始学Spring Boot

    1.17 Spring Boot定时任务的使用 1.18 Spring Boot使用Druid和监控配置 1.19 Spring Boot使用Druid(编程注入) 1.20 Spring Boot普通类调用bean 1.21 使用模板(thymeleaf-freemarker) 1.22 Spring Boot 添加JSP...

    39.1 Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot与Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发而闻名,而Shiro则是一个轻量级的安全框架,适用于身份验证、授权、会话管理和安全性相关的...

    38. Spring Boot分布式Session状态保存Redis【从零开始学Spring Boot】

    在Spring Boot应用中,随着系统复杂度的增加,单一服务器往往无法满足高并发、高可用的需求,因此我们会采用分布式架构。然而,在分布式环境下,传统的基于HTTP Session的状态管理方式会遇到问题,因为每个服务器都...

    39.2. Spring Boot Shiro权限管理【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot和Apache Shiro进行权限管理。Spring Boot以其简洁的配置和快速的应用开发能力而闻名,而Shiro则是一个强大的安全管理框架,提供了认证、授权、会话管理和安全加密等...

    1. [视频]spring boot起步之Hello World【从零开始学Spring Boot】

    在本节中,我们将深入探讨"Spring Boot起步之Hello World"这一主题,这是学习Spring Boot框架的典型入门教程。Spring Boot是由Pivotal团队开发的一个框架,它旨在简化Spring应用程序的初始搭建以及开发过程,通过...

    29. Spring boot 文件上传(多文件上传)【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot实现文件上传功能,特别是多文件上传。Spring Boot简化了在Java应用程序中处理文件上传的过程,使得开发者能够更专注于业务逻辑,而不是底层的HTTP操作。以下是对该...

    15. Spring Boot使用Druid和监控配置【从零开始学Spring Boot】

    在本篇【从零开始学Spring Boot】系列中,我们将探讨如何在Spring Boot项目中集成并配置Druid数据源以及其监控功能。Druid是一个强大的数据库连接池,它提供了丰富的监控、扩展性以及性能优化特性。Spring Boot简化...

    16. Spring Boot使用Druid(编程注入)【从零开始学Spring Boot】

    在本篇【从零开始学Spring Boot】系列中,我们将探讨如何在Spring Boot项目中使用Druid数据源进行编程注入。Druid是一个优秀的数据库连接池,它提供了强大的监控和扩展功能,是许多企业级应用首选的数据源解决方案。...

    41. Spring Boot 使用Java代码创建Bean并注册到Spring中【从零开始学Spring Boot】

    这是Spring Boot的核心特性之一,它使得我们能够以编程方式管理对象,而无需XML配置。让我们逐步解析这个过程。 首先,了解Spring Boot的基础。Spring Boot旨在简化Spring应用程序的初始设置和配置,通过“约定优于...

Global site tag (gtag.js) - Google Analytics