关于@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服务器查询慢的原因分析与解决方法。 原因分析 MySQL服务器查询慢的原因可能有多种,下面列举几种常见的情况。 1. 查询语句不优化 如果在编写查询语句时,没有正确的使用SQL语句优化技巧,也就是没有使…

    database 2023年5月19日
    00
  • PHP7.0版本备注

    PHP 7.0版本备注-完整攻略 如果你正在使用PHP 7.0版本,你可能需要了解这里介绍的一些备注,以便更好地使用和理解这个版本。 1. 前言 PHP 7.0是PHP编程语言的一个重大版本更新。它在性能、安全性和可用性方面都有所提高。但是,它也有一些变化,这些变化可能需要您适应和了解。这篇文章将介绍一些PHP 7.0版本的变化和备注。 2. 更新特性 以下…

    database 2023年5月21日
    00
  • PHP+sqlite数据库操作示例(创建/打开/插入/检索)

    下面是关于“PHP+sqlite数据库操作示例”的完整攻略。 1. 准备工作 在开始操作sqlite数据库之前,请确保已经安装PHP和sqlite扩展,并且已经配置好环境变量。同时还需要了解如何使用PHP对sqlite进行操作。 2. 创建/打开sqlite数据库 要在PHP中创建一个sqlite数据库,可以使用以下代码: $db = new SQLite3…

    database 2023年5月21日
    00
  • 详解腾讯云CentOS7.0使用yum安装mysql及使用遇到的问题

    详解腾讯云CentOS7.0使用yum安装mysql及使用遇到的问题 MySQL是一种常用的开源关系型数据库管理系统,具有稳定性、安全性等优点。在CentOS 7.0中,我们可以使用yum命令来快速安装MySQL。本文将详细介绍如何在腾讯云CentOS 7.0中使用yum安装MySQL,并阐述使用中可能遇到的问题及其解决方案。 安装MySQL 更新系统软件包…

    database 2023年5月22日
    00
  • Linux 解决Deepin无法在root用户启动Google Chrome浏览器的问题

    步骤1:通过Shell获取Deepin版本信息 在终端中执行以下命令,查看Deepin的版本信息。此处以Deepin V20为例。 cat /etc/deepin-version 输出如下: 20 (1000) unstable 2022-06-20 步骤2:安装Google Chrome浏览器 在浏览器中打开Google Chrome浏览器官网(https…

    database 2023年5月22日
    00
  • linux中kvm的安装及快照管理

    下面是详细讲解 “Linux中KVM的安装及快照管理” 的完整攻略: 安装KVM 确认CPU支持虚拟化技术 在Linux安装KVM之前,需要先检查CPU是否支持Intel VT-x或AMD-V虚拟化技术。可以执行以下命令检查: $ egrep -c ‘(svm|vmx)’ /proc/cpuinfo 如果返回的结果大于0,表示CPU支持虚拟化技术。 安装KV…

    database 2023年5月22日
    00
  • pymongo为mongodb数据库添加索引的方法

    添加索引是提高MongoDB数据库查询性能的一种有效方法,而Pymongo是Python语言操作MongoDB的工具库。下面介绍Pymongo为MongoDB添加索引的方法攻略。 1. 创建客户端连接 要使用Pymongo操作MongoDB,需要创建一个连接MongoDB的客户端。可以通过以下代码创建客户端连接: from pymongo import Mo…

    database 2023年5月22日
    00
  • 小练习-把MySQL数据库中的数据存入redis

    #pymysql、json、redis#1、连数据库,查到数据库里面所有的数据,游标类型要用pymysql.curosrs.DictCour#2、查到所有数据 [ {“id”:1,”passwd”:”49487dd4f94008a6110275e48ad09448″,”username”:”niuhayang”,”is_admin”:1}]#3、循环这个li…

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