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.
Antworten
Zu viele Anzeigen?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.
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.