排查定时任务为什么不执行

彻底弄懂Spring Schedule加载和执行流程 Spring Scheduled Spring定时任务源码分析 入口,启用定时任务注解 @EnableScheduling @Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME) @Import(SchedulingConfiguration.class) @Documented public @interface EnableScheduling { } org.springframework.scheduling.annotat 阅读详情

首先看源码注释

/**
 * Annotation that marks a method to be scheduled. Exactly one of the
 * {@link #cron}, {@link #fixedDelay}, or {@link #fixedRate} attributes must be
 * specified.
 * 
 * 将一个方法标记为定时任务的注解。必须明确地指定cron,fixedDelay或fixedRate属性
 * 
 * 
 * <p>The annotated method must expect no arguments. It will typically have
 * a {@code void} return type; if not, the returned value will be ignored
 * when called through the scheduler.
 *
 * 带注解的方法不能有参数。返回值类型必须是void;否则,调度器调用时会忽略返回值。
 *
 *
 * <p>Processing of {@code @Scheduled} annotations is performed by
 * registering a {@link ScheduledAnnotationBeanPostProcessor}. This can be
 * done manually or, more conveniently, through the {@code <task:annotation-driven/>}
 * element or @{@link EnableScheduling} annotation.
 *
 * 通过注册到ScheduledAnnotationBeanPostProcessor后处理bean中来执行注解标注的程序。可以手动将定时任务注册到ScheduledAnnotationBeanPostProcessor后处理bean中,或者通过<task:annotation-driven/>标签和@EnableScheduling注解。
 *
 *
 * <p>This annotation may be used as a <em>meta-annotation</em> to create custom
 * <em>composed annotations</em> with attribute overrides.
 *
 * 看不懂(可以作为元注解创建自定义注解?)
 *
 *
 * @author Mark Fisher
 * @author Juergen Hoeller
 * @author Dave Syer
 * @author Chris Beams
 * @since 3.0
 * @see EnableScheduling
 * @see ScheduledAnnotationBeanPostProcessor
 * @see Schedules
 */

注释里说@Scheduled注解的方法被注册到ScheduledAnnotationBeanPostProcessor后处理Bean里面了,来看看ScheduledAnnotationBeanPostProcessor源码

public class ScheduledAnnotationBeanPostProcessor
		implements ScheduledTaskHolder, MergedBeanDefinitionPostProcessor, DestructionAwareBeanPostProcessor,
		Ordered, EmbeddedValueResolverAware, BeanNameAware, BeanFactoryAware, ApplicationContextAware,
		SmartInitializingSingleton, ApplicationListener<ContextRefreshedEvent>, DisposableBean {



	/**
	 * The default name of the {@link TaskScheduler} bean to pick up: {@value}.
	 * <p>Note that the initial lookup happens by type; this is just the fallback
	 * in case of multiple scheduler beans found in the context.
	 * @since 4.2
	 */
	public static final String DEFAULT_TASK_SCHEDULER_BEAN_NAME = "taskScheduler";


	private final ScheduledTaskRegistrar registrar;

	@Nullable
	private Object scheduler;

	/**
	 * Create a default {@code ScheduledAnnotationBeanPostProcessor}.
	 */
	public ScheduledAnnotationBeanPostProcessor() {
		this.registrar = new ScheduledTaskRegistrar();
	}

	/**
	 * Create a {@code ScheduledAnnotationBeanPostProcessor} delegating to the
	 * specified {@link ScheduledTaskRegistrar}.
	 * @param registrar the ScheduledTaskRegistrar to register @Scheduled tasks on
	 * @since 5.1
	 */
	public ScheduledAnnotationBeanPostProcessor(ScheduledTaskRegistrar registrar) {
		Assert.notNull(registrar, "ScheduledTaskRegistrar is required");
		this.registrar = registrar;
	}


	/**
	 * Set the {@link org.springframework.scheduling.TaskScheduler} that will invoke
	 * the scheduled methods, or a {@link java.util.concurrent.ScheduledExecutorService}
	 * to be wrapped as a TaskScheduler.
	 * 
	 * 设置被调用的方法为TaskScheduler,或将ScheduledExecutorService包装成TaskScheduler。
	 * 
	 * 
	 * <p>If not specified, default scheduler resolution will apply: searching for a
	 * unique {@link TaskScheduler} bean in the context, or for a {@link TaskScheduler}
	 * bean named "taskScheduler" otherwise; the same lookup will also be performed for
	 * a {@link ScheduledExecutorService} bean. If neither of the two is resolvable,
	 * a local single-threaded default scheduler will be created within the registrar.
	 * @see #DEFAULT_TASK_SCHEDULER_BEAN_NAME
	 * 
	 * 设置被调用的方法为TaskScheduler,或将ScheduledExecutorService包装成TaskScheduler。
	 * 如果没有指定,将使用以下两个默认方案:
	 * 一、在容器里查找唯一的TaskScheduler实例。
	 * 二、在容器里查找名字是taskScheduler的实例。
	 * 如果两个方案都无法解析,将会创建一个单线程默认调度器。
	 * 
	 * ???
	 * 
	 */
	public void setScheduler(Object scheduler) {
		this.scheduler = scheduler;
	}
}

