异步配置类

@Configuration
@ConditionalOnProperty(value = "guigu.async.enable", havingValue = "true")
@EnableAsync
public class AsyncConfig {

    private static final Logger log = LoggerFactory.getLogger(AsyncConfig.class);

    @Value("${guigu.async.core-pool-size:5}")
    private int corePoolSize;

    @Value("${guigu.async.queue-capacity:10}")
    private int queueCapacity;

    @Value("${guiugu.async.max-pool-size:25}")
    private int maxPoolSize;

    @Value("${guigu.async.keepalive-seconds:10}")
    private int threadTimeout;

    @Primary
    @Bean
    public AsyncTaskExecutor myAsyncExecutor() {
        log.info(">> 初始化spring异步任务线程池 - myAsyncExecutor: coore={},max={},queue={}",
                corePoolSize, maxPoolSize, queueCapacity);
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();

        // 当一个任务通过execute(Runnable)方法欲添加到线程池时:
        // - 若线程池中的数量小于corePoolSize,即使线程池中的线程都处于空闲状态,也创建新的线程来处理被添加的任务。
        // - 若线程池中的数量等于corePoolSize,但缓冲队列workQueue未满,则任务被放入缓冲队列。
        // - 若线程池中的数量大于corePoolSize,缓冲队列workQueue满,且线程池中的数量小于maximumPoolSize,则创建新线程来处理被添加的任务。
        // - 若线程池中的数量大于corePoolSize,缓冲队列workQueue满,且线程池中的数量等于maximumPoolSize,则通过handler所指定的策略来处理此任务。
        //   即:处理任务的优先级为:核心线程corePoolSize、任务队列workQueue、最大线程 maximumPoolSize,若三者都满,则使用handler处理被拒绝的任务。
        // - 若线程池中的线程数量大于corePoolSize时,如果某线程空闲时间超过keepAliveTime,线程将被终止。

        // 线程池维护线程的最少数量
        threadPoolTaskExecutor.setCorePoolSize(corePoolSize);
        // 线程池维护线程的最大数量
        threadPoolTaskExecutor.setMaxPoolSize(maxPoolSize);
        // 线程池所使用的缓冲队列
        threadPoolTaskExecutor.setQueueCapacity(queueCapacity);
        // 线程池维护线程所允许的空闲时间
        threadPoolTaskExecutor.setKeepAliveSeconds(threadTimeout);

        // don't forget to initialize the thread pool
        threadPoolTaskExecutor.initialize();

        return threadPoolTaskExecutor;
    }

    @Bean
    public AsyncUncaughtExceptionHandler myAsyncUncaughtExceptionHandler() {
        return (throwable, method, params) -> {
            String methodName = method.getDeclaringClass().getName() + method.getName();
            log.error(">> 异步执行错误: {}({})", methodName, params, throwable);
        };
    }
}

 使用异步注解

  @Async
    @Scheduled(cron = "* * * * * ?")
    public void hello() throws InterruptedException {
        log.info("hello...");
        Thread.sleep(3000);
    }

 

posted @ 2022-10-07 21:38  星期三q  阅读(34)  评论(0)    收藏  举报