iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >使用springboot时,解决@Scheduled定时器遇到的问题
  • 510
分享到

使用springboot时,解决@Scheduled定时器遇到的问题

2024-04-02 19:04:59 510人浏览 薄情痞子

Python 官方文档:入门教程 => 点击学习

摘要

目录@Scheduled定时器遇到的问题下面说一下@Scheduled 注解的几个参数一、可以通过配置文件配置进来的二、不可通过配置文件配置的 (作用相同)定时任务@Schedule

@Scheduled定时器遇到的问题

@Scheduled 这个注解确实给我们带了很大的方便,我们只要加上该注解,并且根据需求设置好就可以使用定时任务了。

但是,我们需要注意的是,@Scheduled 并不一定一定会按时执行。

因为使用@Scheduled 的定时任务虽然是异步执行的,但是,不同的定时任务之间并不是并行的!!!!!!!!

在其中一个定时任务没有执行完之前,其他的定时任务即使是到了执行时间,也是不会执行的,它们会进行排队。

也就是如果你想你不同的定时任务互不影响,到时间就会执行,那么你最好将你的定时任务方法自己搞成异步方法,这样,

定时任务其实就相当于调用了一个线程执行任务,一瞬间就结束了。当然,也可以勉强当做是任务都会定时执行。

下面说一下@Scheduled 注解的几个参数

一、可以通过配置文件配置进来的

使用表达式,该表达式表示每一秒中执行一次。如果上一次方法超过了定时时间还没有执行完,那么下一次定时不会执行,

直到上次方法执行完后,就会立即执行下一次的定时任务

该方式在工程启动的时候,并不会立即执行,会按照定时表达式的规律进行执行。例如这里,就是1秒后才会执行。


@Scheduled(cron="0/1 * * * * ?")   

使用固定速率。该表达式表示每隔一秒钟执行一次。如果上一次方法超过了1秒钟还没执行完,下一次任务也不会执行,直到

上次方法执行完,下次的定时就会立即执行。

该方式在工程启动的时候,会立即执行,接下来会按规律进行执行。


@Scheduled(fixedRateString="1000")   // 单位:毫秒

该方式和上一个的不同在于多加了一个参数,这个参数是一个初始化参数。

加上initialDelayString后,在刚启动的时候,就不会立即执行了,而是会等到10秒之后才会执行,即使fixedRateString才

1秒钟。也会在10秒后才会第一次执行。

注意:initialDelayString不能喝cron组合使用。


@Scheduled(fixedRateString="1000",initialDelayString="10000")

使用固定延迟。该表达式表示每次执行完后一秒再次执行。每一次执行,无论执行多长时间,下一次执行都会在上一次方法

执行完后,再过一秒钟,再次执行。

该方式在工程启动的时候,会立即执行,接下来会按规律进行执行。


@Scheduled(fixedDelayString="1000")

二、不可通过配置文件配置的 (作用相同)


   @Scheduled(fixedRate=1000)      // 它们都是接受一个long类型的参数
   @Scheduled(fixedDelay=1000)
   @Scheduled(fixedRate=1000,initialDelay=10000)

这里粘贴一下cron表达式的规则:

字段 允许值 允许的特殊字符
0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W C
月份 1-12 或者 JAN-DEC , - * /
星期 1-7 或者 SUN-SAT , - * ? / L C #
年(可选) 留空, 1970-2099 , - * /

定时任务@Scheduled使用的那些坑

@Scheduled是spring自带的注解,默认是单线程,常用作定时任务使用,但是如果是集群版的机器的话,就考虑加上分布式或者使用分布式定时任务代替。

一、使用的那些坑?

1.单线程

因为@Scheduled默认使用的是单线程,如果有两个任务A和B,那么任务A要是阻塞了,任务B就无法执行。

2.@Async和@EnableAsync

为了解决单线程带来的线程阻塞问题,我们可以使用@Async和@EnableAsync两个注解采用异步的方式去处理,这样就是不同的线程去执行,但是这种方式也带来一个新的问题,那就是如果任务A的任务执行时间>任务调度周期时间的话,就会发生上一个任务未执行完毕,下一个任务又开始执行的逻辑,这种也是有风险的。所以最好使用多线程方式,自己控制线程池的数量,线程名称等。

二、使用多线程

需要实现SchedulinGConfigurer接口,然后自定义线程池,这样凡是用到@Scheduled注解的都可以用该线程池,同时也解决了上述比较坑的两个问题。


@Configuration
@EnableScheduling
public class ScheduleConfig implements SchedulingConfigurer {
    @Override
    public void configureTasks(ScheduledTaskReGIStrar taskRegistrar) {
        taskRegistrar.setScheduler(taskExecutor());
    }
    @Bean
    public Executor taskExecutor() {
        return Executors.newScheduledThreadPool(20, (Runnable r) -> {
            Thread thread = new Thread(r);
            thread.setName("自定义线程名称");
            return thread;
        });
    }
}

以上这一行


thread.setName(“自定义线程名称”);

是设置线程名称,可以通过Thread.currentThread().getName()拿到该名称,便于在日志中进行排查问题。

小结一下

集群版本如果要使用@Scheduled的话,需要加分布式锁来控制,或者直接用分布式定时任务Elasticjob或者xxl-job等。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 使用springboot时,解决@Scheduled定时器遇到的问题