意味着, 如果不配置TaskScheduler, SpringBoot会默认使用一个单线程的scheduler来处理@Scheduled注解标注的定时任务。

发现项目中有一个定时任务延迟6秒启动,然后死循环。(@Scheduled注解各参数详解)

    /**
     * 延迟60秒继续执行,异步执行;
     */
    @Scheduled(fixedDelay = 6000)
    public void run() {
        log.info("init zk register");

        while (true) {

            log.info("do something...");

            Thread.sleep(5000);
        }
    }

由此断定是因为线程池里唯一的线程被死循环占用了。

解决方案:

一:注册zk的线程修改为5秒执行一次的定时任务,不睡眠。

    /**
     * 延迟60秒继续执行,异步执行;
     */
    @Scheduled(cron = "0/5 * * * * ?")
    public void run() {

        log.info("init zk register");

        log.info("do something...");

    }

二:主动配置TaskScheduler,指定线程池线程数量。

package com.soyoung.ztdata.dataservice.config;

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

/**
 * @program: zt_service
 * @description:
 * @author: Leon
 * @create: 2021-06-04 22:07
 **/
@Configuration
public class SoYongSchedulingConfiguration implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
        threadPoolTaskScheduler.setPoolSize(2);
        threadPoolTaskScheduler.initialize();
        taskRegistrar.setScheduler(threadPoolTaskScheduler);
    }
}

三:修改配置文件,指定定时任务线程池线程数量。

spring.task.scheduling.pool.size=2

 

Crontab踩坑实录:为什么你的定时任务总是不执行?8个常见错误排查指南 本文深入剖析Crontab定时任务不执行的8个常见问题,包括环境变量缺失、路径错误、权限不足等,提供详细的排查指南和解决方案。特别针对Linux系统中的crontab配置陷阱,帮助开发者高效调试定时任务,确保自动化脚本稳定运行。 阅读详情

相关推荐

Spring Boot 定时任务 @Scheduled 不执行?可能是这些原因

Spring Boot中@Scheduled定时任务不执行的常见原因及解决方法:1)未添加@EnableScheduling启用定时任务;2)任务类未被Spring管理(缺少@Component等注解);3)定时方法非public修饰;4)默认单线程池导致任务阻塞(需配置多线程池);5)Cron表达式错误或系统时区问题;6)应用关闭时任务中断(需配置优雅关闭)。通过检查配置、线程池、方法可见性等关键点,可快速定位问题并确保定时任务稳定运行。

专栏 2225

spring 定时任务@Scheduled原理解析

https://zhuanlan.zhihu.com/p/92768652 官网API定义: An annotation that marks a method to be scheduled. Exactly one of thecron(),fixedDelay(), orfixedRate()attributes must be specified. The annotated method must expect no arguments. It will typically have a

yygr的博客 3564

一次XxlJob调度任务重复执行的问题排查

Xxl-Job重复执行任务的排查

zhanghailang1的博客 8754

Spring定时任务使用线程池及源码探索

spring定时任务及源码解析

ariesandx的博客 3014

C#源码之FluentScheduler定时器

项目中经常需要定时任务(每几分钟、几秒、几小时等执行一次或每天的什么时间点执行一次等等),最简单的就是用Timer或Thread自己写一个,但是自己写的性能等各方面有可能不健全等等。FluentScheduler定时任务库,通过nuget引用,它提供了一个类库,提供任务调度的基本功能,可以设置各种事件间隔,超级方便简单。

别再瞎调了!STM32 Systick延时函数避坑指南(正点原子、野火、慧净代码对比)

本文深入解析STM32 Systick延时函数的实现差异与优化策略,对比正点原子、野火、慧净等主流方案的优缺点。针对us和ms级延时精度问题,提供避坑指南和高级优化技巧,帮助开发者根据项目需求选择最佳方案,提升嵌入式系统的定时控制精度。

weixin_28717807的博客 339

Spring Scheduled 定时任务没有准时执行

Spring Scheduled 定时任务没有准时执行

qq_41056506的博客 5146

