3 Stimmen

Servlets, Filter und Threads in Tomcat

Verwenden im Tomcat-Container alle Filter, die mit einem Servlet verbunden sind, und das Servlet selbst denselben Thread, d. h. wird doFilter() im selben Thread wie die service()-Methode eines Servlets ausgeführt? Vielen Dank im Voraus.

6voto

David Blevins Punkte 18778

Ich vermute, die Frage ist eher: Kann ich ThreadLocal-Objekte verwenden, um Daten zwischen Filtern und an Servlets zu übergeben? In diesem Fall lautet die Antwort: absolut. App-Server tun dies selbst, um Sicherheits-, Transaktions-, Verbindungs- und andere Anforderungsinformationen zu verfolgen.

Stellen Sie einfach sicher, dass Sie Ihren ThreadLocal in einem finally-Block im selben Code löschen, der den ThreadLocal festlegt.

Wie bereits von anderen angemerkt, können die Servlets selbst synchronisiert sein oder auch nicht, aber das ist orthogonal zum Konzept des Thread-Status; d.h. wie viele Threads führen gegen Objekt foo aus vs. kann ich den Status in den Thread legen und ihn von Objekt foo sehen lassen. Die Antwort auf die zweite Frage ist immer ja.

Das einzige Mal, dass die Antwort "nein" lautet, ist, wenn Sie eine asynchrone Kommunikation verwenden:

  • Den Aufruf über AsyncContext abgesetzt
  • in EJBs gemischt und begonnen, @Asynchronous oder den TimerService zu verwenden

Dabei startet der Anwendungsserver neue Threads, die nicht mit dem ursprünglichen Anforderungsthread verbunden sind, so dass der ThreadLocal-Status nicht mit dem neuen Thread übertragen wird. Dies ist auch der Grund, warum diese APIs nicht zulassen, dass der Sicherheits- und Transaktionskontext des Aufrufers an die aufgerufene Methode weitergegeben wird, da sich der Aufrufer und die Methode in unterschiedlichen Threads befinden.

InheritableThreadLocal funktioniert in der Regel nicht, da asynchrone Aufrufe in der Regel vom Server gegen einen Thread-Pool ausgeführt werden, anstatt Child-Threads des aufrufenden Threads zu erstellen.

4voto

Bozho Punkte 570413

Ja, jede Anfrage wird in einem einzigen Thread ausgeführt, einschließlich aller Filter und des Ziel-Servlets.

-1voto

Neel Punkte 429

Ja, jede Anforderung wird innerhalb einer einzigen Servlet-Instanz ausgeführt. Der Servlet-Container empfängt jede Anforderung und startet einen neuen Thread, der die HttpServletRequest und HttpServletResponse enthält. Dieser Thread verarbeitet die Anfrage in der Servicemethode der Servlet-Instanz und wird zerstört, sobald die Servicemethode abgeschlossen ist.

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