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>
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"); } }
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); } }
...省略非关键信息 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 ...
Aus den Ausführungsergebnissen ist ersichtlich:
scheduling-1
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
.
Da die verwendete Springboot
-Version 2.1.3.RELEASE
ist, gibt es zwei Möglichkeiten, dieses Problem zu lösen.
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
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!