别再死记公式了!用HFSS/CST手把手教你仿真一个2.4GHz WiFi的PIFA天线(附参数调试技巧)

本文详细介绍了使用HFSS和CST仿真软件设计2.4GHz WiFi PIFA天线的全流程,包括建模准备、分步操作指南和参数调试技巧。通过可视化结果和实战案例,帮助工程师快速掌握天线设计的关键参数优化方法,提升辐射性能和工作效率。

weixin_31682031的博客 331

定时任务报错Encountered invalid @Scheduled method ‘...‘: Exactly one of the ‘cron‘, ‘fixedDelay

今天在搞定时任务,突然报了这个问题,发现是在使用@Scheduled这个注解时,忘记设置参数了,比如配置一个默认的延期时间fixedDelay 这里的fixedDelay单位是毫秒,写个3000就是代表着3秒执行一次! @Scheduled(fixedDelay = 3000) public void produceMsgScheduled(){ jmsMessagingTemplate.convertAndSend(queue,"*****Scheduled"+ UUID.ra

weixin_45369440的博客 7192

阿里云百炼接入本地Claude,接入idea

阿里云百炼平台提供两种接入方式:未购买套餐时使用通用API Key(sk-xxxxx),需注意免费额度独立计算且不会自动切换模型;购买Coding Plan套餐后使用专属API Key(sk-sp-xxxxx),享受固定月费无超支风险。配置需在.claude/settings.json中设置认证信息,包括API Key和Base URL。建议开启"用完即停"功能避免意外扣费,不同模型的免费额度互不影响。购买套餐后还可通过IDEA插件Claude Code进行集成,实现固定费用下的稳定使用

fengtangjiang的博客 1355

STM32CubeMX实战:TIM定时器中断配置避坑指南(附100ms精准定时代码)

本文深入解析STM32CubeMX配置TIM定时器中断的常见误区与避坑技巧,重点阐述时钟源、预分频器与自动重装载值的精准计算方法。通过实战案例,提供一份可直接复用的100ms精准定时中断代码模板,并分享调试验证方法,帮助开发者构建稳定可靠的嵌入式系统心跳。

grafana8visual的博客 499

Linux定时任务避坑指南:为什么你的crontab脚本总是不执行?(附Ubuntu/Debian排查命令)

本文深入解析Linux定时任务crontab常见故障原因,包括环境变量隔离、权限问题及日志分析等,提供Ubuntu/Debian系统下的完整排查方案。通过对比PATH差异、检查文件权限和解读系统日志,帮助用户快速定位并解决crontab脚本不执行的问题。

weixin_30908941的博客 573

若依框架集成saToken

若依版本3.8.8,鉴权采用security框架,这种框架太重,项目中想实现对外提供接口功能。尽快减少修改原框架的逻辑基础上,采用satoken实现。

sccd2009的专栏 1482

Linux定时任务不执行排查方法

实现linux定时任务有:cron、anacron、at等,但平常工作中接触到的是cron服务。cron是服务名称,crond是后台进程,crontab则是定制好的计划任务表。项目中经常用到定时任务实现某些功能,最近遇到定时任务不执行的情况,由于之前对这个不太了解,费时费力,最后总算找到问题所在。因此想跟大家分享一下排查方法,以后少走弯路。 查看crond服务是否运行: 通过命令pgrep crond或/sbin/service crond status可查看到crond的进程pid,可以确定c

sinat_38089032的博客 7448

Mixly米思齐——超声波测距控制LED灯

为了更加地贴近中小学信息技术的课程,我们用米思齐做了一个实验——根据距离的远近开启警报灯(利用超声波测出距离)。 实验硬件准备 arduino uno R3 、USB 数据线、YFROBOT UNO I/O扩展板、YFROBOT超声波传感器模块、模块3P连接线x1、LED灯x1 硬件连接图如下: 在arduino uno R3 上再接一个LED灯,实物图如下: 在本次实验中,LE...

Janise_的博客 9975

Python3+PCAN-USB基于PCAN-Basic二次开发实现上位机功能

一、环境搭建 1.概述 本文主要是通过Python3与CAN总线工具PCAN-USB基于官方PCAN-Basic库实现CAN总线消息读写功能。 2.PCANBasic.py和PCANBasic.dll下载地址 https://www.peak-system.com/fileadmin/media/files/pcan-basic.zip 3.Python安装 下载地址:https://www.p...

测试领域技术分享 5181

crontab定时任务不执行原因排查

如果问题依然无法解决,尝试创建一个简单的测试脚本,比如一个只打印当前时间的脚本,来验证cron是否能够正确执行基本任务。可以用如下脚本一分钟执行一次,查看结果很快,也很好验证。如果你以为这是同一个python3,反正都能运行就错了,因为pip list不一样,其中一个没安装各种模块,刚运行就退出,连日志都没有。- 确保脚本运行所需的所有依赖都已正确安装,并且cron用户有权限访问这些依赖,例如python多个版本。Crontab定时任务不执行可能有多种原因。但我后面发现还有另一个python。

weixin_61092302的博客 4567

一文探讨视频秒开:m3u8视频格式与视频秒开优化

秒开指的是,一秒内成功加载的播放数/播放总数。本意是想对比一下m3u8与mp4视频格式,并了解m3u8格式优缺点,以确定一个大概优化方向。但对m3u8做简单了解后,觉的m3u8可能是一个优化方向。

bjxiaxueliang的CODING小栈 2万+

spring quartz 部分定时任务不执行问题定位修复方案

Quartz部分定时任务不执行问题分析过程及修复方案 背景: 2021年1月7号上线迁移需求之后,出现最为明显的 众帮文件上传 其他部分定时任务也不执行的情况 执行时间并没有按照约定时间去执行 分析1 怀疑是代码问题? 对众帮文件上传定时任务代码进行排查 并无发现编码问题,并且对1月7号上的版本 和上一个版本进行代码比对 并未发现对众邦的代码有所改动的地方 分析2 OPS定时任务框架 spring quartz 内部任务存储 调度问题? Quartz 是基于RAMJobStore调度中心去调度的,

qq_28691587的博客 3万+

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

quartz定时任务突然不执行了

高并发情况下,quartz定时任务突然不执行了, 背景: 整个项目架构,高并发操作比较多, 有多个线程池,周期线程池,和定时任务,占用多个资源 导致现场出现定时任务走一段时间就不走的情况 当前定时任务配置的是单线程(concurrent 属性值false) 排查过程: 利用Java VisualVM (windows操作系统) 查看现场线程日志和堆日志,没结果 线程数没有达到中间件配置的顶峰,应...

s_ohygvhj的博客 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

@scheduled每分钟执行一次_为什么我的crontab定时任务不执行?详解crontab命令

linux系统提供at和crontab两个命令来执行定时任务,at主要针对一次性的定时任务,crontab则执行周期性的定时任务。在linux运维中使用较多的还是cronjob,当安装完linux系统后,linux会自动启动crond进程,这是周期性任务的守护进 程,用于检查是否有需要执行的定时任务。crontab命令常用参数:crontab file [-u user] -用指定的文件替代目前的...

weixin_35501172的博客 1649

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

crontab定时任务不执行的一些原因总结

这篇文章主要给大家总结介绍了关于crontab定时任务不执行的一些原因,对每种可能发生的原因都给出了解决方法,对遇到这个问题的朋友们具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 前言 最近在工作中遇到了一些问题,crontab定时任务居然不执行,后来我在网上找的时候发现网上主要说了这5个原因: 1 crond服务未启动 crontab不是Linux内核的功能,而是依赖一个crond服务,这个服务可以启动当然也可以停止。如果停止了就无法执行任何定时任务了,解决的方法是打...

firstcode666的博客 1万+

CentOS crontab 定时任务不执行的常见解决方法

crontab 配置文件 SHELL=/bin/bash PATH=/sbin:/bin:/usr/sbin:/usr/bin MAILTO=root HOME=/ # .—————- minute (0 – 59)  # |  .————- hour (0 – 23) # |  |  .———- day of month (1 – 31) # |  |  |  .——-

Brad_Chen Focus on Linux. 7万+

Spring定时任务不执行?深度排查指南与解决方案

通过本文的系统化排查方法,可以解决95%以上的定时任务执行问题。三层验证:配置→表达式→环境两项防护:异常处理+任务防重一套监控:指标采集+日志追踪对于复杂场景,建议结合Arthas等诊断工具进行运行时分析,或考虑使用Quartz等更强大的调度框架。

Uzumaki_Naruto12的博客 1309

CentOS7环境下定时任务执行不成功的排查

CentOS7环境下crontab定时任务不生效排查

haiqinma的专栏 2597

ORACLE创建定时任务及定时任务不执行的原因

1、首先创建一张表 该表用来执行插入数据。 create table getSysDate(test date); 2、创建存储过程以插入数据。 create or replace procedure insertSysDate as begin insert into getSysDate values (sysdate); end ; 3、创建job设置定时 declare jo...

戳一下有机会获得一份额外加个蛋的蛋炒饭 6403
上一篇: 55 Read Committed隔离级别是如何基于ReadView机制实现的?
下一篇: spring-retry
limeOracle
博客等级 码龄10年 11粉丝 566原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值