首页 > 编程语言 > 详细

Spring Boot使用 @Async 注解进行异步调用

时间:2021-07-12 15:32:16      阅读:18      评论:0      收藏:0      [点我收藏+]

Spring Boot使用 @Async 注解进行异步调用

创建异步调用线程池配置代码:

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

@Configuration
@EnableAsync // 启用异步调用
public class AsyncConfig implements AsyncConfigurer {


    @Bean("taskExecutor")
    public Executor getCutChartExecutor() {
        //线程池
        ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor();
        taskExecutor.setCorePoolSize(3);
        taskExecutor.setMaxPoolSize(10);
        taskExecutor.setQueueCapacity(100);
        taskExecutor.setKeepAliveSeconds(60);
        taskExecutor.setThreadNamePrefix("async-task-thread-pool");
        //rejection-policy:当pool已经达到max size的时候,如何处理新任务
        //CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
        //对拒绝task的处理策略
        taskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        taskExecutor.initialize();
        return taskExecutor;
    }

}

创建异步调用方法:

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Component;

@Slf4j
@Component
public class AsyncExecutor {

    @Async("taskExecutor")
    public void execute(Runnable runnable){
        try {
            Thread thread = Thread.currentThread();
            log.info("当前异步线程:{}", thread.getName());
            runnable.run();
        } catch (Exception e) {
            log.error("AsyncExecutor execute执行异常",e);
        }
    }
}

调用异步方法:

    @RequestMapping("/async")
    public Future<String> async() {
        System.out.println("start");
        asyncExecutor.execute(() -> {
            System.out.println("async start");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println("async end");
        });
        System.out.println("end");
        return new AsyncResult<>("我是返回值");
    }

执行结果:

技术分享图片

 

Spring Boot使用 @Async 注解进行异步调用

原文:https://www.cnblogs.com/tangshengwei/p/15001793.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!