ThreadLocal - usando como informações de contexto para a API REST com boot por mola

eu tenho algunsspring-boot aplicação (expõe o resto da API). A API REST mencionada é protegida porspring-security. Está tudo bem, mas agora eu preciso definir o contexto para a solicitação de manutenção. Definir contexto é escolher a fonte de dados depende do contexto do usuário. A chave é que RoutingDataSource precisa usar esse contexto. (Esse contexto deve ser definido diretamente após a autenticação da solicitação devido a outras causas, também tenho outro encadeamento que usa RoutingDataSource, mas não é invocado pela solicitação (sem contexto do usuário)).

Essas coisas eu posso fazer, no entanto, minhas dúvidas estão preocupadas com a segurança do contexto do tópico e a limpeza dele. Tentei encontrar resposta nos documentos, mas não consegui.

public class CustomContextHolder {

   private static final ThreadLocal<DatabaseType> contextHolder = 
            new ThreadLocal<DatabaseType>();

   public static void setContext(DatabaseType databaseType) {
      contextHolder.set(databaseType);
   }

   public static CustomerType getContext() {
      return (CustomerType) contextHolder.get();
   }

   public static void clearContext() {
      contextHolder.remove();
   }
}

E definindo o contexto:

@Component
class AuthorizedRequestFilter extends OncePerRequestFilter {
    @Override
    protected void doFilterInternal(HttpServletRequest request, 
                                    HttpServletResponse response, 
                                    FilterChain filterChain) throws ServletException, IOException {

        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        if (authentication != null && authentication.isAuthenticated()) {
            // here we set context
        }

        filterChain.doFilter(request, response);
    }
}

Eu posso fazer isso. No entanto, porquespring-boot é multi-thread e eu estou usandoThreadLocal para manter o contexto, tenho medo da segurança de threads dessa configuração.

Quando defino este contexto? No filtro,somente após sucesso autorização do pedido. Então, as perguntas são:

É thread-safe? Significa: Posso assumir queo mesmo thread que executa o filtro (daí também esse contexto do conjunto de threads em suapróprio local contexto) também executa a solicitação inteira (por exemplo, chamar métodos do dao, enviar resposta, executar o corpo do controlador)?

Se no caso 1. Posso assumir que um encadeamento funciona com a solicitação do início ao fim (begin inclui filtro após solicitação segura), quando devo chamarclearContext() ?

questionAnswers(4)

yourAnswerToTheQuestion