Spring 中的定时任务

Cadence ADE实战:1GHz VCO相位噪声仿真全流程(附PSS/Pnoise避坑指南) 本文详细介绍了在Cadence ADE环境中对1GHz VCO进行相位噪声仿真的完整流程。重点剖析了PSS(周期性稳态分析)和Pnoise(周期性噪声分析)两大核心引擎的关键参数设置与避坑指南,帮助射频与模拟IC设计者准确评估VCO性能,解决仿真不收敛、结果异常等常见问题。 阅读详情

Spring 中使用定时任务

在 Spring 中使用定时任务非常容易,步骤如下:

  1. 第一步在启动类加上 @EnableScheduling 注解,开启对定时任务的支持。
package com.springboot.chapter13;

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

@SpringBootApplication
@EnableScheduling // 开启对定时任务的支持
public class Chapter13Application {
   
   

    public static void main(String[] args) {
   
   
        SpringApplication.run(Chapter13Application.class, args);
    }
}
  1. 第二步在方法上加上 @Scheduled 注解,并配置配置项,编写定时逻辑。
package com.springboot.chapter13.task;

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

@Service
public class MyTask {
   
   

    int num = 1;

	// 每隔 1s 执行一次
    @Scheduled(fixedRate = 1000)
    public void job1() {
   
   
        System.out.println("敲了 " + num + " 个 BUG!");
        num++;
    }
}

注意:别忘了在 MyTask 类标注 @Service 或 @Component 等注解,将我们创建的 MyTask 类注入到 Spring 容器中,这样 Spring 才会去执行定时任务。

  1. 启动项目,控制台打印信息如下:
    在这里插入图片描述

上述中 @Scheduled 只是按照时间间隔执行,有时候需要指定更为具体的时间,例如,每天晚上 11:00 开始任务,或者一些任务在每周日执行。为了能够更为精确地指定任务执行的时间,所以有必要更为细致地研究 @Scheduled 的配置项。

@Scheduled 注解源码

