IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot 使用Schedule定时框架 -> 正文阅读

[Java知识库]SpringBoot 使用Schedule定时框架

一、引言

???????? 在开发过程中,我们往往需要实现一些定时功能比如执行定时任务、定时发送统计数据等,现在虽然有java有很多类似Saturn(唯品会自主研发的分布式的定时任务的调度平台),但是在一些比较小的项目而又没有搭建好的分布式定时任务中台时,可以使用Schedule定时任务框架,使用起来简单而且就算分布式项目也可以通过使用分布式锁将Schedule实现分布式定时任务功能。

二、Schedule定时框架的使用

1、添加依赖

????????使用IDEA的Spring Initiallzr创建的SpringBoot 的最基本的依赖就包含了Schedule的依赖,无需引入其它依赖了。

2、在Springboot启动类上添加@EnableScheduling注解

package com.example.schedule;

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

@EnableScheduling
@SpringBootApplication
public class ScheduleApplication {

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

}

3、根据需要选择Schedule (fixedRate、fixedDelay、cron表达式)三种任务调度器对应的具体调度器

????????3.1?fixedRate调度器(固定频率任务)

???????????@Scheduled(fixedRate = 3000)是上次任务开始的时候计时3秒后再次执行任务(这3秒包含了任务执行所需时间,即不用等待上一次调用完成,如果上次任务执行超过3秒就可能会存在任务重复执行的问题) ,但是这里要注意的是Schecule默认是单线程执行的,如果没设置Schecule并发执行任务的话,使用fixedRate依旧串行执行的,不会催在重复执行情况。

package com.example.schedule.schedule;

import cn.hutool.core.date.DateUtil;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTask {

    @Scheduled(fixedRate = 3000)
    public void fixedRateTest1() {
        System.out.println("fixedRate : " + DateUtil.now());
    }
}

?未设置并发fixedRate执行情况(这时候虽然设置是3秒间隔执行任务而实际间隔都是5秒):

package com.example.schedule.schedule;

import cn.hutool.core.date.DateUtil;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTask {

    @Scheduled(fixedRate = 3000)
    public void fixedRateTest1() {
        System.out.println("fixedRateTest1 : " + DateUtil.now());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

?设置并发后fixedRate执行情况(执行间隔都是3秒):

import cn.hutool.core.date.DateUtil;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTask {

    @Scheduled(fixedRate = 3000)
    @Async
    public void fixedRateTest1() {
        System.out.println(Thread.currentThread().getName()+"<>fixedRateTest1 : " + DateUtil.now());
        try {
            Thread.sleep(5000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

?

????3.2?fixedDelay调度器(固定间隔任务)

???????????@Scheduled(fixedDelay= 3000)是指上次任务结束后再计时3秒后再次开启新的一次调用。

package com.example.schedule.schedule;

import cn.hutool.core.date.DateUtil;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTask {

    @Scheduled(fixedDelay = 3000)
    public void fixedRateTest1() {
        System.out.println(Thread.currentThread().getName()+"<>fixedRateTest1 : " + DateUtil.now());
    }
}

?

??3.3?cron表达式

???????????@Scheduled(cron = "0/3 * * * * *")是根据cron表达式执行定时任务的。

package com.example.schedule.schedule;

import cn.hutool.core.date.DateUtil;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class ScheduledTask {

    @Scheduled(cron = "0/3 * * * * *")
    public void cronTest1() {
        System.out.println(Thread.currentThread().getName()+"<>cronTest1 : " + DateUtil.now());
    }
}

三、Schedule其它

1、在线corn表达式生成器,可以图形化生成corn表达式:https://cron.qqe2.com/

2、?Schecule默认是单线程执行的,可以在Spring Schedule源码的org.springframework.scheduling.config.ScheduledTaskRegistrar里的scheduleTasks看到定时调度任务初始化时候初始化了一个单线程的线程池,所以在定时任务调度时候, 如果定时任务过多, 就会存在线程争抢,所以如果不设置成并发的时候当在同一时间多个任务并发执行时,任务调度器就会出现时间偏移,任务执行时间将不再和设置执行的一样。

?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-14 09:49:17  更:2022-05-14 09:50:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 21:33:08-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码