本文链接: https://www.lsjlt.com/news/156113.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用springboot时,解决@Scheduled定时器遇到的问题
    目录@Scheduled定时器遇到的问题下面说一下@Scheduled 注解的几个参数一、可以通过配置文件配置进来的二、不可通过配置文件配置的 (作用相同)定时任务@Schedule...
    99+
    2024-04-02
  • SpringBoot @PathVariable使用时遇到的问题及解决
    目录@PathVariable使用时遇到的问题第一个问题解决办法第二个问题解决办法@PathVariable 404问题@PathVariable使用时遇到的问题 第一个问题 接口:...
    99+
    2024-04-02
  • springboot使用定时器@Scheduled不管用的解决
    目录使用定时器@Scheduled不管用多个@Scheduled定时器不执行解决方法使用定时器@Scheduled不管用 如果是一开始就不能用就是没写@EnableSchedulin...
    99+
    2024-04-02
  • springboot使用定时器@Scheduled不管用的解决方法
    springboot使用定时器@Scheduled不管用的解决方法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。使用定时器@Scheduled不管用如果是一开始就不能用就是...
    99+
    2023-06-22
  • 如何解决使用openpyxl时遇到的问题
    本篇内容主要讲解“如何解决使用openpyxl时遇到的问题”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何解决使用openpyxl时遇到的问题”吧!最近在用python处理Excel表格是遇到...
    99+
    2023-06-14
  • SpringBoot定时任务会遇到什么问题
    这篇文章主要为大家展示了“SpringBoot定时任务会遇到什么问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“SpringBoot定时任务会遇到什么问题”这篇文章吧。前言springboot...
    99+
    2023-05-30
    spring boot
  • 使用nodeAPI时遇到过异步问题解决
    目录问题总结问题 闲逛技术群时常常看到群友遇到异步问题, 这里就最近看到的问题做个解答: 问题大致是这样: 下面这段代码, 是希望输出456的, 但实际上却输出了[], 因为rea...
    99+
    2023-01-28
    nodeAPI异步问题 nodeAPI 异步
  • springboot定时任务@Scheduled执行多次的问题
    目录springboot定时任务@Scheduled执行多次原因解决方法使用 @Scheduled 定时任务突然不执行了springboot定时任务@Scheduled执行多次 在s...
    99+
    2024-04-02
  • Java定时器 @Scheduled注解的使用
    1.定时器@Scheduled简介 @Scheduled注解可以用于做定时任务,再方法上加上@Scheduled注解,可以将这个方法定义为一个任务发放,可以搭配cron表达式进行任务的控制。 开启定时...
    99+
    2023-09-01
    java
  • SpringBoot中定时任务@Scheduled注解的使用解读
    目录概述注解定义参数说明源码解析使用详解定时任务同步/异步执行fixedRate/fixedDelay区别项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled...
    99+
    2024-04-02
  • 解决SpringBoot中使用@Transactional注解遇到的问题
    目录使用@Transactional注解遇到的问题1、不建议在接口上添加@Transactional注解2、@Transactional注解3、默认情况下4、数据库引擎需要支持事务管...
    99+
    2024-04-02
  • Java轮询锁使用时遇到的问题怎么解决
    这篇文章主要介绍了Java轮询锁使用时遇到的问题怎么解决的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Java轮询锁使用时遇到的问题怎么解决文章都会有所收获,下面我们一起来看看吧。问题演示当我们没有使用轮询锁之...
    99+
    2023-06-30
  • 同时使用swiper和echarts遇到的问题如何解决
    今天小编给大家分享一下同时使用swiper和echarts遇到的问题如何解决的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。项...
    99+
    2023-07-06
  • 使用nodeAPI时遇到过异步问题如何解决
    这篇文章主要讲解了“使用nodeAPI时遇到过异步问题如何解决”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“使用nodeAPI时遇到过异步问题如何解决”吧!问题闲逛技术群时常常看到群友遇到异...
    99+
    2023-07-05
  • Java 轮询锁使用时遇到问题解决方案
    目录问题演示简易版轮询锁问题1:死循环反例优化版问题2:线程饿死反例优化版总结前言: 当我们遇到死锁之后,除了可以手动重启程序解决之外,还可以考虑使用顺序锁和轮询锁,这部分的内容可以...
    99+
    2024-04-02
  • 使用JSON.stringify时遇到的循环引用问题怎么解决
    这篇文章给大家分享的是有关使用JSON.stringify时遇到的循环引用问题怎么解决的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。程序员在日常做TypeScript/JavaScript开发时,经常需要将复杂的...
    99+
    2023-06-14
  • 如何解决使用canvas绘图时遇到的跨域问题
    这篇文章主要介绍了如何解决使用canvas绘图时遇到的跨域问题,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。当在canvas中绘制一张外链图片时,我们会遇到一个跨域问题。示例...
    99+
    2023-06-09
  • spring定时器定时任务到时间未执行问题的解决
    目录spring定时器定时任务到时间未执行应用场景原因分析解决方式解决修改系统时间后Spring 定时任务不执行问题描述起因错误解决问题spring定时器定时任务到时间未执行 应用场...
    99+
    2024-04-02
  • Pycharm使用爬虫时遇到etree红线问题及解决
    目录使用爬虫时遇到etree红线问题1.首先解释一下该问题的原因2.没有红线了,完美解决lxml和etree标红线问题解决方法使用爬虫时遇到etree红线问题 1.首先解释一下该问题...
    99+
    2024-04-02
  • 解决使用openpyxl时遇到的坑
    最近在用python处理Excel表格是遇到了一些问题 1, xlwt最多只能写入65536行数据, 所以在处理大批量数据的时候没法使用 2, openpyxl 这个库, 在使用的时...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作