Maison  >  Article  >  Java  >  Résoudre les problèmes rencontrés par les tâches planifiées Springboot

Résoudre les problèmes rencontrés par les tâches planifiées Springboot

不言
不言avant
2019-03-30 10:32:054689parcourir

Le contenu de cet article concerne la résolution des problèmes rencontrés par les tâches planifiées de Springboot. Il a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer.

Avant-propos : lors de l'utilisation de Springboot pour intégrer des tâches planifiées, j'ai constaté que lorsqu'une tâche planifiée prend trop de temps à s'exécuter, elle bloque l'exécution d'autres tâches planifiées.

Emplacement du problème

Après avoir vérifié la documentation de Springboot et imprimé les journaux (affichant les informations actuelles sur le thread), j'ai appris que le problème est dû au fait que Springboot n'utilise qu'un seul thread pour traiter les tâches planifiées par défaut.

Examen du problème

Il convient de noter que la version Springboot de l'exemple est 2.1.3.RELEASE.

Configuration du fichier pom clé

    <!--继承父项目-->
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    
    ...省略非关键配置
    
    <!-- 引入依赖-->
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Tâche planifiée

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 定时任务
 * @author RJH
 * create at 2019-03-29
 */
@Component
public class SimpleTask {

    private static Logger logger= LoggerFactory.getLogger(SimpleTask.class);

    /**
     * 执行会超时的任务,定时任务间隔为5000ms(等价于5s)
     */
    @Scheduled(fixedRate = 5000)
    public void overtimeTask(){
        try {
            logger.info("current run by overtimeTask");
            //休眠时间为执行间隔的2倍
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    /**
     * 正常的定时任务
     */
    @Scheduled(fixedRate = 5000)
    public void simpleTask(){
        logger.info("current run by simpleTask");
    }
}

Classe de démarrage

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableScheduling
public class TaskDemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(TaskDemoApplication.class, args);
    }

}

Résultat en cours d'exécution

...省略非关键信息
2019-03-29 21:22:38.410  INFO 59731 --- [   scheduling-1] com.rjh.task.SimpleTask                  : current run by simpleTask
2019-03-29 21:22:38.413  INFO 59731 --- [   scheduling-1] com.rjh.task.SimpleTask                  : current run by overtimeTask
2019-03-29 21:22:48.413  INFO 59731 --- [   scheduling-1] com.rjh.task.SimpleTask                  : current run by simpleTask
2019-03-29 21:22:48.414  INFO 59731 --- [   scheduling-1] com.rjh.task.SimpleTask                  : current run by overtimeTask
2019-03-29 21:22:58.418  INFO 59731 --- [   scheduling-1] com.rjh.task.SimpleTask                  : current run by simpleTask
2019-03-29 21:22:58.418  INFO 59731 --- [   scheduling-1] com.rjh.task.SimpleTask                  : current run by overtimeTask
2019-03-29 21:23:08.424  INFO 59731 --- [   scheduling-1] com.rjh.task.SimpleTask                  : current run by simpleTask
2019-03-29 21:23:08.424  INFO 59731 --- [   scheduling-1] com.rjh.task.SimpleTask                  : current run by overtimeTask
2019-03-29 21:23:18.425  INFO 59731 --- [   scheduling-1] com.rjh.task.SimpleTask                  : current run by simpleTask
2019-03-29 21:23:18.426  INFO 59731 --- [   scheduling-1] com.rjh.task.SimpleTask                  : current run by overtimeTask
...

Analyse des résultats

On peut le voir à partir des résultats en cours d'exécution :

  1. Chaque fois que la tâche planifiée est exécutée, elle est traitée par scheduling-1ce fil
  2. fonctionne normalement simpleTask étant bloqué par overtimeTask a fait passer l'intervalle d'exécution à 10 secondes

Plus tard, en consultant la documentation de Springboot, j'ai aussi appris que le maximum par défaut le nombre de threads en cours d'exécution pour les tâches planifiées est . 1

Solution

Étant donné que la version

utilisée est Springboot, il existe deux façons de résoudre ce problème 2.1.3.RELEASE

Utiliser la configuration Springboot

dans The le nombre de threads disponibles pour les tâches planifiées peut être configuré dans le fichier de configuration :

## 配置可用线程数为10
spring.task.scheduling.pool.size=10
Personnaliser le pool de threads pour les tâches planifiées

Utiliser un pool de threads personnalisé au lieu du pool de threads par défaut

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

/**
 * 定时任务配置类
 * @author RJH
 * create at 2019-03-29
 */
@Configuration
public class ScheduleConfig {

    /**
     * 此处方法名为Bean的名字,方法名无需固定
     * 因为是按TaskScheduler接口自动注入
     * @return
     */
    @Bean
    public TaskScheduler taskScheduler(){
        // Spring提供的定时任务线程池类
        ThreadPoolTaskScheduler taskScheduler=new ThreadPoolTaskScheduler();
        //设定最大可用的线程数目
        taskScheduler.setPoolSize(10);
        return taskScheduler;
    }
}
Cet article est terminé ici. Pour un contenu plus passionnant, vous pouvez faire attention à la colonne

Java Video Tutorial sur le site Web PHP chinois !

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer