文章目录

  • 前言
  • 一、常用的基于注解(@Component和@Scheduled)
  • 注解@Schedule参数含义
  • 基于注解的具体实现
  • 开始定时任务
  • 测试
  • 总结



前言

一些电商项目涉及到订单商品的,难免要使用定时任务同步会修改一些数据。在SpringBoot中一般有三种方式创建定时任务,基于注解(@Scheduled),基于接口(SchedulingConfigurer),基于注解设定多线程定时任务。

一、常用的基于注解(@Component和@Scheduled)

俩个注解愿文档的意思是

public interface Component
extends annotation.Annotation
指示带注释的类是“组件”。 当使用基于注释的配置和类路径扫描时,此类将被视为自动检测的候选。
其他类级别的注释也可以被视为标识组件,通常是一种特殊的组件:例如@Repository注释或AspectJ的@Aspect注释。

public interface Scheduled extends annotation.Annotation
注释,用于标记要调度的方法。 必须指定cron() , fixedDelay()或fixedRate()属性之一。
带注释的方法必须不包含任何参数。 它通常具有void返回类型; 如果不是,则通过调度程序调用时,返回值将被忽略。
@Scheduled批注的处理是通过注册ScheduledAnnotationBeanPostProcessor来执行的。 这可以手动完成,也可以通过<task:annotation-driven/>元素或@ EnableScheduling批注更方便地完成。
此批注可以用作元批注,以创建具有属性覆盖的自定义组成的批注。

注解@Schedule参数含义

序号

说明

必选

允许填写的值

允许的通配符

1


false

0-59

,-*/

2


false

0-59

,-*/

3


false

0-23

,-*/

4


false

1-31

,-*/

5


false

1-12 / JAN-DEC

,-*?/ L W

6


false

1-7 or SUN-SAT

,-*?/ L #

7


false

1970-2099

,-*/

1、*号表示所有值。 eg:加在天上面,每天都会执行,0 0 0 * * ?。
2、?表示不缺定值,当前这个值不用理会,eg每月10号执行,0 0 0 10 * ?。
3、-表示区间,eg;1-3表示1,2,3都会执行。
4、/表示递增,eg:5/10表示5,15,25,从5开始每累计10秒执行。
5、,表示多个值,eg:MON,WED,FRI,表示周一,周三,周五都会执行。
6、L表示最后的意思。如果在L前面加上数字,表示该数据的最后一个值,在日字段设置上,表示当月的最后一天(依据当前月份,如果是二月还会自动判断是否是润年)。
7、W表示离指定日期最近的工作日(周一到周五),eg:15W表示离每月15号最近的那个工作日触发,如果15号是周六,则在14号触发,如果15号入周日,则在16号触发,如果15号在周内,在当天触发,如果为1W,表示每月1号之后的工作日触发,如果1号为周六,则在3号触发,时间不往前调,(ps:W前只能设置数字,不能设置区间-)
8、#表示每月的第几个周几。eg:6#3表示每月的第三个周六。
9、L和W可以组合使用,如果在日字段上写上LW表示本月的最后一个工作日。(发工资?一般不都月中发?)

基于注解的具体实现

pom.xml中引入依赖

<properties>
        <java.version>1.8</java.version>
        <shiro-spring.version>1.4.1</shiro-spring.version>
        <mysql-connector-java.version>5.1.48</mysql-connector-java.version>
        <druid-spring-boot-starter.version>1.1.18</druid-spring-boot-starter.version>
        <fastjson.version>1.2.50</fastjson.version>
        <mybatis-spring-boot-starter.version>2.1.0</mybatis-spring-boot-starter.version>
        <lombok.version>1.18.10</lombok.version>
        <java-jwt.version>3.2.0</java-jwt.version>
        <commons-lang3.version>3.8.1</commons-lang3.version>
        <guava.version>27.1-jre</guava.version>
        <junit.version>4.12</junit.version>
        <pagehelper.version>1.2.5</pagehelper.version>
        <jaxb-impl.version>2.1.12</jaxb-impl.version>
    </properties>

<dependencies>
        <!--SpringBoot依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <!--mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql-connector-java.version}</version>
        </dependency>
        <!--mybatis社区整合SpringBoot-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>${mybatis-spring-boot-starter.version}</version>
        </dependency>
        <!--lombok依赖-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>${lombok.version}</version>
        </dependency>
</dependencies>
package com.wangyanfei.buildshiroframework.job;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.time.StopWatch;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * @author:wangyanfei
 * @date:2021/4/12 6:14 下午
 */
@Slf4j
@Component
public class TaskTemplate {

    /**
     * 可以使用@Autoward注入一些业务类
     */

    /**
     * 每天一点半触发
     */
    @Scheduled(cron = " 0 30 1 * * ?")
    public void taskHandler(){
        // 加个秒表看下执行时间 秒表已启动的秒表
        StopWatch stopWatch = StopWatch.createStarted();
        log.info("TaskTemplate.taskHandler() is start ");
        System.out.println("love you...");
        log.info("How long does it take {} ms", stopWatch.getTime());
    }

}

开始定时任务

在Spring启动累上配置@EnableScheduling开启定时任务。

package com.wangyanfei.buildshiroframework;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.transaction.annotation.EnableTransactionManagement;

/**
 * @author wangyanfei
 */
@SpringBootApplication
@EnableTransactionManagement
@EnableScheduling
@MapperScan("com.wangyanfei.buildshiroframework.dao")
public class BuildShiroFrameworkApplication {

    public static void main(String[] args) {
        SpringApplication.run(BuildShiroFrameworkApplication.class, args);
    }

}

测试

spring mvc 注解定时任务 spring定时任务的注解_spring

总结

用起来比较简单易于实现。把核心是cron参数。
其他俩种方式持续下次更新。