Heim  >  Artikel  >  Java  >  Lösen von Problemen, die bei geplanten Springboot-Aufgaben auftreten

Lösen von Problemen, die bei geplanten Springboot-Aufgaben auftreten

不言
不言nach vorne
2019-03-30 10:32:054731Durchsuche

Der Inhalt dieses Artikels befasst sich mit der Lösung von Problemen, die bei geplanten Springboot-Aufgaben auftreten. Ich hoffe, dass er für Freunde hilfreich ist.

Vorwort: Bei der Verwendung von Springboot zur Integration geplanter Aufgaben habe ich festgestellt, dass die Ausführung anderer geplanter Aufgaben blockiert wird, wenn die Ausführung einer geplanten Aufgabe zu lange dauert.

Problemort

Nachdem ich die Springboot-Dokumentation überprüft und Protokolle gedruckt (Ausgabe aktueller Thread-Informationen) habe, erfuhr ich, dass das Problem darin liegt, dass Springboot standardmäßig nur einen Thread zur Verarbeitung geplanter Aufgaben verwendet.

Problemüberprüfung

Es ist zu beachten, dass die Springboot-Version des Beispiels 2.1.3.RELEASE ist.

Konfiguration der Schlüssel-POM-Datei

    <!--继承父项目-->
    <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>

Geplante Aufgabe

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");
    }
}

Startklasse

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);
    }

}

Laufende Ergebnisse

...省略非关键信息
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
...

Ergebnisanalyse

Aus den Ausführungsergebnissen ist ersichtlich:

  1. Jedes Mal, wenn die geplante Aufgabe ausgeführt wird, wird sie vom Thread verarbeitet scheduling-1
  2. Die normale Ausführung simpleTask ist blockiert durch overtimeTask Infolgedessen wurde das Laufintervall 10 Sekunden

. Später, als ich die Dokumentation von Springboot konsultierte, erfuhr ich auch, dass die standardmäßige maximale Anzahl laufender Threads für Geplante Aufgaben sind 1.

Lösung

Da die verwendete Springboot-Version 2.1.3.RELEASE ist, gibt es zwei Möglichkeiten, dieses Problem zu lösen.

Verwenden Sie die Springboot-Konfiguration

in The Die Anzahl der für geplante Aufgaben verfügbaren Threads kann in der Konfigurationsdatei konfiguriert werden:

## 配置可用线程数为10
spring.task.scheduling.pool.size=10

Passen Sie den Thread-Pool geplanter Aufgaben an

Verwenden Sie einen benutzerdefinierten Thread-Pool anstelle des Standard-Thread-Pools

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;
    }
}

Dieser Artikel ist hier zu Ende. Weitere spannende Inhalte finden Sie in der Spalte Java-Video-Tutorial auf der chinesischen PHP-Website!

Das obige ist der detaillierte Inhalt vonLösen von Problemen, die bei geplanten Springboot-Aufgaben auftreten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen