Spring Boot使用 @Async 注解进行异步调用
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<>("我是返回值"); }
执行结果: