648540858
2023-05-12 512b0cc8f5606f08b93afb154f0cffd92b93cac8
Merge pull request #847 from xu-bin-bin/wvp-28181-2.0

"@schedule"是Spring框架提供的一种定时任务执行机制,默认情况下它是单线程执行,将其修改为支持多线程。
1个文件已添加
30 ■■■■■ 已修改文件
src/main/java/com/genersoft/iot/vmp/conf/ScheduleConfig.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/genersoft/iot/vmp/conf/ScheduleConfig.java
New file
@@ -0,0 +1,30 @@
package com.genersoft.iot.vmp.conf;
import org.apache.commons.lang3.concurrent.BasicThreadFactory;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import java.util.concurrent.ScheduledThreadPoolExecutor;
import java.util.concurrent.ThreadPoolExecutor;
/**
 * "@Scheduled"是Spring框架提供的一种定时任务执行机制,默认情况下它是单线程的,在同时执行多个定时任务时可能会出现阻塞和性能问题。
 * 为了解决这种单线程瓶颈问题,可以将定时任务的执行机制改为支持多线程
 */
@Configuration
public class ScheduleConfig implements SchedulingConfigurer {
    public static final int cpuNum = Runtime.getRuntime().availableProcessors();
    private static final int corePoolSize = cpuNum;
    private static final String threadNamePrefix = "scheduled-task-pool-%d";
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setScheduler(new ScheduledThreadPoolExecutor(corePoolSize,
                new BasicThreadFactory.Builder().namingPattern(threadNamePrefix).daemon(true).build(),
                new ThreadPoolExecutor.CallerRunsPolicy()));
    }
}