关于@Scheduled不执行的原因分析

yizhihongxing

一、背景与概述

在Spring Boot中,一种常用的定时任务调度方式是使用@Scheduled注解。然而,在实际应用中,使用@Scheduled注解的定时任务可能会出现不执行的情况,导致定时任务无法按照预期执行。本文将探讨关于@Scheduled不执行的原因分析,以及如何避免出现不执行的情况。

二、原因分析

1.缺失@EnableScheduling注解

使用@Scheduled注解的定时任务需要在启动类上增加@EnableScheduling注解,否则定时任务将不会被执行。可以通过如下方式在启动类上增加@EnableScheduling注解:

@SpringBootApplication
@EnableScheduling  //增加此注解
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

2.线程池拒绝策略

Spring Boot执行使用@Scheduled注解的定时任务时会使用Spring自带的线程池ThreadPoolTaskScheduler。当线程池已满时,可能会出现执行的线程被拒绝的情况。可以通过设置线程池的拒绝策略来避免这种情况的出现。

默认情况下,ThreadPoolTaskScheduler的拒绝策略为AbortPolicy。该策略会在任务添加到线程池队列失败时抛出RejectedExecutionException异常,导致定时任务无法执行。可以通过设置下列属性来修改线程池的拒绝策略:

#在application.properties中增加以下配置
spring.task.scheduling.pool.rejected-policy=CALLER_RUNS

3.任务执行时间太长

如果定时任务的执行时间过长,有可能导致超出Spring默认的线程池大小,从而线程池拒绝执行该任务。可以通过对定时任务的优化来避免该情况的出现。

三、避免方法

1.确保添加了@EnableScheduling注解

在启动类上添加@EnableScheduling注解,以确保使用@Scheduled注解的定时任务能够被正常执行。

2.设置线程池拒绝策略

在application.properties中设置线程池的拒绝策略,以避免出现线程池拒绝执行该任务的情况。

3.优化定时任务执行时间

根据实际情况,尽量优化定时任务的执行时间,避免出现执行时间过长而无法执行的情况。

示例一:

@Component
public class MyTask {
    @Autowired
    private MyService myService;

    @Scheduled(cron = "0 0 1 * * ?")  //每天1点执行
    public void executeTask() {
        myService.doSomething();
    }
}

@Service
public class MyService {
    public void doSomething() {
        //执行一些操作
    }
}

在上述示例中,定时任务的执行时间与MyService执行的任务相关,如果执行时间过长,超出了Spring默认的线程池大小,就可能导致定时任务无法执行。可以对任务的执行逻辑进行优化,缩短执行时间。

示例二:

@Component
public class MyTask {
    @Scheduled(cron = "0 0 1 * * ?")  //每天1点执行
    public void executeTask() {
        try {
            Thread.sleep(100000);  //线程睡眠10秒
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,定时任务的执行时间过长,超出了Spring默认的线程池大小,就可能导致定时任务无法执行。可以通过设置线程池的拒绝策略来避免该情况的出现。可以在application.properties中设置线程池的拒绝策略为CALLER_RUNS。

四、结束语

在使用@Scheduled注解的定时任务时,需要注意避免出现不执行的问题。可以通过对原因进行分析,并采取相应的避免方法,来确保定时任务能够按照预期执行。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于@Scheduled不执行的原因分析 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • Redis+php-resque实现消息队列

      服务器硬件配置 Dell PowerEdge R310英特尔单路机架式服务器 Intel Xeon Processor X3430 2.4GHz, 8MB Cache 8GB内存(2 x 4GB), 1333MHz, 双列RDIMMs用1于处理器配置 2TB近线3.5英寸7.2K RPM 6Gbps SAS硬盘 – 非热插拔 SAS 6/iR 控制卡 8…

    Redis 2023年4月11日
    00
  • MySQL中explain语句的基本使用教程

    当我们在MySQL执行一条SQL语句的时候,可能会遇到很多问题。这时候我们可以使用EXPLAIN语句来分析我们的SQL语句在执行过程中的各种情况,帮助我们更好地理解SQL执行过程以及优化SQL效率。 什么是EXPLAIN语句 EXPLAIN语句是MySQL提供的一种工具,可以输出一个SQL语句在执行过程中所使用的索引、表的读取顺序、过滤条件以及 joins(…

    database 2023年5月22日
    00
  • Tomeat6.0 连接池数据库配置

    以下是详细讲解“Tomeat6.0 连接池数据库配置”的完整攻略: 1. 准备工作 在配置数据库连接池之前,必须先安装并配置好 Tomcat6.0 服务器,并且下载好并安装好数据库驱动程序。 2. 配置数据库连接池 在 Tomcat 的 conf 目录下,有一个名为 context.xml 的配置文件,这是 Tomcat 的上下文配置文件,其中定义了应用程序…

    database 2023年5月22日
    00
  • Docker部署搭建WebDav服务的详细过程

    下面就为您详细讲解Docker部署搭建WebDav服务的完整攻略。 Docker部署搭建WebDav服务攻略 1. 为什么要使用Docker 在介绍如何使用Docker搭建WebDav服务之前,我们需要知道Docker是什么以及它在WebDav部署中的优势。 Docker是一款轻量级的虚拟化容器技术,可以在不同的操作系统上运行,不必担心不同操作系统之间的差异…

    database 2023年5月18日
    00
  • python远程连接服务器MySQL数据库

    下面是详细的讲解: 准备工作 在服务器上安装并配置MySQL,确保能够正常连接和操作 安装Python,在本地电脑或服务器上都可,版本建议使用3.x 安装pymysql库 使用pip或conda命令进行安装:pip install pymysql 或 conda install pymysql 连接数据库 使用pymysql.connect()方法连接MyS…

    database 2023年5月22日
    00
  • DBMS中E-R模型和关系模型的区别

    DBMS中E-R模型和关系模型是两种不同的数据模型,下面我将详细讲解它们之间的区别。 E-R模型 定义 E-R模型全称是实体-关系模型,是一种描述实体之间关系的模型。在E-R模型中,实体通常映射为表(或称为关系),而实体之间的关系则映射为表之间的关系。 实例说明 比如,我们有两个实体:学生和课程。学生和课程之间有一个“选修”关系,即一个学生可以选修多个课程,…

    database 2023年3月27日
    00
  • 转 Swoole】用swoole简单实现MySQL连接池

    在传统的网站开发中,比如LNMP模式,由Nginx的master进程接收请求然后分给多个worker进程,每个worker进程再链接php-fpm的master进程,php-fpm再根据当前情况去调用其worker进程然后处理PHP,如果需要MySQL,在与MySQL建立连接,这个时候,如果有1000个请求打过来,就需要与MySQL建立1000个连接。如果请…

    2023年4月13日
    00
  • day02-Redis命令

    Redis命令 1.Redis数据结构介绍 Redis是一个key-value的数据库,key一般是String类型,value的类型多种多样,value常见的八种类型: Redis支持五种基本的数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set,有序集合)。 各个数据类型应用场景: 类型 简…

    2023年4月16日
    00
合作推广
合作推广
分享本页
返回顶部