Bean com escopo de solicitação de promoção de primavera para threads filho (HttpServletRequest)
Eu tentei muitas coisas agora, mas parece que estou perdendo uma peça do quebra-cabeça. Aqui está a história: Eu tenho um bean com escopo de solicitação que lê alguns SessionContext do HttpServletRequest. Este atributo é definido em um filtro. Portanto, isso está funcionando absolutamente bem enquanto o código é executado no thread correto.
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.INTERFACES)
public class SessionContextProviderImpl implements SessionContextProvider<SessionContext> {
private final HttpServletRequest _request;
@Autowired
public SessionContextProviderImpl(HttpServletRequest request) {
_request = request;
}
@Override
public SessionContext get() {
return (SessionContext) _request.getAttribute(Constants.SESSION_CONTEXT_IDENTIFIER);
}
}
Agora comecei a usar o novo recurso java 8s CompletableFuture e tenho três desses recursos computando coisas em paralelo enquanto o encadeamento de solicitação aguarda o resultado. O que eu quero fazer é promover / entregar / propagar o bean ou solicitar de uma maneira que ele possa ser usado em threads filho que foram gerados a partir do segmento http original. Em particular, eu gostaria de obter o SessionContext do HttpServletRequest de dentro de um CompletableFuture fornecido assíncrono.
o que eu tentei é isso (implementação substituída de get):
final HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
request.getAttribute(Constants.SESSION_CONTEXT_IDENTIFIER);
Mas isso obviamente tem o mesmo resultado que o bean com escopo da solicitação. Bem, "getRequest" retorna nulo em vez de uma exceção lançada.
Como terceira abordagem, tentei issopostagem original:
ConfigurableBeanFactory cbf = (ConfigurableBeanFactory) beanFactory;
org.springframework.beans.factory.config.Scope simpleThreadScope = new SimpleThreadScope();
cbf.registerScope("simpleThreadScope", simpleThreadScope);
E eu defino o escopo do SessionContextProviderImpl como "simpleThreadScope". Infelizmente, isso também não funcionou e lançou uma exceção que é usada fora do escopo de uma solicitação.
O ambiente que estou usando: Jersey juntamente com injeção de mola.
Talvez alguém tenha alguma ideia?
Saudações