1.启动类里面添加注解@EnableScheduling ,例如:

@SpringBootApplication
@EnableScheduling
@MapperScan("com.example.liuyi.mapper")
public class LiuyiApplication { public static void main(String[] args) {
SpringApplication.run(LiuyiApplication.class, args);
} }

2.方法添加注解@Scheduled ,并且实现类上要有组件的注解@Component,

例如cron的使用场景:

@Component
public class TaskTest { /**
* 定义一个按时间执行的定时任务,每隔5秒执行1次,
    cron表达式配置了在哪一刻执行任务,会在配置的任务开始时间判断任务是否可以执行,如果能则执行,不能则会跳过本次执行;
*/
@Scheduled(cron = "0/5 * * * * ?")
public void doEat() throws InterruptedException {
System.out.println("开始吃饭啦"+new Date());
Thread.sleep(7*1000);
System.out.println("结束吃饭啦" +new Date());
}

fixedDelay的使用场景
/**
* fixedDelay是设定上一个任务结束后多久执行下一个任务,也就是fixedDelay只关心上一任务的结束时间和下一任务的开始时间。
*/
@Scheduled(fixedDelay = 5*1000)
public void doPlay() throws InterruptedException {
System.out.println("开始玩啦"+new Date());
Thread.sleep(7*1000);
System.out.println("结束玩啦"+new Date());
}


fixedRate的使用场景
/**
* 定义一个按频率执行的任务
* 两个任务的开始时间间隔是5s,当到达任务的开始执行时间,但上一个任务却没有完成时,
* spring会等待上一个任务执行完,并立即开始执行本次任务。
*/
@Scheduled(fixedRate = 1000 * 5)
public void doJob() throws InterruptedException {
System.out.println("开始工作啦"+new Date());
Thread.sleep(7*1000);
System.out.println("结束工作啦" + new Date());
}


注意点:

1.SpringBoot 默认就是定时任务同步执行的,只要将@Scheduled添加到需要配置的任务方法上,下次任务执行开始将在本次任务执行完毕后才开始
同一任务的异步执行需要在方法体上加@Async注解
/**
* 同步执行
* @throws InterruptedException
*/
@Scheduled(cron = "*/20 * * * * ?")
public void ipWriter() throws InterruptedException {
for(int i=;i<;i++){
System.out.println("i----同步执行 "+new Date());
Thread.sleep();
}
} /**
* 异步执行
* @throws InterruptedException
*/
@Async
@Scheduled(cron = "*/20 * * * * ?")
public void ipWriterSync() throws InterruptedException {
for(int i=;i<;i++){
System.out.println("i----异步执行 "+new Date());
Thread.sleep();
}
}

2.多任务并发执行,在使用SpringBoot配置定时任务的过程中,使用@Scheduled配置了多个定时任务,但是在项目启动的时候每次只会启动一个定时任务,

因为 ThreadPoolTaskScheduler的源码默认开启的线程数是 1 ,所以每次只能执行一个定时任务,以下是部分源码
 
public class ThreadPoolTaskScheduler extends ExecutorConfigurationSupport implements AsyncListenableTaskExecutor, SchedulingTaskExecutor, TaskScheduler {
private volatile int poolSize = ; public void setPoolSize(int poolSize) {
Assert.isTrue(poolSize > , "'poolSize' must be 1 or higher");
this.poolSize = poolSize;
if (this.scheduledExecutor instanceof ScheduledThreadPoolExecutor) {
((ScheduledThreadPoolExecutor)this.scheduledExecutor).setCorePoolSize(poolSize);
} }
}

在启动的时候重新配置,创建BeanConfig类,注意,需要在类上添加@Component注解,项目启动的时候类中的@Bean注解才会被扫描到,使配置生效

@Component
public class ThreadPoolTaskSchedulerConfig {
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(2);//这里设置的线程数是2,可以根据需求调整
return taskScheduler;
} }

