Как передать контекст в многопоточности - PullRequest
0 голосов
/ 22 февраля 2019

Мы используем многопоточность и нам нужен контекст вызывающего потока в каждом вложенном потоке.Мы используем Spring 4.3.

Например:

final Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

CompletableFuture.supplyAsync(() -> {
    ...
    try {
        // take the security context from the caller
        SecurityContextHolder.getContext().setAuthentication(authentication);
        doOperations()

Этот подход прекрасно работает в контексте безопасности.Он передается из потока вызывающей стороны (конечной точки покоя) и передает его каждому созданному завершаемому будущему.

В данном классе в цепочке вызовов я имею следующую конструкцию:

@Context
protected ProvisioningContext provisioningContext;  
@Context
protected UriInfo uriInfo;

Какправильно передать все контексты во вновь созданном потоке?

Подходы типа ThreadContext.getContext() не работают.

1 Ответ

0 голосов
/ 22 февраля 2019

Вы можете попробовать реализовать что-то похожее на то, что я описал здесь

Настроить / расширить поддержку @Async в Spring для shiro

То есть:

  • Использование аннотации Spring @Async для выполнения задач в разных потоках
  • Реализация пользовательского ThreadPoolTaskExecutor, связывающего текущий контекст (ы) с выполняемой задачей
  • Создание пружиныиспользуйте этот исполнитель задач, реализовав AsyncConfigurer

Если вы хотите использовать что-то вроде CompletableFuture.supplyAsync или локальных служб исполнителя, вы получите много дублированного кода по сравнению с подходом, описанным выше -используя пул потоков, который управляется Spring.

Специально для чего-то вроде контекста аутентификации важно также позаботиться об удалении контекста из потока.В противном случае контекст все еще может быть присоединен к потоку, если он будет повторно использован службой исполнителя для выполнения другой задачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...