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

一、背景与概述

在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日

相关文章

  • MySQL中的联合索引学习教程

    MySQL中的联合索引学习教程 什么是联合索引? 在MySQL中,每个表都可以有一个或多个索引,索引是提高查询效率的重要手段之一。联合索引即是将多个字段(列)组合起来创建一个索引,这个索引将会按照多个列的值来排序和查找记录。 联合索引的优点 和单列索引相比,联合索引的查询效率更高。当查询条件中包含了联合索引中的多个列,MySQL可以直接使用该联合索引进行查询…

    database 2023年5月22日
    00
  • 如何使用Python实现数据库中数据的批量删除?

    以下是使用Python实现数据库中数据的批量删除的完整攻略。 数据库中数据的批量删除简介 在数据库中,批量删除是一次性删除多条记录。在Python中,可以使用pymysql连接MySQL数据库,并使用DELETE语句实现批量删除。 步骤1:连接数据库 在Python中,可以使用pymysql连接MySQL数据库。以下是连接到MySQL的基本语法: impor…

    python 2023年5月12日
    00
  • DBMS中序列和非序列时间表的计算

    序列时间表和非序列时间表是DBMS中时间表的两种类型。序列时间表是按照时间的先后顺序进行排列的表格,可以通过时间戳或时间列进行排序。非序列时间表不具有时间先后的关系,可以按照任意顺序排列。以下是对这两种时间表的计算攻略的详细讲解: 计算序列时间表 1. 计算时间间隔 计算序列时间表的第一步是计算时间间隔。时间间隔表示相邻时间戳之间的时间差。常见的时间间隔单位…

    database 2023年3月27日
    00
  • 详解MySQL数据库优化的八种方式(经典必看)

    以下是详解MySQL数据库优化的八种方式(经典必看)的完整攻略: 1. 优化查询语句 在编写查询语句时,应该尽量避免全表扫描,使用索引来优化查询速度。同时,应该尽可能使用WHERE子句来过滤不必要的数据。需要注意的是,如果WHERE子句中使用了函数或者运算符,可能会导致索引失效,从而导致查询变慢。 示例1:假设我们有一个用户表user,其中有一个name字段…

    database 2023年5月19日
    00
  • tp5(thinkPHP5)框架连接数据库的方法示例

    下面是关于tp5框架连接数据库的方法示例的详细攻略: 1. 确定数据库配置 首先,在使用tp5框架连接数据库之前,需要确定你的数据库配置,主要包括以下几个方面: 数据库名称 数据库用户名 数据库密码 数据库主机地址(一般为localhost) 2. 编辑数据库配置文件 tp5框架中,已经为我们准备好了默认的数据库配置文件database.php,路径在 ap…

    database 2023年5月22日
    00
  • MySQL备份与恢复之冷备(1)

    MySQL备份与恢复之冷备(1)完整攻略 在MySQL数据库的日常运维过程中,备份是一个至关重要的环节。备份包括热备和冷备两种方式,热备通常是指在线实时备份,不影响应用的正常使用;而冷备则是指在关闭数据库时进行备份,通常在数据量较大时,在非业务高峰期执行。 冷备的原理和优势 冷备的原理是关闭数据库实例后,将数据库的数据进行备份。这个过程需要停用数据库服务,可…

    database 2023年5月21日
    00
  • Redis中统计各种数据大小的方法

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/125.html?1455853369如果 MySQL 数据库比较大的话,我们很容易就能查出是哪些表占用的空间;不过如果 Redis 内存比较大的话,我们就不太容易查出是哪些(种)键占用的空间了。 有一些工具能够提供必要的帮助,比如 r…

    Redis 2023年4月13日
    00
  • C#操作数据库总结(vs2005+sql2005)

    C#操作数据库总结(vs2005+sql2005) 数据库连接 首先,需要引入 System.Data.SqlClient 命名空间,使用 SqlConnection 类来表示数据库连接。 建议使用 using 语句块来确保连接被正确释放: using System.Data.SqlClient; // … string connectionString…

    database 2023年5月21日
    00
合作推广
合作推广
分享本页
返回顶部