springboot整合@Scheduled定时任务的使用的更多相关文章

  1. SpringBoot整合Quartz定时任务 系统job Spring Boot教程 调度任务

    原文地址:https://www.cnblogs.com/allalongx/p/8477368.html 构建工程 创建一个Springboot工程,在它的程序入口加上@EnableScheduli ...

  2. SpringBoot整合Quartz定时任务

    记录一个SpringBoot 整合 Quartz 的Demo实例 POM.XML文件 <!-- 定时器任务 quartz需要导入的坐标 --> <dependency> < ...

  3. SpringBoot学习18:springboot使用Scheduled 定时任务器

    Scheduled 定时任务器:是 Spring3.0 以后自带的一个定时任务器. 1.在pom.xml文件中添加Scheduled依赖 <!-- 添加spring定时任务 Scheduled ...

  4. SpringBoot整合Quartz定时任务(持久化到数据库)

    背景 最近在做项目,项目中有个需求:需要使用定时任务,这个定时任务需要即时生效.查看Quartz官网之后发现:Quartz提供两种基本作业存储类型: RAMJobStore :RAM也就是内存,默认情 ...

  5. SpringBoot整合Quartz定时任务 的简单实例

    POM.XML文件 <!-- 定时器任务 quartz需要导入的坐标 --> <dependency> <groupId>org.quartz-scheduler& ...

  6. Spring Boot笔记(四) springboot 集成 @Scheduled 定时任务

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 1.在SpringBoot 项目中使用@Scheduled注解执行定时任务: 配置pom.xml 依赖: ...

  7. springboot 整合task定时任务

    一步:在启动类中加入     加入就会调用定时了. //开启定时任务 开启后就可以被扫描到   @EnableScheduling 二步:建一个tasks工具包 都会被扫描到的了 有三个类 Async ...

  8. SpringBoot整合Quartz定时任务 的简单实例 2

    (1)什么是Quartz?(2)Quartz的特点:(3)Quartz专用词汇说明:(4)Quartz任务调度基本实现原理: 接下来看下具体的内容: (1)什么是Quartz? Quartz是一个完全 ...

  9. springboot之scheduled任务调度

    springboot整合Scheduled可以方便的进行任务调度,话不多说,直接上代码 package com.rookie.bigdata; import org.springframework.b ...

随机推荐

  1. PHP判断类型

    is_bool();//判断是否为布尔型   is_float(); //判断是否为浮点型   is_int(); //判断是否为整型   is_numeric(); //判断是否为数值型   is_ ...

  2. vue中 js获取图片尺寸 设置不同样式

    1.JS: 请求到后端数据后 判断图片尺寸 2.HTML代码 根据设置的类型,给图片添加不同的样式 3.CSS代码 添加不同尺寸的样式

  3. C# 如何写出一个不能被其他程序集继承的抽象类

    我需要限定某个抽象类只能在我程序集类实现,而不支持其他程序集实现,也就是我需要一个不能被继承的抽象类 在 C# 里面有抽象类和接口,这两个都是期望被继承才能被使用,而抽象类是可以做到只能在自己程序集和 ...

  4. C# 循环的判断会进来几次

    最近有小伙伴告诉我,在循环的判断条件只会计算一次,本金鱼不相信,于是就做了测试,本文记录我做的测试. 先来写一个简单的代码, 就一个循环,循环的判断是从一个函数获取值 class Program { ...

  5. es6笔记 day4---模块化

    模块化: 注意:需要放到服务器环境 1.如何定义模块? export  东西 export   const a = 12; export { a  as  aaa, b  as  banana } 2 ...

  6. javascript修改css样式表

    //创建var sheet=document.createElement('style');document.bodt.appendChild(sheet);sheet.styleSheet.cssT ...

  7. 【原创】http请求中加号被替换为空格?源码背后的秘密

    这是why技术的第**20**篇原创文章![在这里插入图片描述](https://user-gold-cdn.xitu.io/2019/12/30/16f550eb82e10eff?w=900& ...

  8. [梁山好汉说IT] 容器概念在北宋社会的应用

    [梁山好汉说IT] 容器概念在北宋社会的应用 0x00 摘要 如何对没有软件开发经验的人解释容器? 集装箱真的能够完美解释容器嘛? 除了集装箱还有其他常见实体能够解释容器嘛? 我找到了一个能够 和集装 ...

  9. C# 中的IComparable和IComparer

    前言 在开发过程中经常会遇到比较排序的问题,比如说对集合数组的排序等情况,基本类型都提供了默认的比较算法,如string提供了按字母进行排序,而int整数则是根据整数大小进行排序.但是在引用类型中(具 ...

  10. redis 和 memcached 有什么区别?redis 的线程模型是什么?为什么 redis 单线程却能支撑高并发?

    redis 和 memcached 有啥区别? redis 支持复杂的数据结构 redis 相比 memcached 来说,拥有更多的数据结构,能支持更丰富的数据操作.如果需要缓存能够支持更复杂的结构 ...