说明:
Spring基于java的线程池提供了类ThreadPoolTaskExecutor,支持异步操作。
基于Spring Boot实现:
1.声明
Config.java
@Bean(name="asyncExecutor")
public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setTaskDecorator(new ThreadContextDecorator());
executor.setCorePoolSize(3);
executor.setMaxPoolSize(5);
executor.setQueueCapacity(50);
executor.setWaitForTasksToCompleteOnShutdown(true);
executor.setThreadNamePrefix("AsyncThread-");
executor.initialize();
return executor;
}
2.异步操作
CommonHelper.java
@Async("asyncExecutor")
public void asyncOperation(User user){
//异步任务
。。。。。
}
3.使用
UserService.java
public void userAsyncOper(User user){
commonHelper.asyncOperation(user);
}
注意事项:
1.异步调用线程切换导致的上下文丢失;
解决:
public class ThreadContextDecorator implements TaskDecorator {
@Override
public Runnable decorate(Runnable runnable) {
RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
return () -> {
try {
RequestContextHolder.setRequestAttributes(requestAttributes);
runnable.run();
} finally {
RequestContextHolder.resetRequestAttributes();
}
};
}
}
2. 异步操作“asyncOperation”不能写在“UserService.java”中,需要写在“CommonHelper”中,否则异步调用不生效;