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

原文地址:https://www.cnblogs.com/expiator/p/11128357.html