@Async
标注@Async的方法将称之为异步方法
业务场景:
当用户填写完注册申请资料时、系统需要通过填写的资料进行综合评判等级。那么我们将这个功能拆分成两块、一份处理保存用户资料录入的方法、另一个方法通过异步手段对数据进行分析入库、但是不能影响用户正常的录入功能,换句话说 即使综合评判等级的方法报错了,但是不能影响已经录入成功的数据。
实现:如果有这种业务场景时、我们可以通过@Async注解来提升性能
举例说明一下:
当A方法调用 B、C方法时 若B方法标注了@Async注解 那么将会开启新的一个线程去执行B方法的内容。 然而C方法不会等待B方法执行完再执行。
注意: 若B方法中有直接操作数据库的动作,那么请在B方法上再添加@Transactional(rollbackFor = Exception.class) 注解,这样能有效的保证数据有效性。 同时,若C方法执行完成后 B方法还未执行完那么将直接杀死线程。
踩坑记录之 @Async 失效
1)若发现@Async 注解没生效 请查看一下代码是否配置了线程池
import java.util.concurrent.Executor;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
@Configuration
public class SpringAsyncConfigurerimplements AsyncConfigurer {
@Override
public ExecutorgetAsyncExecutor() {
ThreadPoolTaskExecutor executor =new ThreadPoolTaskExecutor();
executor.setCorePoolSize(10);
executor.setMaxPoolSize(20);
executor.setQueueCapacity(20);
executor.setThreadNamePrefix("MyExecutor-");
executor.initialize();
return executor;
}
@Override
public AsyncUncaughtExceptionHandlergetAsyncUncaughtExceptionHandler() {
return null;
}
}
2)检查一下启动类上是否添加了@EnableAsync注解