2015-12-03 13 views
7

Vorrei inoltrare una richiesta di intestazione con un RequestInterceptor cliente fingere, ma, all'interno di RequestInterceptor.apply, RequestContextHolder.getRequestAttributes() è null, quindi è SecurityContextHolder.getContext().getAuthentication() (dove ho potuto anche alla fine ottenere il valore della mia intestazione) .Forward un'intestazione richiesta con un client RequestInterceptor Feign

Ciò usata per funzionare prima di aggiornare alla primavera-Cloud Brixton, dove i comandi hystrix devono ora probabilmente essere eseguiti in un thread separato, perché cambiare per il seguente parametro risolve il problema:

hystrix.command.default.execution.isolation.strategy: SEMAPHORE 

Ora, Non sono troppo interessato a cambiare questo tipo di valori predefiniti se non è necessario, c'è un altro, consigliato, modo di inoltrare le intestazioni ora?

Grazie

+0

È possibile passare '@ RequestHeader' a un metodo simulato. È anche possibile impostare singolarmente ciascuna chiamata fittizia su SEMAPHORE con 'hystrix.command. .execution.isolation.strategy: SEMAPHORE'. – spencergibb

+0

@spencergibb: Grazie, è quello che pensavo. Annoterò il documento del mio progetto. –

+0

Penso che vogliamo rendere l'isolamento thread vs semaforo configurabile in modo semplice. – spencergibb

risposta

4

OK, c'è un modo per fare questo ... molte grazie al Spring Cloud Sleuth per l'ispirazione.

"Tutto" è necessario implementare un HystrixConcurrencyStrategy che passa le informazioni ogni volta che si verifica un cambio di thread. La classe che fa qualcosa di molto simile in Sleuth è here.

Per il mio caso specifico lo farei:

  1. Avvolgere il Callable in wrapCallable con, per esempio, un CallableWithAuthentication classe che terrebbe l'autenticazione corrente quando costruite
  2. Il metodo CallableWithAuthenticationcall sarebbe prima ripristinare la precedenza salvato , quindi chiama l'azione originale, quindi ripulisci l'attuale Authentication, et voilà.

Una volta che il dispositivo HystrixConcurrencyStrategy è attivo, l'interceptor della richiesta funzionerà di nuovo, anche con l'isolamento del thread.

Nota controllare il resto del progetto ci sono molti altri strumenti interessanti (per RxJava per esempio).

+0

Felice che ti piaccia!Forse ci fornirai alcune cose per noi: D –

+0

@MarcinGrzejszczak: Il tempo è il problema qui, ma hey, perché no :) –

+0

Questo funziona solo se stai chiamando feignclient dal thread corrente. O hai una configurazione in cui stai chiamando un cliente finge da un altro thread? Sto usando threadpoolexecutor personalizzato che sta facendo alcune validazioni e chiamando servizi esterni. Ma in questo caso gli attributi di richiesta non vengono propagati :( – bilak

Problemi correlati