powered by simpleCommunicator - 2.0.30     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / RequestInterceptor && @Async
3 сообщений из 3, страница 1 из 1
RequestInterceptor && @Async
    #40034922
IgoX
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет.
Не могу разобраться.
Есть
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
    @Bean
    public RequestInterceptor requestTokenBearerInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate requestTemplate) {
                HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
                requestTemplate.header(HttpHeaders.AUTHORIZATION, request.getHeader(HttpHeaders.AUTHORIZATION));
            }
        };
    }



есть метод с @Async
Код: java
1.
2.
3.
4.
5.
  @Async
    public void importFiletoLog(Long importLogId) {
        updateStatusImportLog(importLogId, "STATUS_START0");
        updateStatusImportLog(importLogId, "STATUS_START1");
.....



updateStatusImportLog есть
Код: java
1.
2.
3.
4.
5.
6.
@FeignClient(value = "${db}", decode404 = true)
@RequestMapping("/v1/db")
public interface DBClient {
....
 @PostMapping(value = "/importLog")
    ResponseEntity<ImportLog> updateStatusImportLog(@RequestBody ImportLog importLog);



Без @Async всё работает, как только ставлю аннотацию перестает работать.
Проблема возникает в том что request.getHeader(HttpHeaders.AUTHORIZATION) ==null если метод асинхронный.
Погуглив нашел
Код: java
1.
2.
3.
4.
5.
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args)
                .getBean(DispatcherServlet.class)
                .setThreadContextInheritable(true);
    }



После чего асинхронный работает но только всего один раз(после запуска приложения), отрабатывает STATUS_START0. После чего сколько не дергай контроллер в requestTokenBearerInterceptor всегда request.getHeader(HttpHeaders.AUTHORIZATION) == null.
Как можно победить?
Вариант брать из контроллера HttpServletRequest и из него токен и гонять его по всем методам не предлагайте(не красиво).
...
Рейтинг: 0 / 0
RequestInterceptor && @Async
    #40034924
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgoX,
Сделайте демку кода и сюда.
...
Рейтинг: 0 / 0
RequestInterceptor && @Async
    #40034928
Андрей Панфилов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgoX,

насколько я понял задача в том, чтобы отправить HTTP-запрос куда-то еще используя приходящий заголовок Authorization от клиента...

@Async работает в своем уютненьком пуле и чтобы он умел добираться до данных http-запроса ему нужно правильный экзекьютор скормить, см. например org.springframework.security.scheduling.DelegatingSecurityContextSchedulingTaskExecutor - он умеет например SecurityContext тащить из основного потока, можно в принципе в SecurityContext затаскивать заголовок и потом брать его в интерсепторе, а можно свой экзекьютор написать (только тащить целый RequestContextHolder.getRequestAttributes() не советую - оно мутирует и в другом потоке виден мусор)
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / RequestInterceptor && @Async
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]