温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

SpringBoot如何创建定时任务

发布时间:2021-07-08 10:37:38 来源:亿速云 阅读:166 作者:小新 栏目:编程语言

这篇文章主要介绍SpringBoot如何创建定时任务,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一、静态定时任务(基于注解)

基于注解来创建定时任务非常简单,只需几行代码便可完成。

@Scheduled 除了支持灵活的参数表达式cron之外,还支持简单的延时操作,例如 fixedDelay ,fixedRate 填写相应的毫秒数即可。

@Configuration //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling // 2.开启定时任务
public class SimpleScheduleConfig {
  //3.添加定时任务
  @Scheduled(cron = "0/5 * * * * ?")
  private void configureTasks() {
    System.err.println("执行定时任务1: " + LocalDateTime.now());
  }
}

Cron表达式参数分别表示:

秒(0~59) 例如0/5表示每5秒
分(0~59)
时(0~23)
月的某天(0~31) 需计算
月(0~11)
周几( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)

启动应用,可以看到控制台的信息如下:

SpringBoot如何创建定时任务

诚然,使用Scheduled 确实很方便,但缺点是当我们调整了执行周期的时候,需要重启应用才能生效,这多少有些不方便。为了达到实时生效的效果,可以使用接口来完成定时任务。

二、动态定时任务(基于接口)

为了演示效果,这里选用 Mysql数据库 和 Mybatis 来查询和调整定时任务的执行周期,然后观察定时任务的执行情况。

1.引入依赖

  <!--依赖管理 -->
  <dependencies>
    <dependency><!--添加Web依赖 -->
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency><!--添加Mybatis依赖 -->
      <groupId>org.mybatis.spring.boot</groupId>
      <artifactId>mybatis-spring-boot-starter</artifactId>
      <version>1.3.1</version>
    </dependency>
    <dependency><!--添加MySql依赖 -->
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>
    <dependency><!--添加Test依赖 -->
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-test</artifactId>
      <scope>test</scope>
    </dependency>
  </dependencies>

2.添加数据库记录

在Navicat 连接本地数据库,随便打开查询窗口,然后执行脚本内容,如下:

DROP DATABASE IF EXISTS `socks`;
CREATE DATABASE `socks`;
USE `SOCKS`;
DROP TABLE IF EXISTS `cron`;
CREATE TABLE `cron` (
 `cron_id` varchar(30),
 `cron` varchar(30) 
);
INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');

SpringBoot如何创建定时任务

然后在项目中的application.yml 添加数据源:

#application.yml 配置如下:

spring:
 datasource:
  url: jdbc:mysql://localhost:3306/socks?useSSL=false
  username: root
  password: root

3.创建定时器

数据库准备好数据之后,我们编写定时任务,注意这里添加的是TriggerTask,目的是循环读取我们在数据库设置好的执行周期,以及执行相关定时任务的内容。具体代码如下:

@Configuration
@EnableScheduling
public class CompleteScheduleConfig implements SchedulingConfigurer {

  @Mapper
  public interface CronMapper {
    @Select("select cron from cron limit 1")
    String getCron();
  }

  @Autowired
  @SuppressWarnings("all")
  CronMapper cronMapper;

  /**
   * 执行定时任务.
   */
  @Override
  public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
    taskRegistrar.addTriggerTask(
        //1.添加任务内容(Runnable)
        () -> System.out.println("执行定时任务2: " + LocalDateTime.now().toLocalTime()),
        //2.设置执行周期(Trigger)
        triggerContext -> {
          //2.1 从数据库获取执行周期
          String cron = cronMapper.getCron();
          //2.2 合法性校验.
          if (StringUtils.isEmpty(cron)) {
            // Omitted Code ..
          }
          //2.3 返回执行周期(Date)
          return new CronTrigger(cron).nextExecutionTime(triggerContext);
        }
    );
  }

}

4. 动态修改执行周期

启动应用后,查看控制台,打印时间是我们预期的每5秒一次:

SpringBoot如何创建定时任务

这时候打开Navicat ,将执行周期修改为每1秒执行一次,然后观察控制台打印效果:

SpringBoot如何创建定时任务

可以清楚看到执行周期已经改变,并且不需要我们重启应用,十分方便。

以上是“SpringBoot如何创建定时任务”这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注亿速云行业资讯频道!

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI