首页 > 编程语言 > 详细

SpringBoot中使用Scheduling执行定时任务

时间:2019-09-06 18:10:44      阅读:77      评论:0      收藏:0      [点我收藏+]

SpringBoot自带的 Schedule,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多

以下任务都是在单线程下执行的

第一步 创建SpringBoot项目

第二步 外汇返佣http://www.fx61.com/,添加@EnableScheduling开启定时任务

第三步 设置定时需要执行的任务

有两种方法设置执行时机

第一种我们就且叫他为普通方法

1.fixedRate:会为所有任务的开始执行时间编排一个表,假如fixedRate=5000,且第一次开始时间是10:00:00

任务 开始执行时间

任务1 10:00:00

任务2 10:00:05

任务3 10:00:10

任务4 10:00:15

任务5 10:00:20

当执行任务耗时小于fixedRate设置的时间时,将会按照表中的开始时间执行任务,即每隔5秒会执行一个任务:

@Component

public class TestScheduling {

    private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Scheduled(fixedRate=5000)

    public void myTask() throws InterruptedException {

        LOG.info("执行时间:{}",sdf.format(new Date()));

    }

}

当执行任务耗时大于fixedRate设置的时间时,以下一张图就很清楚的表示了(图的出处)

解析一下:

fixedRate设置的也是为fixedRate=5000

第一个任务开始执行时间是0:00,耗时8

第二个任务本应该开始执行时间是005,但是第一个任务执行完时间已经是008,所以第二个任务在第一个任务执行完毕之后会立即执行,耗时是3s

第三个任务本应该开始执行时间是010,但是前两个任务执行完毕时间已经是011,所以第三个任务在第二个任务执行完毕之后会立即执行,耗时是6s

第四个任务,也同第二、第三个任务一样,在预计开始执行的时间(这里第四个任务预计开始执行时间是0:15),因为上一个任务还没有执行完毕,所以要等待上一个人执行完毕之后才会执行。

第五个任务预计开始执行时间是0:20,而前四个任务在0:19已经执行完毕,需要等待1秒,到达我们预计的开始执行时间(0:20)才会执行第五个任务。

2.fixedDelay

这个就比之前的fixedRate简单得多。如设置fixedRate=5000.下一个任务只需要盯着上一个任务的屁股(执行完毕的时间)就行了。上一个任务执行完毕5秒之后,下一个任务就会开始执行

@Component

public class TestScheduling {

    private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Scheduled(fixedDelay=5000)

    public void myTask(){

        LOG.info("开始执行时间:{}",sdf.format(new Date()));

        try {

            Thread.sleep(8000);//让任务执行的耗时时间为8秒,有利于我们的观察

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        LOG.info("执行完毕时间:{}",sdf.format(new Date()));

    }

}

3.initialDelay

用于配合fixedRatefixedDelay使用的,作用是在容器启动后经过多长时间才开始执行第一次任务。

4.扩展一下

我们先看下一下@Scheduled注解里面有什么

 fixedDelayStringfixedRateStringinitialDelayString不就是我们上面讲的三个加个字符串嘛,之前的三个都是long类型,这三个是String类型,顾名思义,不就是用字符串表示嘛。作用其实就是为了能在application.properties配置

@Component

public class TestScheduling {

    private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);

    private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

    @Scheduled(initialDelay = 5000,fixedDelayString = "${com.liang.scheduled:5000}")

    public void myTask(){

        LOG.info("开始执行时间:{}",sdf.format(new Date()));

        try {

            Thread.sleep(8000);

        } catch (InterruptedException e) {

            e.printStackTrace();

        }

        LOG.info("执行完毕时间:{}",sdf.format(new Date()));

    }

}

 5000作用是防止application.properties没有配置com.liang.scheduled属性则使用默认的5000(如果没有写:5000application.properties没有配置com.liang.scheduled属性会报异常)

执行结果:和我们预计的一样,下一次开始执行时间与上一次结束时间间隔正好是10秒。如果去掉application.properties中的com.liang.scheduled属性,则间隔时间是默认的5秒,这个自行验证。

几乎大部分的应用都会有定时执行任务的需求。使用Spring BootScheduling Tasks能够提高您的开发效率。这篇文章将介绍怎么通过Spring Boot去做调度任务。

构建工程

创建一个Springboot工程,在它的程序入口加上@EnableScheduling,开启调度任务。

@SpringBootApplication

@EnableScheduling

public class SpringbootScheduledApplication {

    public static void main(String[] args) {

        SpringApplication.run(SpringbootScheduledApplication.class, args);

    }

}

创建定时任务

创建一个定时任务,每过2s在控制台打印当前时间。

@Component

public class ScheduledTasks {

    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

 

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

 

    @Scheduled(fixedRate = 2000)

    public void reportCurrentTime() {

        log.info("The time is : " + dateFormat.format(new Date()));

    }

}

SpringBoot中使用Scheduling执行定时任务

原文:https://www.cnblogs.com/benming/p/11477056.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!