Как использовать основной Spring Context для асинхронного метода?
Имеется приложение на Spring Boot-стеке. В приложении есть асинхронный метод, который на фоне должен выполнять действия с авторизованным пользователем, но так как асинхронный метод использует другой контекст, то авторизованного пользователя он не видит. Каким образом можно передать свой
основной context в асинхронный поток?
Асинхронность реализована через @EnableAsync и @Async.
SpringAsyncConfig:
@Configuration
@EnableAsync
public class SpringAsyncConfig {
@Bean(name = "asyncExecutor")
public Executor asyncExecutor() {
ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
executor.setCorePoolSize(3);
executor.setMaxPoolSize(3);
executor.setQueueCapacity(100);
executor.setThreadNamePrefix("AsyncThread-");
executor.initialize();
return executor;
}
}
Ответы (1 шт):
Автор решения: Gleb Kuznetsov
→ Ссылка
Если речь идет о доступе к SecurityContextHolder.getContext(), то можно использовать DelegatingSecurityContextAsyncTaskExecutor
@Bean
public DelegatingSecurityContextAsyncTaskExecutor taskExecutor(ThreadPoolTaskExecutor delegate) {
return new DelegatingSecurityContextAsyncTaskExecutor(delegate);
}
Тогда контекст будет содержать данные аутентикации внутри методов с аннотацией @Async:
@Async
public void asyncCall() {
log.info("Inside the @Async logic: "
+ SecurityContextHolder.getContext().getAuthentication().getPrincipal());
}
Более подробно тут