首页 > 其他分享 >Spring Boot 2.x基础教程:使用@Scheduled实现定时任务

Spring Boot 2.x基础教程:使用@Scheduled实现定时任务

时间:2022-10-06 15:55:45浏览次数:51  
标签:Scheduled 14 default Spring 57 Boot 任务 定时 执行

我们在编写Spring Boot应用中经常会遇到这样的场景,比如:我需要定时地发送一些短信、邮件之类的操作,也可能会定时地检查和监控一些标志、参数等。

创建定时任务

在Spring Boot中编写定时任务是非常简单的事,下面通过实例介绍如何在Spring Boot中创建定时任务,实现每过5秒输出一下当前时间。

  • 在Spring Boot的主类中加入@EnableScheduling注解,启用定时任务的配置
@SpringBootApplication
@EnableScheduling
public class Application {

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

}
  • 创建定时任务实现类
@Component
public class ScheduledTasks {

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

@Scheduled(fixedRate = 5000)
public void reportCurrentTime() {
log.info("现在时间:" + dateFormat.format(new Date()));
}

}
  • 运行程序,控制台中可以看到类似如下输出,定时任务开始正常运作了。
2021-07-13 14:56:56.413  INFO 34836 --- [           main] c.d.chapter71.Chapter71Application       : Started Chapter71Application in 1.457 seconds (JVM running for 1.835)
2021-07-13 14:57:01.411 INFO 34836 --- [ scheduling-1] com.didispace.chapter71.ScheduledTasks : 现在时间:14:57:01
2021-07-13 14:57:06.412 INFO 34836 --- [ scheduling-1] com.didispace.chapter71.ScheduledTasks : 现在时间:14:57:06
2021-07-13 14:57:11.413 INFO 34836 --- [ scheduling-1] com.didispace.chapter71.ScheduledTasks : 现在时间:14:57:11
2021-07-13 14:57:16.413 INFO 34836 --- [ scheduling-1] com.didispace.chapter71.ScheduledTasks : 现在时间:14:57:16

@Scheduled详解

在上面的入门例子中,使用了@Scheduled(fixedRate = 5000) 注解来定义每过5秒执行的任务。对于@Scheduled的使用,我们从源码里看看有哪些配置:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {

String CRON_DISABLED = ScheduledTaskRegistrar.CRON_DISABLED;

String cron() default "";

String zone() default "";

long fixedDelay() default -1;

String fixedDelayString() default "";

long fixedRate() default -1;

String fixedRateString() default "";

long initialDelay() default -1;

String initialDelayString() default "";

}

这些具体配置信息的含义如下:

  • cron:通过cron表达式来配置执行规则
  • zone:cron表达式解析时使用的时区
  • fixedDelay:上一次执行结束到下一次执行开始的间隔时间(单位:ms)
  • fixedDelayString:上一次任务执行结束到下一次执行开始的间隔时间,使用java.time.Duration#parse解析
  • fixedRate:以固定间隔执行任务,即上一次任务执行开始到下一次执行开始的间隔时间(单位:ms),若在调度任务执行时,上一次任务还未执行完毕,会加入worker队列,等待上一次执行完成后立即执行下一次任务
  • fixedRateString:与fixedRate逻辑一致,只是使用java.time.Duration#parse解析
  • initialDelay:首次任务执行的延迟时间
  • initialDelayString:首次任务执行的延迟时间,使用java.time.Duration#parse解析

思考与进阶

是不是这样实现定时任务很简单呢?那么继续思考一下这种实现方式是否存在什么弊端呢?

可能初学者不太容易发现问题,但如果你已经有一定的线上项目经验的话,问题也是显而易见的:这种模式实现的定时任务缺少在集群环境下的协调机制。

什么意思呢?假设,我们要实现一个定时任务,用来每天网上统计某个数据然后累加到原始数据上。我们开发测试的时候不会有问题,因为都是单进程在运行的。但是,当我们把这样的定时任务部署到生产环境时,为了更高的可用性,启动多个实例是必须的。此时,时间一到,所有启动的实例就会同时开始执行这个任务。那么问题也就出现了,因为有累加操作,最终我们的结果就会出现问题。

解决这样问题的方式很多种,比较通用的就是采用分布式锁的方式,让同类任务之前的时候以分布式锁的方式来控制执行顺序,比如:使用Redis、Zookeeper等具备分布式锁功能的中间件配合就能很好的帮助我们来协调这类任务在集群模式下的执行规则。

标签:Scheduled,14,default,Spring,57,Boot,任务,定时,执行
From: https://www.cnblogs.com/jieran/p/16757766.html

相关文章

  • SpringMVC之内容协商策略
    内容协商原理目录内容协商原理一、引言二、正常请求请求数据格式确定和返回值数据格式确定三、内容协商确定客户端接收数据格式默认基于请求头确定请求数据格式确定服务端......
  • Spring中最常用的11个扩展点
    转载自:微信公众号[Java后端技术]前言我们一说到spring,可能第一个想到的是IOC(控制反转)和AOP(面向切面编程)。没错,它们是spring的基石,得益于它们的优秀设计,使得sprin......
  • SpringAOP之通过注解方式实现
    通过注解的方式1)导入jar包<!--Spring--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>4.1.3.Release</ve......
  • springboot 项目启动后访问不论什么请求的是spring的注册页面Please sign in Username
    解决方法:1.在启动类上添加注解@EnableAutoConfiguration(exclude={SecurityAutoConfiguration.class})2.或者:@SpringBootApplication(exclude={SecurityAutoConfigu......
  • SpringBoot整合Websocket
    1.什么是WebSocket1.HTTP协议是一种无状态的、无连接的、单向的应用层协议。它采用了请求/响应模型。通信请求只能由客户端发起,服务端对请求做出应答处理,HTTP协议无法......
  • Spring Boot 自动装配原理初解
    原理初探pom.xmlspring-boot-dependencies:核心以来在父工程中!我们在写或者引入一些Springboot依赖的时候,不需要指定版本,就因为有这些版本仓库启动器-<depende......
  • Spring----初识
    《在了解Spring前的一些知识》  《Spring的基本框架SpringFramework的了解》    IOC:说简单一点就是我们本来一切对象都是通过new出来的,现在变成了由程序......
  • Bootstrap
    两种方法引用Bootstrap一种是把下载的bootstrap-3.3.7-dist文件夹放入所要用到Bootstrap框架的项目的文件夹:官网下载地址:http://getbootstrap.com/中文网下载地址:http://w......
  • openfeign出现错误No Feign Client for loadBalancing defined. Did you forget to in
    SpringCloudOpenFeign报错NoFeignClientforloadBalancingdefined.Didyouforgettoincludespring-cloud-starter-loadbalancer?问题原因使用SpringInitializ......
  • 面试突击86:SpringBoot 事务不回滚?怎么解决?
    我报名参加金石计划1期挑战——瓜分10万奖池,这是我的第7篇文章,点击查看活动详情在SpringBoot中,造成事务不自动回滚的场景有很多,比如以下这些:非public修饰的方法中......