threadlocal variabili in un servlet

Sono threadlocals variabili globali per tutte le richieste fatte dal servlet che possiede le variabili?

Sto usando la resina per il server.

Grazie per awnser.

Penso di poter fare il mio sé più chiaro.

Caso specifico:

Voglio:

  • inizializzare una variabile statica quando la richiesta inizia l’esecuzione.
  • essere in grado di interrogare il valore della variabile in un ulteriore esecuzioni di metodi chiamati da un servlet in un thread di sicurezza fino alla richiesta termina l’esecuzione

OriginaleL’autore user2427 | 2008-11-26

5 Replies
  1. 4

    Risposta breve: Sì.

    Un po ‘ di più: Questo è come la Primavera fa la sua magia. Vedere RequestContextHolder (via DocJar).

    La cautela è necessaria anche se – bisogna sapere quando invalidare la ThreadLocal, come rimandare ad altri thread e come (non) si ingarbugliano con un non-threadlocal contesto.

    O si potrebbe utilizzare la Primavera…

    +1 risposta al punto!

    OriginaleL’autore Ran Biron

  2. 3

    Penso che sono globali per tutte le richieste effettuate con specifico thread. Altri thread ottenere altre copie del locale di thread dati. Questo è il punto chiave di archiviazione locale di thread:
    http://en.wikipedia.org/wiki/Thread-local_storage#Java.

    Solo se si seleziona l’opzione appropriata nella servlet di configurazione, la servlet container utilizzare il servlet con più thread per gestire le richieste in parallelo. Così efficacemente avrebbe dati separati per ogni thread che sta servendo clienti.

    Se la WebApplication non distribuiti (eseguito su più di una macchina Virtuale Java), è possibile utilizzare il ServletContext oggetto per memorizzare i dati condivisi tra le richieste e le discussioni (essere sicuri di fare una vera e propria chiusura, quindi).

    Infatti. In un precedente progetto, ho memorizzato un utente del biglietto nella loro sessione, e creato un filtro per trasferire il biglietto della sessione in un locale di thread per assicurarsi che un utente lo stato di autenticazione è stato sempre disponibile a filo l’elaborazione della richiesta.

    OriginaleL’autore Johannes Schaub – litb

  3. 2

    Come Adiel dice, il modo corretto per fare questo è probabilmente quello di usare il contesto della richiesta (cioè HttpServletRequest), per non creare un ThreadLocal. Mentre è certamente possibile utilizzare un ThreadLocal qui, bisogna stare attenti a ripulire il thread, se è possibile, poiché, altrimenti, la prossima richiesta che ottiene il thread verrà visualizzato il valore associato con la richiesta precedente. (Quando la prima richiesta è stata fatta con il filo, il filo di tornare in piscina e così la prossima richiesta di vedere). Nessun motivo per avere per gestire questo genere di cose quando il contesto della richiesta, esiste proprio per questo scopo.

    Si potrebbe anche usare un filtro servlet per gestire il ThreadLocal, almeno la creazione/pulizia sarebbe in un unico luogo.
    -1 c’è sicuramente una buona ragione “per gestire questo genere di cose”, c’è differenza tra il passaggio argomento 1000 volte intorno la propria applicazione, in confronto al solo avere uno statico getter 😉
    Non capisco il tuo commento peenut. La mia risposta non ha nulla a che fare con il passaggio di un argomento circa 1.000 volte statico o un getter. È invece la scelta tra l’utilizzo di ThreadLocal storage vs. HttpServletRequest come un contesto per le richieste HTTP. Dato che l’OP vuole che le associazioni per durare per tutta la durata della richiesta, il giusto contesto è l’HSR (ciclo di vita coincidente con la richiesta), non ThreadLocal (condiviso tra le richieste dal thread di lavoro sono generalmente in pool). HSR consente di evitare di pulire il contesto in quanto è scartata alla fine della richiesta.

    OriginaleL’autore Willie Wheeler

  4. 1

    Utilizzando ThreadLocal per negozio di scope richiesta informazioni ha il potenziale per rompere se si utilizza Servlet 3.0 Suspendable richieste (o Molo Continuazioni)
    Utilizzando tali API più thread elaborare una singola richiesta.

    OriginaleL’autore Chris

  5. 0

    Threadlocal le variabili sono sempre definite in modo da essere accessibili a livello globale, dal momento che il punto è trasparente il passaggio di informazioni attorno ad un sistema che si può accedere ovunque. Il valore della variabile è associato il thread su cui è impostata, in modo che anche se la variabile è globale, può avere valori diversi a seconda del filo da cui si accede.

    Un esempio semplice potrebbe essere quella di assegnare un utente stringa di identità di un thread in un thread variabile locale quando la richiesta viene ricevuta nella servlet. Ovunque lungo la filiera di lavorazione della richiesta (a patto che sia sullo stesso thread nella stessa VM), l’identità può essere consultato accedendo a questa variabile globale. Sarebbe anche importante rimuovere questo valore durante l’elaborazione della richiesta, dal momento che il thread sarà messo nuovamente in un pool di thread.

    OriginaleL’autore Robin

Lascia un commento