Bootstrap

Spring 自定义异步池的实现(拓展)

Spring 自定义异步池的实现(拓展)

为了让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池对象中的线程执行异步任务

;