当前位置: 首页 > 编程笔记 >

SpringBoot @Scheduled注解(cron、fixedRate、fixedDelay、initialDelay)各个参数区别

赵夕
2023-05-05

@Scheduled使用及详解

  • @Scheduled注解:任务自动化调度

  • @Scheduled 标记要调度的方法的注解。必须指定 cronfixedDelayfixedRate属性之一。

  • 该注解共有8个参数,这里我重点介绍几个必要的参数:

  1. fixedDelay控制方法执行的间隔时间(毫秒),是以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,并间隔给定的时间后,执行下一次。上个过程结束后,等待300ms,执行下个过程

  2. fixedRate是按照一定的速率执行,是从上一次方法执行开始的时间算起,如果上一次方法阻塞住了,下一次也是不会执行,但是在阻塞这段时间内累计应该执行的次数,当不再阻塞时,一下子把这些全部执行掉,而后再按照固定速率继续执行。以固定300ms的频率执行某个过程,不管前面的过程是否还在进行,一般用于可以**独立、并行**的执行过程

  3. cron表达式可以定制化执行任务,但是执行的方式是与fixedDelay相近的,也是会按照上一次方法结束时间开始算起。

  4. initialDelay 如: @Scheduled(initialDelay = 10000,fixedRate = 15000,这个定时器就是在上一个的基础上加了一个initialDelay = 10000 意思就是在容器启动后,延迟10秒后再执行一次定时器,以后每15秒再执行一次该定时器。

package com.demo.task;
 
import com.demo.util.DateUtils;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
 
import java.util.Date;
 
@Component
public class Test_task {
 
	//@Component 注册为spring组件
 
	/*
	1、fixedDelay控制方法执行的间隔时间,是以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,
		并间隔给定的时间后,执行下一次。
	2、fixedRate是按照一定的速率执行,是从上一次方法执行开始的时间算起,如果上一次方法阻塞住了,下一次也是不会执行,
		但是在阻塞这段时间内累计应该执行的次数,当不再阻塞时,一下子把这些全部执行掉,而后再按照固定速率继续执行。
	3、cron表达式可以定制化执行任务,但是执行的方式是与fixedDelay相近的,也是会按照上一次方法结束时间开始算起。
	4、initialDelay 。如: @Scheduled(initialDelay = 10000,fixedRate = 15000,这个定时器就是在上一个的基础上加了一个
		initialDelay = 10000 意思就是在容器启动后,延迟10秒后再执行一次定时器,以后每15秒再执行一次该定时器。
	*/
 
 
	@Scheduled(cron="0 */1 * * * ?")
	public void Test_task(){
		//System.out.println("定时1分钟执行一次");
	}
 
	//*/5 * * * * ?  5秒执行一次
	@Scheduled(cron = "*/5 * * * * ?")
	public  void time(){
		//System.out.println("每5秒执行一次:"+ DateUtils.dateToString(new Date(),"yyyy-MM-dd HH:mm:ss"));
	}
 
	//fixedRate 定义一个按一定频率执行的定时任务
	@Scheduled(fixedRate = 5000)
	public  void fixedRate(){
		System.out.println("每5毫秒执行fixedRate一次:"+ DateUtils.dateToString(new Date(),"yyyy-MM-dd HH:mm:ss"));
	}
 
	//fixedDelay 定义一个按一定频率执行的定时任务,与上面不同的是,改属性可以配合initialDelay, 定义该任务延迟执行时间。
	@Scheduled(fixedDelay = 5000)
	public  void fixedDelay(){
		System.out.println("每5毫秒执行fixedDelay一次:"+ DateUtils.dateToString(new Date(),"yyyy-MM-dd HH:mm:ss"));
	}
 
	@Scheduled(initialDelay = 1000,fixedRate = 5000)
	public void initialDelay(){
		System.out.println("华丽的分割符----"+DateUtils.dateToString(new Date(),"yyyy-MM-dd HH:mm:ss"));
	}
}


#####2021/10/18 cron表达式######

问题:0 0/10 * * * 与 0 */10 * * * 的区别?

说明:从5:07分钟的时候执行该任务

         0 0/10 * * *会在5:10的时候进行执行,

         0 */10 * * *会在5:17进行执行。这就是两者的差别。

0 0/10 * * *代表从0分钟开始,每10分钟执行任务一次。0 */10 * * *代表从任务启动开始每10分钟执行任务一次;

*代表任意字符,/代表递增。

 类似资料:
  • 我正在使用所有带注释的springmvc版本,并且我有一个类,我安排了一个每5秒运行一次的方法。但是,它似乎并没有触发。 我已经创建了一个程序包,当应用程序启动时要扫描它,并且我已经按照以下方式声明了类: My class和cron:@Component public class DemoServiceBasicUsageCron{ 应用程序启动时扫描包:DEBUG DefaultListable

  • 我是Spring调度器的新手。我读过很多关于@Schedule的文章,但在每个例子中,他们都是以秒或毫秒为单位给出时间的。 通过使用上面的程序,我将达到,但我想避免300000/900000毫秒。其他方式

  • 问题内容: 当使用Spring 3.0功能注释计划任务时,我想从配置文件中设置as参数,而不是像当前那样将其硬连接到任务类中。 不幸的是,使用Spring表达式语言(SpEL)的方法似乎返回了一个String对象,该对象又不能按照参数要求自动装箱成长值。 问题答案: 我想注释是毫无疑问的。因此,可能适合您的解决方案是使用XML配置。让我们考虑以下示例(从Spring doc 复制): …或者如果从

  • 我正在运行一个spring boot计划的进程,需要5-10秒才能完成。完成后,60秒后流程再次开始(注意,我使用的不是fixedRate): 现在,我想限制它每分钟运行周一至周五上午9点到下午5点。我可以用 这里的问题是,这与fixedRate类似--进程每60秒触发一次,而不考虑完成上一次运行所花费的时间。 有没有办法把这两种技术结合起来?

  • 在我们的系统中,我们使用一个设置类来指向属性文件,这取决于它加载不同属性文件的eve。要访问特定属性,我们调用“设置”。getString('property_name_here')。 在我的代码中,我将@scheduled cron表达式加载到一个变量,并尝试将其传递给@scheduled注释,但它不起作用, 下面是我的代码:在属性文件中: 在我看来: 它创建了一个字符串“0114***”,这是

  • 只是想知道如果你想让它在晚上21点到早上6点之间每隔三分钟运行一次,这是一个正确的@Sched约cron表达式吗: 会持续一整晚吗?