zoukankan      html  css  js  c++  java
  • SpringBoot异步及线程池配置

    异步方法注解@Async

    在SpringBoot中进行异步处理,可以使用异步注解@Async和@EnableAsync。
    @Async注解表示异步,如:@Async("asyncServiceExecutor"),
    后面的参数asyncServiceExecutor对应于自定义的线程池配置类(在以下例子中为ExecutorConfig) 中的线程池方法名
    如果不写后面的参数,直接用@Async,则是使用默认的线程池。

    Future实现类获取异步处理结果

    如果想要获取异步处理的结果,可以通过Future接口的实现类调用get()方法获得。
    Future接口的常见实现类有FutureTask。
    在SpringBoot中,一般用 AsyncResult作为异步结果。

    示例

    注意:以下示例中的@Slf4j注解是属于lombok的注解,如果不想使用lombok,可以直接用常规的日志声明变量代替。
    1.AsyncService如下:

    @Component
    @Slf4j
    public class AsyncService {
        /**
         * @Async注解表示异步,后面的参数对应于线程池配置类ExecutorConfig中的方法名asyncServiceExecutor(),
         * 如果不写后面的参数,直接使用@Async注解,则是使用默认的线程池
         * Future<String>为异步返回的结果。可以通过get()方法获取结果。
         *
         */
        @Async("asyncServiceExecutor")
        public Future<String> getDataResult( ){
            log.info("开始异步处理");
            String result="asyncResultTest";
            return new AsyncResult<String>(result);
        }
    }
    

    线程池ThreadPoolTaskExecutor

    SpringBoot中的线程池一般用ThreadPoolTaskExecutor 类。
    ThreadPoolTaskExecutor继承关系如下:

    ThreadPoolTaskExecutor extends ExecutorConfigurationSupport implements AsyncListenableTaskExecutor, SchedulingTaskExecutor
    

    关系结构图为:

    2.自定义线程池配置如下:

    @Slf4j
    @Configuration
    public class ExecutorConfig {
        @Bean
        public Executor asyncServiceExecutor() {
            log.info("start asyncServiceExecutor");
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            //配置核心线程数
            executor.setCorePoolSize(5);
            //配置最大线程数
            executor.setMaxPoolSize(5);
            //配置队列大小
            executor.setQueueCapacity(99999);
            //配置线程池中的线程的名称前缀
            executor.setThreadNamePrefix("async-service-");
    
            // 设置拒绝策略:当pool已经达到max size的时候,如何处理新任务
            // CALLER_RUNS:不在新线程中执行任务,而是有调用者所在的线程来执行
            executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
            //执行初始化
            executor.initialize();
            return executor;
        }
    }
    

    3.UserService 如下:

    @Service
    @Slf4j
    public class UserService {
        @Autowired
        private AsyncService asyncService;
    
        /**
         * 调用异步服务,获取异步结果。
         * @return
         */
        public String getAsyncResult()  {
            Future<String>  future=asyncService.getDataResult();
            String result=null;
            try{
                result =future.get();
            }catch (InterruptedException | ExecutionException e) {
                log.error("error:{}",e.getMessage());
            }
            log.info("异步处理结果为:{}",result);
            return result;
        }
    
    }
    
    

    @EnableAsync开启异步

    @EnableAsync表示开启异步,可以放在@Controller层上方,也可以放在Application类的上方。

    @Controller
    @EnableAsync
    public class UserController {
        @Autowired
        private UserService userService;
    
        @GetMapping("/user/query")
        @ResponseBody
        public String getUserData(){
            return userService.getAsyncResult();
        }
    }
    

    参考资料:
    https://blog.csdn.net/boling_cavalry/article/details/79120268

  • 相关阅读:
    教程:在 Visual Studio 中开始使用 Flask Web 框架
    教程:Visual Studio 中的 Django Web 框架入门
    vs2017下发现解决python运行出现‘No module named "XXX""的解决办法
    《sqlite权威指南》读书笔记 (一)
    SQL Server手工插入标识列
    hdu 3729 I'm Telling the Truth 二分图匹配
    HDU 3065 AC自动机 裸题
    hdu 3720 Arranging Your Team 枚举
    virtualbox 虚拟3台虚拟机搭建hadoop集群
    sqlserver 数据行统计,秒查语句
  • 原文地址:https://www.cnblogs.com/expiator/p/11128357.html
Copyright © 2011-2022 走看看