Frage einen neuen Thread im Servlet starten


Wenn eine Anfrage ein Servlet erreicht, das das Hochladen von Dateien behandelt, ist es eine gute Idee, einen neuen Thread in diesem Servlet mit zu starten new Thread(r).start() Das wird mit einem anderen Datenelement umgehen, das mit der hochgeladenen Datei geliefert wurde. Ich wollte damit beide Jobs parallel bearbeiten.


5
2018-04-26 08:51


Ursprung


Antworten:


Es ist nicht nur eine schlechte Idee, aber es wird auch nicht funktionieren. Hier ist der Grund: Ihre Datei-Upload-Anfrage wird schließlich treffen doPost() Methode. Solange Sie sich in dieser Methode befinden, hält der Container die Verbindung offen. Sobald Sie von dieser Methode zurückkehren (und wenn Sie sich entscheiden, eingehende Daten in einem separaten Thread zu bearbeiten, doPost() wird früh beendet) Der Container nimmt an, dass Sie mit der Anfrage fertig sind und schließt die Verbindung. Aus Kundensicht wurde der Upload vom Server unterbrochen. Und wegen der asynchronen Natur von Threads wird die Unterbrechung in einem zufälligen Moment auftreten.

Glauben Sie mir, einige Benutzer haben das bereits erlebt: HttpServletResponse scheint in regelmäßigen Abständen vorzeitig zu senden.

Außerdem ist es eine schlechte Idee, einen neuen Thread pro Anfrage zu starten, da dieser schlecht skaliert (und sogar durch einige Spezifikationen verboten ist). Was du kann Verwenden Sie Servlet 3.0 asynchrone Anfrage und handle Uploads asynchron, aber vorzugsweise mit einem Pool von Threads. Siehe auch: Warum einen neuen Thread mit startAsync erstellen, anstatt im Servlet-Thread zu arbeiten?.


18
2018-04-26 08:56



Servlets werden implizit in neuen Threads vom Webserver ausgeführt. Wenn also eine Anfrage auf ein Servlet trifft, wird sie in einem anderen Thread ausgeführt. Ich sehe keinen Grund, selbst einen neuen Thread zu erstellen


-2
2018-04-26 08:56



Es ist nichts falsch daran, einen neuen Thread im Servlet zu starten (im Gegensatz zu EJB), also ja, es ist in Ordnung.

EDIT: zweiter Gedanke @Tomasz Nurkiewicz hat Recht. Der Datei-Upload wird gestoppt.


-5
2018-04-26 08:53