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

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值