SpringBoot项目定时任务。


前言

一些电商项目涉及到订单商品的,难免要使用定时任务同步会修改一些数据。在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参数含义

序号说明必选允许填写的值允许的通配符
1false0-59,-*/
2false0-59,-*/
3false0-23,-*/
4false1-31,-*/
5false1-12 / JAN-DEC,-*?/ L W
6false1-7 or SUN-SAT,-*?/ L #
7false1970-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);
    }

}

测试

在这里插入图片描述

总结

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wangyanfei2021

请小王喝杯咖啡。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值