文档章节

SpringBoot基础教程3-1-1 简单定时任务方法介绍

Mkeeper
 Mkeeper
发布于 2018/09/29 10:45
字数 1140
阅读 61
收藏 5

1 概述

定时任务,特定的时间执行任务,在项目中普遍使用。本文介绍简单的无状态无持久化的定时任务实现方式;TimerScheduledExecutorServiceSpring Task

2 Timer实现方式

JDK自带的java.util.Timer;通过调度java.util.TimerTask的方式 让程序按照某一个频度执行,但不能在指定时间运行。 一般用的较少。

/**  
 *    基于 Timer 实现的定时调度,基本就是手撸代码,目前应用较少,不是很推荐
 *   
 * @author Mkeeper  
 * @create 2018/9/28 11:12
 */
public class TimerDemo {

    public static void main(String[] args) {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("执行任务: " + LocalDateTime.now());
            }
        };

        Timer timer = new Timer();

        // timerTask:需要执行的任务
        // delay:延迟时间(以毫秒为单位)
        // period:间隔时间(以毫秒为单位)
        timer.schedule(timerTask, 5000, 3000);

    }
}

3 ScheduledExecutorService实现方式

ScheduledExecutorService,JDK1.5新增的,位于java.util.concurrent包中;是基于线程池设计的定时任务类,每个调度任务都会被分配到线程池中,并发执行,互不影响。

Timer很类似,但它的效果更好;多线程并行处理定时任务时,Timer运行多个TimeTask时,只要其中有一个因任务报错没有捕获抛出的异常,其它任务便会自动终止运行,使用 ScheduledExecutorService则可以规避这个问题

/**  
 *   优于Timer
 * @author Mkeeper  
 * @create 2018/9/28 11:15
 */
public class ScheduledExecutorServiceDemo {

    public static void main(String[] args) {
        final ScheduledExecutorService service = Executors.newScheduledThreadPool(3);

        // 参数:
        // 1、具体执行的任务
        // 2、首次执行的延时时间
        // 3、任务执行间隔
        // 4、间隔时间单位
        service.scheduleAtFixedRate(() ->
                System.out.println("执行任务:" + LocalDateTime.now()),
                0, 3, TimeUnit.SECONDS
        );
    }
}

4 Spring Task实现方式(推荐)

Spring TaskSpring3.0 以后新增了task,一个轻量级的Quartz,功能够用,用法简单。

Spring Taskspring-contextorg.springframework.scheduling下,只需要依赖spring-boot-starter-web即可。

