异步配置类

复制代码
@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 @   佳沃  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示