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<>("我是返回值");
}
执行结果: