SpringBoot——使用@Scheduled定时器

Spring定时任务 - @Schedule注解详解 一、@Schedule注解一览 @Scheduled注解共有8个属性(其中有3组只是不同类型的相同配置)和一个常量CRON_DISABLED,源码如下: /** * 标记要调度的方法的注释。 必须准确指定 cron、fixedDelay 或 fixedRate 属性之一。带注释的方法必须没有参数。 * 它通常有一个 void 返回类型; 如果不是,则在通过调度程序调用时将忽略返回值。@Scheduled 注解的处理是通过注册 * 一个 ScheduledAnnotationBeanPostPr 阅读详情

@Scheduled注解是 Spring Boot 提供的定时任务配置工具,用于控制任务执行时间。

使用方法:

  1. 先启用定时器配置,添加注解@EnableScheduling,可在@SpringBootApplication或者@Configuration或者@Component等spring能够扫描到的地方;
  2. 在spring能够识别的类中定义没有返回值和参数的方法,在方法上使用@Scheduled注解;

@Scheduled注解的参数解释:

  • fixedRate:固定速率(ms),按照每次任务的开始时间间隔执行(定时器启动的时候每次开始时间就已确定),上一次任务执行时间超过后面的任务开始时间,后面任务会积压到队列里,等这个时间很长的任务结束后,队列里的积压任务全部同时放行;
  • fixedRateString:同上,字符串类型,支持${}占位符,可灵活配置;
  • fixedDelay:固定延迟(ms),以上次的结束时间开始延迟一定时间执行下一次,不会积压;
  • fixedDelayString:同上,字符串类型,支持${}占位符,可灵活配置;
  • initialDelay:延迟启动定时器时间(ms),指定一段时间后才开始启动定时器;
  • initialDelayString:同上,字符串类型,支持${}占位符,可灵活配置;
  • cron:cron表达式,比上面的更灵活,字符串类型,支持${}占位符,上次任务如果超时会自动丢弃当前时间应该执行的任务;(跟linux的cron稍有区别,linux的是“分时日月周”,这个是“秒分时日月周[年]”,多了秒和可省略的年)
  • zone:时区,一般默认即可,自动使用服务器时区,也可指定如“Asia/Shanghai”;

PS:占位符可以只占String的一部分;定时器里如果抛出异常不会影响下一次任务;对cron的简单理解,可以把每个字段的设置都解释为一个整数数组,例如在秒字段上的0/10,可以解释成[0, 10, 20, 30, 40, 50],在月字段上的*表示所有值,可解释成[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],也就是每个月都有;

测试代码:

启动类:

package testspringschedule;

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

@SpringBootApplication
@EnableScheduling
public class TestSpringSchedule {

	public static void main(String[] args) {
		System.out.println("main start");
		SpringApplication.run(TestSpringSchedule.class, args);
	}

}

测试fixedRate:

package testspringschedule;

import java.util.Date;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

//@Configuration
@Component
//@EnableScheduling
public class MyRateSchedule {
	
	@Scheduled(fixedRate = 5000, initialDelay = 3000, zone = "Asia/Shanghai")
//	@Scheduled(fixedRateString = "5000", initialDelayString = "3000")
//	@Scheduled(fixedRateString = "${abc:5}000", initialDelayString = "${def:3000}")
	public void test1() {
		System.out.println("fixedRate start:" + new Date());
		try {
			Thread.sleep(1000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("fixedRate stop:" + new Date());
	}
	
	private int i = 0;
//	@Scheduled(fixedRate = 1000, initialDelay = 3000)
	public void test2() {
		System.out.println("fixedRate start:" + new Date());
		i++;
		System.out.println(i);
		if (i == 5) {
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		System.out.println("fixedRate stop:" + new Date());
	}
	
}

test1()执行结果,开始时间都是间隔5s:

test2()执行结果,开始时间间隔1s,超时积压多个任务等上一个任务结束后全部同时执行;

测试fixedDelay:

package testspringschedule;

import java.util.Date;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class MyDelaySchedule {

	@Scheduled(fixedDelay = 5000, initialDelay = 3000)
	public void test1() {
		System.out.println("fixedDelay start:" + new Date());
		try {
			Thread.sleep(3000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("fixedDelay stop:" + new Date());
	}
	
}

执行结果:

测试cron:

package testspringschedule;

import java.util.Date;

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class MyCronSchedule {

	@Scheduled(cron = "50/2 * * * * ?")
//	@Scheduled(cron = "${s:1/2 * * * * ?}")
//	@Scheduled(cron = "${s:0/5} * * * * ?")
	public void test1() {
		System.out.println("cron:" + new Date());
	}
	
//	@Scheduled(cron = "0/10 * * * * ?")
	public void test2() {
		System.out.println("cron start:" + new Date());
		try {
			Thread.sleep(11000);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		System.out.println("cron stop:" + new Date());
	}
	
}

test1()执行结果:

test2()执行结果,超时丢弃:

也可以实现SchedulingConfigurer接口,使用配置类进行线程池、异常处理、拒绝策略等的一些配置:(默认配置所有定时器都是单线程串行的)

package testspringschedule;

import java.util.concurrent.ThreadPoolExecutor;

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.util.ErrorHandler;

@Configuration
public class MyScheduleConfig implements SchedulingConfigurer {

	@Override
	public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
		final ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
        taskScheduler.setPoolSize(50);
        taskScheduler.setThreadGroupName("Scheduled-Group");
        taskScheduler.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
        taskScheduler.setErrorHandler(new ErrorHandler() {
			@Override
			public void handleError(Throwable t) {
				System.out.println("发生未捕获异常:");
				t.printStackTrace();
			}
		});
        taskScheduler.initialize();
        taskRegistrar.setTaskScheduler(taskScheduler);
	}

}

SpringBoot定时任务 @Scheduled详解 这就导致了一个非常严重的分布式问题:在每一台机器上都会在同时执行定时调度任务,可能产生很多重复数据或者导致系统出现其他的业务逻辑BUG,所以在使用@Scheduled进行任务调度时,一定要配合redis的分布式锁来使用,让定时调度任务只在一台机器上执行,避免BUG出现。这个参数是最经常使用的参数,表示接收一个cron参数,cron它是一个表达式,最多接收7个参数,从左到右分别表示:秒 分 时 天 月 周 年;在使用时需要在类上添加注解@EnableScheduling,表示开启定时任务。 阅读详情

相关推荐

@Scheduled定时器

当任务开始时Spring就会给这个任务计时,5秒钟时候Spring就会再次调用这个任务,可是发现原来的任务还在执行,这个时候第二个任务就阻塞了(这里只考虑单线程的情况下,多线程后面再讲),甚至如果第一个任务花费的时间过长,还可能会使第三第四个任务被阻塞。每分钟的第十秒执行一次。比如第一次执行时间为2023-10-20 23:09:10,下一次2023-10-20 23:10:10,再下一次2023-10-20 23:11:10。上一次任务执行完毕时间点之后多长时间再执行,任务的执行要等上一个任务执行结束。

qq_55342245的博客 1927

使用@Schedule注解实现定时任务,多线程执行定时任务,Cron表达式详解

使用@Schedule注解实现定时任务,多线程执行定时任务,Cron表达式详解

樂小伍 1万+

SpringBoot 定时器@Scheduled的使用

在开发中,经常需要执行定时任务,例如定时发送邮件、定时清理缓存等。 Spring框架提供了@Scheduled注解,可以方便地实现定时任务的调度和执行。 本文将详细介绍@Scheduled注解的属性和使用示例。

一碗清深的博客 951

spring boot @Scheduled定时器

参考文献

陌上离歌 148

若依前后端分离版实战:MQTT集成保姆级教程(含MQTTX测试工具使用)

本文详细介绍了在若依前后端分离架构中集成MQTT协议的完整流程,包括环境搭建、核心配置、安全实践及性能优化。通过MQTTX测试工具的使用和实战代码示例,帮助开发者快速实现物联网场景下的实时通信功能,提升系统稳定性和效率。

weixin_30664051的博客 456

从智能手机到汽车电子:聊聊IPC-9702/9704A标准如何帮我们搞定不同场景下的PCB可靠性设计

本文探讨了IPC-9702/9704A标准在智能手机和汽车电子等不同场景下的PCB可靠性设计应用。通过分析消费电子、汽车电子和工业设备中的应力特征,详细解读了IPC标准在应变识别和测试方法论中的核心价值,并提供了具体的轻量化设计策略和全生命周期验证方案,帮助工程师提升PCB的长期可靠性。

weixin_30693683的博客 280

Spring Boot使用@Scheduled定时器任务

标题 : Spring Boot使用@Scheduled定时器任务 目录 : 技术文档 序号 : 99 Spring Boot使用@Scheduled定时器任务 摘要: Spring Boot之使用@Scheduled定时器任务 假设我们已经搭建好了一个基于Spring Boot项目,首先我们要在Application中设置启用定时任务功能@EnableScheduling。 ​ 启动定时任务 p...

AdamKai 1万+

F5高可用HA配置详情

F5 HA详细配置

weixin_45843944的博客 3025

SpringBoot定时器:@Scheduled

  Spring Boot中定时器的配置使用是非常简单的。   假设已经搭建好了一个SpringBoot应用程序。只需要两步。 1、在Application中添加注解@EnableScheduling,我的Application代码如下: package com.example.demo; import org.springframework.boot.SpringApplication; ...

背着梦的幸存者 411

使用【阿里云百炼】搭建自己的大模型

本文介绍阿里云百炼大模型平台,其为企业级服务平台,融合通义千问等模型,支持多模态能力,提供一站式工具降低开发门槛。重点讲解智能体应用及大模型搭建步骤,含进入创新应用界面、选模型配参数、输指令、导数据、加载知识库、获取API Key、加样例库、配置MCP,还提及模型调试与多平台发布,并附试用链接,助力企业与开发者快速搭建适配业务的AI模型。

Larry的博客 4738

C# Log4Net不输出日志的解决方法

log4net是一个流行的 .NET 日志框架,用于记录应用程序的日志信息。如果你在使用log4net。

精通搬砖,资深技术砖家,在软件开发,人工智能,设备开发等领域都有研究。商业合作&交流学习可私信联系。 1263

springboot使用@Scheduled定时器

springboot使用@Scheduled定时器 定时器这玩意吧,要不平时用不到,突然一下用到了吧,还想不起来怎么搞,今天看了一下,看是挺简单的,但是还是要实践一下吧,自己搞了个项目写了个小demo。实践才是知识的来源嘛。 弄完之后,我想这吧,还是应该收集一下吧。平时不积累,时间长了也还是会忘的,还是收录到了我csdn。 老规矩先看工程目录 1.先看一下SchedulerTask1.java实...

weixin_40323340的博客 289

【ARM Trace32(劳特巴赫) 高级篇 20 -- SNOOPer 使用介绍】

在 Lauterbach TRACE32 调试系统中,Snooper是一种特殊的监视工具,它能够在不中断处理器执行的情况下监视和记录特定内存地址的数据变化。这对于系统级调试、性能分析、数据流监视以及实时系统的问题追踪特别有用,尤其是在无法使用中断的情况下。当你设置了一个或多个Snooper时,TRACE32 硬件将不断地监视指定的内存地址,一旦发生了读写操作,就会将相关信息记录下来。这样你就可以看到某个地址的数据是什么时候以及如何被修改的,而不会影响目标系统的运行。

CodingCos的博客 2765

Spring Boot使用自带定时器@Scheduled

①:写法:@Scheduled(cron = “0 * * * * ?”)," "号中的内容可自行百度Scheduled代码生成,这里是一分钟执行一次,百度生成的代码中一般都是6位,有的版本只支持5位,可直接删除生成的最后一位,效果不变。 ②在Application启动类中加入注解:@EnableScheduling //定时器注解 ...

Hibeilu的博客 238

QT应用编程: 编写低功耗BLE蓝牙调试助手(Android系统APP)

一、环境介绍 QT版本: 5.12.6 编译环境: win10 64位 目标系统: Android 完整工程源码下载地址(包含APK文件):https://download.youkuaiyun.com/download/xiaolong1126626497/19051696 二、功能介绍 本软件是一款BLE蓝牙串口调试助手,支持常规的发送和接收调试,BLE是低功耗类型蓝牙,在智能家居、物联网领域使用较多。BLE低功耗蓝牙一般不能直接使用手机进行连接,手机蓝牙默认都是工作在传统蓝牙模式,无法直接连接BL..

7660

100 道大数据开发技术原理与实战面试宝典(必过答案详细解析)I

在数字化浪潮席卷全球的今天,大数据开发工程师已成为企业数字化转型的核心力量。无论是互联网巨头的用户行为分析,还是金融机构的风险控制,亦或是智慧城市的数据中枢,都离不开大数据技术的支撑。然而,面对BAT等头部企业严格的面试要求,候选人不仅需要掌握扎实的理论基础,更需具备将技术落地的实战能力。本文基于历年高频面试题与企业真实场景需求,梳理100道必考题目,涵盖基础概念、框架原理、算法设计、性能优化等核心领域,助你构建完整的知识体系,从容应对面试挑战。

AI天才研究院 1386

SpringBoot中@Scheduled 定时器的使用

首先,在项目启动类上添加 @EnableScheduling 注解,开启对定时任务的支持。 @SpringBootApplication @EnableScheduling public class ScheduledApplication { public static void main(String[] args) { SpringApplication.run(ScheduledApplication.class, args); } } 其次,编写定时任务

散格 988

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Spring Boot 使用@Scheduled定时器任务

摘要: Spring Boot之使用@Scheduled定时器任务 假设我们已经搭建好了一个基于Spring Boot项目,首先我们要在Application中设置启用定时任务功能@EnableScheduling。 启动定时任务 package com.scheduling; import org.springframework.boot.Spring...

weixin_30376163的博客 123

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SpringBoot 之 @Scheduled 定时器规则

原文:https://maiyikai.github.io/2019/12/27/1577427502 项目中,或多或少都会使用到定时器,定时执行某些特殊得功能。而在 SpringBoot 项目中,使用得定时器功能就是使用 @Scheduled 注解。 当然,定时器功能打开了,但是没有定时,这是不可行的。所以,在定时器使用中,使用 Cron 表达式作为定时器规则,在 @Scheduled 注解源码...

Flying fish的博客 3945

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

上一篇: mysql——搭建MGR集群
下一篇: jdk17——十六进制转换工具类HexFormat
FlyLikeButterfly
博客等级 码龄9年 223粉丝 209原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值