6 Stimmen

threadlokale Variablen in einem Servlet

Sind die Threadlocals-Variablen global für alle Anfragen, die an das Servlet gerichtet werden, das Eigentümer der Variablen ist?

Ich verwende Resin für den Server.

Danke für den Hinweis.

Ich denke, ich kann mich klarer ausdrücken.

Der konkrete Fall:

Ich möchte es:

  • eine statische Variable zu initialisieren, wenn die Anfrage die Ausführung beginnt.
  • in der Lage sein, den Wert der Variablen in den weiteren Ausführungen von Methoden, die vom Servlet aufgerufen werden, abzufragen, und zwar so lange, bis die Anfrage die Ausführung beendet

4voto

Ran Biron Punkte 6199

Kurze Antwort: Ja.
Eine etwas längere: So macht der Frühling seinen Zauber. Siehe RequestContextHolder (über DocJar).

Es ist jedoch Vorsicht geboten - man muss wissen, wann man den ThreadLocal ungültig macht, wie man andere Threads aufschiebt und wie man sich (nicht) mit einem nicht-threadlocal-Kontext verheddert.

Oder Sie könnten einfach Spring verwenden...

3voto

Ich denke, sie gelten nur für alle Anträge, die in diesem speziellen Thread gestellt werden. Andere Threads erhalten andere Kopien der thread-local Daten. Dies ist der Kernpunkt der thread-lokalen Speicherung: http://en.wikipedia.org/wiki/Thread-local_storage#Java .

Wenn Sie die entsprechende Option in der Servlet-Konfiguration nicht aktivieren, wird der Servlet-Container Ihr Servlet mit mehreren Threads verwenden, um Anfragen parallel zu bearbeiten. Sie würden also für jeden Thread, der Kunden bedient, separate Daten haben.

Wenn Ihre Webanwendung nicht verteilt ist (auf mehreren virtuellen Java-Maschinen läuft), können Sie die ServletContext Objekt, um gemeinsame Daten über Anfragen und Threads hinweg zu speichern (stellen Sie sicher, dass Sie dann richtig sperren).

3voto

Wie Adiel sagt, ist der richtige Weg, dies zu tun wahrscheinlich den Anfragekontext (d.h. HttpServletRequest) zu verwenden, nicht ein ThreadLocal zu erstellen. Während es sicherlich möglich ist, ein ThreadLocal hier zu verwenden, müssen Sie vorsichtig sein, um Ihren Thread zu bereinigen, wenn Sie das tun, da sonst die nächste Anforderung, die den Thread erhält den Wert mit der vorherigen Anforderung zugeordnet sehen. (Wenn die erste Anfrage mit dem Thread fertig ist, geht der Thread zurück in den Pool, so dass die nächste Anfrage ihn sieht). Es gibt keinen Grund, sich um diese Dinge zu kümmern, wenn der Anfragekontext genau für diesen Zweck existiert.

1voto

Chris Punkte 11

Die Verwendung von ThreadLocal zum Speichern von anforderungsspezifischen Informationen kann zu Problemen führen, wenn Sie Servlet 3.0 Suspendable-Anforderungen (oder Jetty Continuations) verwenden. Bei Verwendung dieser APIs verarbeiten mehrere Threads eine einzige Anfrage.

0voto

Robin Punkte 23622

Threadlokale Variablen sind immer so definiert, dass auf sie global zugegriffen werden kann, da es darum geht, Informationen transparent in einem System weiterzugeben, auf die überall zugegriffen werden kann. Der Wert der Variablen ist an den Thread gebunden, in dem sie gesetzt wird. Obwohl die Variable global ist, kann sie also je nach Thread, von dem aus auf sie zugegriffen wird, unterschiedliche Werte haben.

Ein einfaches Beispiel wäre die Zuweisung einer Benutzeridentitätszeichenkette an einen Thread in einer lokalen Thread-Variablen, wenn die Anfrage im Servlet empfangen wird. An jeder Stelle der Verarbeitungskette dieser Anfrage (vorausgesetzt, es handelt sich um den gleichen Thread in der gleichen VM) kann die Identität durch Zugriff auf diese globale Variable abgerufen werden. Es wäre auch wichtig, diesen Wert zu entfernen, wenn die Anfrage verarbeitet ist, da der Thread wieder in einen Thread-Pool aufgenommen wird.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X