@Scheduled注解, Spring Task定时任务的核心

  • cron cron表达式,根据表达式循环执行,与fixedRate属性不同的是它是将时间进行了切割。@Scheduled(cron = "0/5 * * * * *"任务将在5、10、15、20...这种情况下执行。
  • fixedRate: 每隔多久执行一次;@Scheduled(fixedRate = 1000假设第一次工作时间为2018-09-28 10:58:28,工作时长为3秒,那么下次任务的时候就是2018-09-28 10:58:31配置成异步后,只要到了执行时间就会开辟新的线程工作,如果@Scheduled(fixedRate = 1000假设第一次工作时间为2018-09-28 10:58:28,工作时长为3秒,那么下次任务的时间是2018-09-28 10:58:29
  • fixedDelay: 当前任务执行完毕后等待多久继续下次任务@Scheduled(fixedDelay = 3000假设第一次任务工作时间为2018-09-28 10:58:30,工作时长为5秒,那么下次任务的时间就是2018-09-28 10:58:38
  • initialDelay: 第一次执行延迟时间,只是做延迟的设定,与fixedDelay关系密切,配合使用,相辅相成。

@Async注解,代表该任务可以进行异步工作,由串行改为并行。

cron表达式在线生成http://www.pdtools.net/tools/becron.jsp

@Component
@Slf4j
public class SpringTaskDemo {

    @Async
    @Scheduled(cron = "0/1 * * * * *")
    public void scheduled1() throws InterruptedException {
        TimeUnit.SECONDS.sleep(3);
        log.info("schedule1 每1m秒执行一次: {}", LocalDateTime.now());
    }

    @Scheduled(fixedRate = 1000)
    public void scheduled2() throws InterruptedException {
        TimeUnit.SECONDS.sleep(3);
        log.info("schedule2 每1m秒执行一次: {}", LocalDateTime.now());
    }

    @Scheduled(fixedDelay = 3000)
    public void scheduled3() throws InterruptedException {
        TimeUnit.SECONDS.sleep(3);
        log.info("scheduled3 上次执行完毕后隔3秒继续执行:{}", LocalDateTime.now());
    }

}

开启任务

  • @EnableScheduling注解表示开启对@Scheduled注解的解析;同时new ThreadPoolTaskScheduler()也是相当的关键,通过阅读过源码可以发现默认情况下的 private volatile int poolSize = 1;这就导致了多个任务的情况下容易出现竞争情况,多个任务的情况下,如果第一个任务没执行完毕,后续的任务将会进入等待状态
  • @EnableAsync注解表示开启@Async注解的解析;作用就是将串行化的任务给并行化。
@EnableAsync
@EnableScheduling
@Configuration
public class TaskSchedulerConfig {
   
    @Bean
    public TaskScheduler taskScheduler(){
        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(10);
        return taskScheduler;
    }
}

5 测试结果

请自己动动手

6 工程目录

7 结束语

后续文章会陆续介绍,Quartz,以及基于Quartz实现的分布式任务项目,xxl-jobelastic-job,尽情期待。本文源码


欢迎关注博主公众号,第一时间推送最新文章

欢迎关注博主公众号

© 著作权归作者所有

Mkeeper
粉丝 23
博文 30
码字总数 22957
作品 0
西城
架构师
私信 提问
企业级 SpringBoot 教程 (十八)定时任务(Scheduling Tasks)

这篇文章将介绍怎么通过spring去做调度任务。 构建工程 创建一个Springboot工程,在它的程序入口加上@EnableScheduling,开启调度任务。    创建定时任务 创建一个定时任务,每过5s在控制台...

03/04
0
0
【SpringBoot2.0系列10】SpringBoot之@Scheduled任务调度

【SpringBoot2.0系列01】初识SpringBoot 【SpringBoot2.0系列02】SpringBoot之使用Thymeleaf视图模板 【SpringBoot2.0系列03】SpringBoot之使用freemark视图模板 【SpringBoot2.0系列04】Spr...

余空啊
2018/08/27
0
0
springboot 整合quartz (一):基础使用

---layout: blogistop: truetitle: "springboot 整合quartz (一):基础使用"date: 2018-10-09category: springboottags: springboot quartz --- 介绍 Quartz是一个开源的框架,它完全由写成。......

开心的哈士奇
2018/10/11
266
0
springboot(二)进阶篇

继之前的springboot(一)入门篇 ,本次主要讲springboot的一些其他特性,springboot内容很多,后续会持续更新. 多数据源 log4j日志 aop面向切面编程 缓存 定时任务 异步任务 自定义参数 多环境的...

zhuyuansj
2017/10/07
0
0
220.详细整理学习spring boot

1.springboot是什么? 有什么用? 1.1 是什么 一个整合常用第三方框架,简化xml配置,完全采用注解形式,内置tomcat容器,帮助开发者快速实现项目搭建,spring boot 的web组件默认集成的是spr...

Lucky_Me
04/23
130
1

没有更多内容

加载失败,请刷新页面

加载更多

Android OkHttp + Retrofit 取消请求的方法

本文链接 前言 在某一个界面,用户发起了一个网络请求,因为某种原因用户在网络请求完成前离开了当前界面,比较好的做法是取消这个网络请求。对于OkHttp来说,具体是调用Call的cancel方法。 ...

shzwork
34分钟前
5
0
并发编程之Callable异步,Future模式

Callable 在Java中,创建线程一般有两种方式,一种是继承Thread类,一种是实现Runnable接口。然而,这两种方式的缺点是在线程任务执行结束后,无法获取执行结果。我们一般只能采用共享变量或...

codeobj
今天
6
0
Ubuntu环境下安装PaddlePaddle

开篇 深度学习技术是目前非常热门的技术,笔者在闲暇之余决定学习一下这门技术,入门选择了百度开源的PaddlePaddle框架。 paddlepaddle介绍 飞桨(PaddlePaddle) 是国际领先的端到端开源深度学...

豫华商
今天
6
0
LeetCode 第 287 号问题:寻找重复数,一道非常简单的数组遍历题,加上四个条件后感觉无从下手

今天分享的题目来源于 LeetCode 第 287 号问题:寻找重复数。 题目描述 给定一个包含 n + 1 个整数的数组 nums,其数字都在 1 到 n 之间(包括 1 和 n),可知至少存在一个重复的整数。假设只...

五分钟学算法
今天
6
0
vuex mapActions

本文转载于:专业的前端网站➧vuex mapActions 在组件中使用 this.$store.dispatch('xxx') 分发 action,或者使用 mapActions 辅助函数将组件的 methods 映射为 store.dispatch 调用(需要先在...

前端老手
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部