@Target({
   
   ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
   
   
    String CRON_DISABLED = "-";

    String cron() default "";

    String zone() default "";

    long fixedDelay() default -1L;

    String fixedDelayString() default "";

    long fixedRate() default -1L;

    String fixedRateString() default "";

    long initialDelay() default -1L;

    String initialDelayString() default "";
}

@Scheduled 的配置项

配置项 类型 描述
cron String 使用表达式的方式定义任务执行时间
zone String 可以通过它设定区域时间
fixedDelay long 表示从上一个任务完成开始到下一个任务开始的间隔,单位为毫秒
fixedDelayString String 与 fixedDelay 相同,只是使用字符串,这样可以使用 SpEL 来引入配置文件的配置
initialDelay long 在 Spring IoC 容器完成初始化后,首次任务执行延迟时间,单位为毫秒
initialDelayString String 与 initialDelay 相同,只是使用字符串,这样可以使用 SpEL 来引入配置文件的配置
fixedRate long 从上一个任务开始到下一个任务开始的间隔,单位为毫秒
fixedRateString String 与 fixedRate 相同,只是使用字符串,这样可以使用 SpEL 来引入配置文件的配置

上表中的配置项除了 cron 外都比较好理解,只有 cron 是可以通过表达式更为灵活地配置运行的方式。cron 有 6~7 个空格分隔的时间元素,按顺序依次是 “ 秒分时天月星期年 ”,其中年是一个可以不配置的元素,Spring 官方也给出了对应的图解,如下所示:
在这里插入图片描述
对 Spring 官网感兴趣的话,点击下方链接直达 Spring 定时任务模块。

https://docs.spring.io/spring-framework/docs/current/reference/html/integration.html#scheduling-cron-expression

小试牛刀:

  • 0 0 0 ? * WED

这个配置表示每个星期三中午 0 点整。这个表达式需要注意的是其中的特殊字符,如 ? 和 *,这里因为天和星期会产生定义上的冲突,所以往往会以通配符 ? 表示,它表示不指定值,而 * 则表示任意的月。除此以外还会有下表所示的其他通配符。

通配符含义

通配符 描述
* 表示任意值
? 不指定值,用于处理天和日期配置的冲突
- 指定时间区间
/ 指定时间间隔执行
L 最后的
# 第几个
, 列举多个项

cron 表达式举例

项目类型 描述
0 0 0 * * ? 每天 0 点整触发
0 15 23 ? * * 每天 23:15 触发
0 15 0 * * ? 每天 0:15 触发
0 15 10 * * ? 每天早上 10:15 触发
0 30 10 * * ? 2018 2018 年的每天早上 10:30 触发
0 * 23 * * ? 每天从 23 点开始到 23 点 59 分每分钟一次触发
0 0/3 23 * * ? 每天从 23 点开始到 23:59 分结束每 3 min 一次触发
0 0/3 20,23 * * ? 每天的 20 点至 20:59 和 23 点至 23:59 分两个时间段内每 3 min 一次触发
0 0-5 21 * * ? 每天 21:00 至 21:05 每分钟一次触发
0 10,44 14 ? 3 WED 3 月的每周三的 14:00 和 14:44 触发
0 0 23 ? * MON-FRI 每周一到周五的 23:00 触发
0 30 23 ? * 5L 2017-2020 2017 年至 2020 年的每月最后一个周五的 23:30 触发
0 15 22 ? * 5#3 每月第三周周五的 22:15 触发

小工具 -> 在线 Cron 表达式生成器:https://cron.qqe2.com

下面再通过两个实例来巩固对定时任务的理解,代码如下:

// Spring IoC 容器初始化后,第一次延迟 3 秒 , 每隔 1 秒执行一次
@Scheduled(initialDelay = 3000,fixedRate = 1000)
public void job2() {
   
   
    System.out.println("开始了!");
}

// 11:00 到 11:59 点每分钟执行一次
@Scheduled(cron = "0 * 11 * * ?")
public void job3() {
   
   
    System.out.println("睡着了没?");
}

定时任务原理

参考文章链接:https://blog.youkuaiyun.com/weixin_34452850/article/details/81127569

如上文所述,我们可以通过 @EnableScheduling 注解开启对定时任务的支持,所以我们先从 @EnableScheduling 注解开始说起。

@Target({
   
   ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Import({
   
   SchedulingConfiguration.class})
@Documented
public @interface EnableScheduling {
   
   
}

可以看到,@EnableScheduling 注解的主要功能就是通过 @Import 注解导入了 SchedulingConfiguration 配置类,@Import 注解是 Spring 提供的导入注解,可以将一个配置类或者普通的一个类初始化到 Spring 容器中,具体使用可以参考 https://blog.youkuaiyun.com/u010502101/article/details/78760032,这里不再赘述。现在我们来看 SchedulingConfiguration 配置类。

@Configuration
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public class SchedulingConfiguration {
   
   

	// 向 IOC 容器中注册一个 ScheduledAnnotationBeanPostProcessor 实例
	@Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	public ScheduledAnnotationBeanPostProces
MATLAB算法实战应用案例精讲-【数模应用】校准曲线(附MATLAB、python和R语言代码实现) 模型校准曲线(Calibration Curve),也称为可靠性曲线(Reliability Curve)或概率校准曲线(Probability Calibration Curve),是一种评估分类模型输出概率准确性的图形工具。它可以帮助我们理解模型的预测概率是否与实际标签的分布一致。校准曲线通常包括以下步骤:计算模型预测概率:对于测试集中的每个样本,模型会输出一个概率值,表示样本属于正类的概率。将数据分桶:将这些概率值分成若干个等宽的桶(例如10个桶),每个桶中的样本具有相似的预测概率。 阅读详情

相关推荐

NIDS——suricata(一)

NIDS——suricata环境安装和规则编写

weixin_58666006的博客 1273

uniapp map地图实现marker聚合点,并点击marker触发事件

【代码】uniapp map地图实现marker聚合点,并点击marker触发事件。

weixin_44705979的博客 5437

数字IC时序约束实战:深入解析clock_uncertainty的设置策略与后端影响

本文深入探讨数字IC设计中clock_uncertainty的设置策略及其对后端实现的影响。通过分析时钟不确定度的组成(包括clock_skew、clock_jitter和margin),并结合实际项目经验,详细介绍了在不同设计阶段(综合、布局布线、签核)的动态调整方法。文章还提供了工程化处理参数来源、跨时钟域特殊处理以及优化时序收敛的实用技巧,帮助工程师提升数字IC设计的可靠性和性能。

weixin_29284657的博客 229

AI代码标注专家Prompt指令的最佳实践

AI代码标注专家 Prompt 可作为项目级别提示词使用,专门负责为 AI 生成的代码添加特定的注释标记,然后基于 Node 脚本可以初步统计出 AI 代码占比。

💻 Code:TypeScript / Engineering 🤖 AI:Prompt Optimization / Context Memory / Coding Agents 615

【论文笔记】LIME: low-light image enhancement via illumination map estimation

【论文笔记】LIME: low-light image enhancement via illumination map estimation 一篇低光图像增强,引用超1000次的经典论文

weixin_45565519的博客 1794

[网络安全提高篇] 一一九.恶意软件动态分析经典沙箱Cape的安装和基础用法详解

这是作者网络安全自学教程系列,主要是关于安全工具和实践操作的在线笔记,特分享出来与博友们学习,希望您喜欢,一起进步。前文详细介绍恶意代码静态分析经典工具Capa的基础用法,以及批量提取静态特征和ATT&CK技战术,主要是从提取的静态特征Json文件中提取关键特征。这篇文章将详细讲解动态分析沙箱Cape,其是一个开源的自动恶意软件分析系统,通过自动运行和分析恶意软件,全面分析和提取恶意软件的关键特征。本文先介绍Cape沙箱的安装和基础用法,后续随着深入再分享。基础性文章,希望对您有帮助!

杨秀璋的专栏 1万+

NVIDIA Isaac Sim 入门教程(二)

Omniverse Isaac Sim 的工作空间非常容易自定义。调整用户界面的大小、停靠、取消停靠、添加和移除面板都非常容易。进入顶部菜单栏,单击下拉菜单最下方的窗口 > 视口 > 视口 2(现在工作区中应该会出现一个名为 "视口 2 "的新视口。如果您想创建更多的视口,请按照相机检查器扩展进行操作。单击并拖动视口 2 的顶部标题以激活停靠部件。拖放到原始视口的右侧,将两个视口并排放置。单击并向左拖动视口 2 的左侧,使视口大小相等。

机器人控制与仿真应用 6545

【ComfyUI】VideoRefusion 动态替换视频背景

本文介绍了一个基于ComfyUI的视频背景替换工作流,通过WanVAE和WanTextEncoder核心模型实现人物与背景的智能分离与替换。工作流包含9个关键流程阶段,涉及视频采样、图像增强等节点操作,可生成风格统一、动作自然的视频效果。该技术适用于虚拟人物创作、短视频特效、产品广告等场景,支持个性化定制开发。相关资源可参考文末提供的ComfyUI教程和AIGC工具平台开发指南。(149字)

Mr数据杨 2190

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: 被问到SqlSessionFactory和SqlSessionTemplate时,竟答不出来!
下一篇: JDK8日期API
程序曜
博客等级 码龄7年 9粉丝 14原创
评论 9
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值