Я пытаюсь использовать @Async
de spring, И в моем сервисе я использую боб с областью действия session
, всегда получаю нижнюю ошибку:
org.springframework.beans.factory.BeanCreationException: Ошибка создания бина с именем 'scopedTarget.classSession': область 'сеанс' не активна для текущего потока;рассмотрите возможность определения прокси-объекта с заданной областью действия для этого компонента, если вы собираетесь ссылаться на него из одноэлементного объекта;Вложенное исключение - java.lang.IllegalStateException: сеанс не найден, а запрос уже выполнен - невозможно создать новый сеанс!
Как уже упоминалось, сеанс не найден и запрос уже завершен.Я реализовал AsyncConfigurer для того, чтобы переопределить ThreadPoolTaskExecutor: ниже мой код
Контроллер:
@Autowired
MyService myService;
@RequestMapping(value = "/doIt", method = RequestMethod.PUT)
public HttpEntity initiateCurrent(..){
myService.do();
...
}
MyService
@Autowired
ClassWithScopeSession classSession;
@Async("taskExecutor")
public void do(){
....
...
classSession.doService();
}
// Перекрываем ThreadPoolTaskExecutor
public class ContextAwareCallable<T> implements Callable<T> {
private Callable<T> task;
private RequestAttributes context;
@Autowired
private ApplicationContext appContext;
public ContextAwareCallable(Callable<T> task, RequestAttributes context) {
this.task = task;
this.context = context;
}
@Override
public T call() throws Exception {
if (context != null) {
RequestContextHolder.setRequestAttributes(context);
}
try {
return task.call();
} finally {
RequestContextHolder.resetRequestAttributes();
}
}
}
public class ContextAwarePoolExecutor extends ThreadPoolTaskExecutor {
@Override
public <T> Future<T> submit(Callable<T> task) {
return super.submit(new ContextAwareCallable(task, RequestContextHolder.currentRequestAttributes()));
}
@Override
public <T> ListenableFuture<T> submitListenable(Callable<T> task) {
return super.submitListenable(new ContextAwareCallable(task, RequestContextHolder.currentRequestAttributes()));
}
}
@Configuration
@EnableAsync
public class ExecutorConfig implements AsyncConfigurer {
@Override
@Bean(name="taskExecutor")
public Executor getAsyncExecutor() {
return new ContextAwarePoolExecutor();
}
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return null;
}
}
Я следовал за этим ответом