前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spirng中定时任务@Scheduled的使用

Spirng中定时任务@Scheduled的使用

原创
作者头像
半月无霜
修改2024-07-23 23:04:35
1610
修改2024-07-23 23:04:35
举报
文章被收录于专栏:半月无霜

Spirng中定时任务@Scheduled的使用

一、介绍

在目前的SpringBoot项目中想要使用定时任务十分简单,只需要在方法上添加@Scheduled注解即可

如下进行使用,首先要在启动类上加上@EnableScheduling注解

代码语言:java
复制
package com.banmoon;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@EnableScheduling
@SpringBootApplication
public class WebBaseMain {

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

}

再其次,就等在bean的方法上加上@Scheduled注解,填上cron表达式或者其他属性,即刻完成

代码语言:java
复制
package com.banmoon.task;

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import java.util.concurrent.TimeUnit;

/**
 * @author banmoon
 * @date 2024/07/23 20:06:05
 */
@Slf4j
@Component
public class SpringScheduledTask {
    
    @Scheduled(cron = "0/5 * * * * ?")
    public void simpleTask() throws InterruptedException {
        log.info("测试");
        TimeUnit.SECONDS.sleep(2);
    }

}

启动项目,查看控制台

image-20240723214348877
image-20240723214348877

二、注解中的属性

讲讲@Scheduled表达式的属性

  • cron:cron表达式,这个很熟悉,如果还有不会的,请参考下面的在线生成网站
  • zone:将为其解析cron表达式的时区。默认情况下,此属性为空字符串(即将使用服务器的本地时区)
  • fixedDelay:指定两次任务之间的固定时间
  • fixedDelayString:指定两次任务之间的固定时间
    • 和上面就是类型不同,一个是long,一个是String
    • 默认单位是毫秒,可以通过timeUnit修改单位
  • fixedRate:以固定的时间间隔执行方法
  • fixedRateString:以固定的时间间隔执行方法
    • 同上,类型不同
    • 同上,默认单位是毫秒,可以通过timeUnit修改单位
  • initialDelay:延迟时间,指定了服务启动后的多久才执行第一次任务
  • initialDelayString:延迟时间,指定了服务启动后的多久才执行第一次任务
    • 同上,类型不同
    • 同上,默认单位是毫秒,可以通过timeUnit修改单位
  • timeUnit:默认毫秒,通过枚举类java.util.concurrent.TimeUnit来修改

fixedDelayfixedRate有什么不同 fixedDelay:代表了上一个任务结束,与下一个任务开始的时间间隔 fixedRate:代表了上一个任务开始,与下一个任务开始的时间间隔 通俗来讲,假设他们都设置了5秒钟 fixedDelay:当前任务执行完后,总会等待5秒钟再执行下一个 fixedRate:当前任务开始执行,5秒钟过去了,下个任务直接开始运行,不管这个当前任务有没有跑完

三、最后

讲讲这种定时任务的弊端,大家都知道,目前的项目大多都是分布式的

要是像上面这样启动多台机器,他们之间就会相互竞争,每一个服务实例都会执行一遍

对此问题,我们就必须额外引入一个分布式锁,大部分公司应该都会引入redis作为分布式锁,成本低廉且可控

虽然可以使用redis分布式锁,但服务实例之间总会有毫秒之间的间隔差距,尤其是两边机器时间不对正的情况下 往往会出现,一台机器成功加锁运行完成释放锁,等这三步完成后 另一台机器慢悠悠的开始,然后重新的开始成功加锁运行完成释放锁 可以看到,这就出现了重复。虽然概率很低,但的确可能会出现这种情况

对于上面spring的定时任务,不适合作为分布式系统的定时任务,故此才有了分布式定时任务

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Spirng中定时任务@Scheduled的使用
    • 一、介绍
      • 二、注解中的属性
        • 三、最后
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档