Spring 自定义异步池

本文详细介绍如何自定义Spring的异步线程池,通过@ConfigurationProperties从配置文件读取参数,并设置核心线程数、最大线程数等,以避免业务中的OOM问题。关键代码展示了线程池创建和拒绝策略的实现。
摘要由CSDN通过智能技术生成

为了让Spring中的异步池更好的服务于我们的业务,同时也尽量避免OOM,可以自定义线程池优化设计如下:关键代码如下:

package com.cy.pj.common.config

@Slf4j

@Setter

@Configuration

@ConfigurationProperties(“async-thread-pool”)

public class SpringAsyncConfig implements AsyncConfigurer{

/**核心线程数*/

    private int corePoolSize=20;

    /**最大线程数*/

    private int maximumPoolSize=1000;

    /**线程空闲时间*/

    private int keepAliveTime=30;

    /**阻塞队列容量*/

    private int queueCapacity=200;

    /**构建线程工厂*/

    private ThreadFactory threadFactory=new ThreadFactory() {

            //CAS算法

            private AtomicInteger at=new AtomicInteger(1000);

            @Override

            public Thread newThread(Runnable r) {

                    return new Thread(r,

“db-async-thread-”+at.getAndIncrement());

            }

    };        

    @Override

public Executor getAsyncExecutor() {

    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();

    executor.setCorePoolSize(corePoolSize);

    executor.setMaxPoolSize(maximumPoolSize);

    executor.setKeepAliveSeconds(keepAliveTime);

    executor.setQueueCapacity(queueCapacity);

    executor.setRejectedExecutionHandler((Runnable r,

ThreadPoolExecutor exe) -> {

            log.warn("当前任务线程池队列已满.");

    });

    executor.initialize();

    return executor;

}


@Override

public AsyncUncaughtExceptionHandler

getAsyncUncaughtExceptionHandler() {

    return new AsyncUncaughtExceptionHandler() {

        @Override

        public void handleUncaughtException(Throwable ex ,

Method method , Object… params) {

            log.error("线程池执行任务发生未知异常.", ex);

        }

    };

}}

其中:@ConfigurationProperties(“async-thread-pool”)的含义是读取application.yml配置文件中以"async-thread-pool"名为前缀的配置信息,并通过所描述类的set方法赋值给对应的属性,在application.yml中连接器池的关键配置如下:

async-thread-pool:

   corePoolSize: 20

   maxPoolSize: 1000

   keepAliveSeconds: 30

   queueCapacity: 1000

后续在业务类中,假如我们使用@Async注解描述业务方法,默认会使用ThreadPoolTaskExecutor池对象中的线程执行异步任务。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值