栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot中异步线程池AsynConfigurer配置

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot中异步线程池AsynConfigurer配置

目录​​​​​​​

什么是AsynConfigurer

为什么需要AsynConfigurer

怎么配置AsynConfigurer

注意事项

统一异常捕获

其他相关类

AsyncExecutionInterceptor

AsyncExecutionAspectSupport

参考资料


什么是AsynConfigurer

        AsynConfigurer的与@Async注解密不可分,在这里我们先说一下什么是@Async。@Async注解的就是通过AsyncAnnotationBeanPostProcessor这个后置处理器生成一个代理对象来实现异步的。

为什么需要AsynConfigurer

        Spring可以通过@EnableAsync和@Async两个注解实现异步操作。启动类加上: @EnableAsync注解,同时并且在service上加上@Async注解。但是@Async用的是SimpleAsyncTaskExecutor线程池,如果没有对SimpleAsyncTaskExecutor做策略配置的话,是不复用线程的,也是对服务器资源的极大浪费。所以我们需要AsynConfigurer来配置异步线程池。

public interface AsyncConfigurer {
 
	Executor getAsyncExecutor();
	
	AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler();
 
}

怎么配置AsynConfigurer

配置的话很简单,只要继承一下AsynConfigurerSupport类就可以了。这里AsynConfigurer和AsynConfigurerSupport都可以

@Configuration
@EnableAsync(proxyTargetClass = true)
@Slf4j
public class AsyncConfig implements AsyncConfigurer {
 
    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return (ex, method, params) ->
                log.error("Unexpected error occurred invoking async method: " + method +
                        ", args: " + Arrays.toString(params), ex);
    }
 
    
    @Override
    public Executor getAsyncExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(20);
        executor.setQueueCapacity(1000);
        executor.setThreadNamePrefix("MyExecutor-");
        executor.setWaitForTasksToCompleteonShutdown(false);
        // 设置拒绝策略
        executor.setRejectedExecutionHandler((r, e) -> {
            throw new RejectedExecutionException("Task " + r.toString() +
                    " rejected from " +
                    e.toString());
        });
        executor.initialize();
        return executor;
    }

注意事项

统一异常捕获

        @Async的注解是另外启一个线程去执行方法,无法被@RestControllerAdvice该注解获取异常,异常处理需要自己手动处理。

其他相关类

AsyncExecutionInterceptor

AsyncExecutionAspectSupport

参考资料

聊聊spring的async注解 - 简书

Spring中异步注解@Async的使用、原理及使用时可能导致的问题

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/351378.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号