Was bei Servlet-Entwicklung alles beachten?

Status
Nicht offen für weitere Antworten.

WeirdAl

Bekanntes Mitglied
Hallo,
ich entwickle gerade ein Servlet das Streams empfängt, verarbeitet und dann per HTTP-POST weitersendet. Dazu erzeuge ich eine Reihe von Objekten, ein paar temporäre Dateien, arbeite aber komplett ohne statische Methoden/Klassen sondern ausschliesslich mit Komposition.
Das Servlet wird wohl maximal 10-20x gleichzeitig laufen und seine Arbeit erledigen. Jemand in meinem Umfeld hat jetzt gemeint das ich einige Methoden bzw. Abschnitte lieber synchronize setzen sollte, da es wohl mit Servlets Probleme geben könnte, weil Tomcat wohl das mit dem 1 Servlet pro Instanz nicht so ernst nimmt und irgendwas zusammen legt (ka was damit genau gemeint ist. Evtl. Klassenmethode oder -variablen).

Jetzt meine Frage: ist da was dran? Ich dachte immer das es ein Servlet gibt und jeweils eine Instanz dieses Servlets pro Aufruf erzeugt wird.
 
G

Guest

Gast
Nein, jede Session ist eindeutig, selbst wenn die gleiche Servlet-Instanz genutzt wird. Sorge nur dafür, dass deine
temporären Dateien wirklich eindeutige, temporäre Namen haben.
 
M

maki

Gast
Das Servlet wird wohl maximal 10-20x gleichzeitig laufen und seine Arbeit erledigen. Jemand in meinem Umfeld hat jetzt gemeint das ich einige Methoden bzw. Abschnitte lieber synchronize setzen sollte, da es wohl mit Servlets Probleme geben könnte, weil Tomcat wohl das mit dem 1 Servlet pro Instanz nicht so ernst nimmt und irgendwas zusammen legt (ka was damit genau gemeint ist. Evtl. Klassenmethode oder -variablen).
Tomcat nimmt die Sache mit der einen Servlet Instanz pro Servletmapping (nicht pro Aufruf!!!)sehr ernst, schliesslich ist Tomcat die Refernzimplemntierng der Servlet spec ;)
Anders gesagt, ich hab noch keinen Java Webserver gefunden, der mehr kann oder sauberer arbeitet.

Das Problem ist ein anderes:
Ein Servlet wird von mehreren Threads genutzt (wie es auch sein sollte, das SingleThreadModel ist tot).

Hat dein Servlet Instanzvariablen?
Das wäre das einzige Problem,Nebenläufigkeit eben :)
Servlets dürfen keine Instanzvariablen haben!
Synchronized ist ein sehr schlechter weg ein Servlet Threadsicher machen zu wollen ;)

Ist aber eigentlich alles in der Servletspec. beschrieben, die sollte man unbedingt lesen ;)
Die Servlet Spec und die JSP Spec sind seit Jahren die Grundlage für jede Art von Webentwicklung in Java, dass heisst es ist keine Zeitverschwendung diese zu lesen ;)

Wenn du uns den code zeigst, könnte man vielleciht konkretere Tipps geben.
 

WeirdAl

Bekanntes Mitglied
Hallo :)
Die Servlet uns JSP Spec hatte ich irgendwann mal gelesen, aber mich hat das ganze Gespräch mit dem Kollegen doch schon verunsichert da ich noch nicht so viel Erfahrung mit Servlet Programmierung habe :).
Die Temp-Files erzeuge ich mit File.createTempFile(...). So wie ich das verstanden habe, garantiert createTempFile für die Einmaligkeit des Filenamens.

Instanzvariablen hat mein Servlet nicht (nur die Konstante serialDinges... das von Eclipse gesetzt wurde).

Hier mal mein Code, wobei nicht viel zu sehen ist, da ich praktisch alles weiterreiche, aber evtl. fällt euch doch was auf:

Code:
static final long serialVersionUID = 1L;

    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {

        XMLStreamFactory factory = new XMLStreamFactory();
        IXMLStream xmlStream = null;
        File tempXmlFile = null;
        String type = "";
        Boolean isValide = false;

        // ermitteln des XML-Typs anhand des Servlet-InitParams type
        ServletConfig sc = getServletConfig();
        type = sc.getInitParameter("type");
        

        try {
            // erstellt ein Tempfile, um InputStream öfters zu nutzen
            tempXmlFile = new TempXmlFile(request.getInputStream())
                    .getTempFile();

            // die Factory übergibt anhand des Typs das richtige
            // Objekt
            xmlStream = factory.getXMLStream(tempXmlFile, type);

            // transformiert XML anhand XSLT, damit Validierung
            // möglich ist
            xmlStream.transform();

            // validiert anschließend XML File gegen die XSD
            isValide = xmlStream.validate();

            // wenn der Stream valide ist, packe Stream in einen SOAP
            // Umschlag und versende ihn
            if (isValide) {
                xmlStream.transform2SOAP();
                xmlStream.send(response);
            }
            // falls stream nicht valide ist, ist die Errorliste des
            // Streams gefuellt. Diese wird als Antwort zurück
            // gesendet (TODO: in SOAP einpacken)
            else
                this.responseErrorList(xmlStream.getErrorList(), response);

        } catch (SAXException e) {
            // TODO: Antwort im Falle das Daten ungültig sind
            this.responseError(tempXmlFile, "Daten die per HTTP POST uebertragen "
                    + "wurden enthalten keine XML valide Daten: ", response);
        } catch (IOException e) {
            this.responseError(tempXmlFile,
                    "Fehler beim Arbeiten mit der temp. Datei", response);
        } catch (NullPointerException e) {
            this.responseError(tempXmlFile, "Der Stream konnte nicht"
                    + "zugeordnet werden", response);
        } catch (TransformerException e){
            this.responseError(tempXmlFile, "Fehler bei der Transformierung"
                    + "(XSLT ODER SOAPXSLT)", response);
        }
        finally {
            tempXmlFile.delete();
        }

wenn der Code etwas prozdual aussieht, dann liegt es dadran das ich 50% ABAP und 50% Java zur Zeit entwickle...^^
 
M

maki

Gast
Wenn die Klassen, welche du verwendest, auch Threadsicher sind, bist du auf der sicheren Seite, denn dein Servlet ist Threadsicher.
 

Ralf Ueberfuhr

Bekanntes Mitglied
maki hat gesagt.:
Tomcat nimmt die Sache mit der einen Servlet Instanz pro Servletmapping (nicht pro Aufruf!!!)sehr ernst, schliesslich ist Tomcat die Refernzimplemntierng der Servlet spec ;)

Wenn es wirklich eine Referenzimplementierung ist, dann gibt es nicht eine Instanz pro Mapping, sondern eine Instanz pro Servlet-Definition. Verschiedene Mappings auf ein und dasselbe Servlet rufen auch stets dasselbe Objekt auf.

maki hat gesagt.:
Anders gesagt, ich hab noch keinen Java Webserver gefunden, der mehr kann oder sauberer arbeitet.

WebContainer, Webserver sind was Anderes. Und ich kann da nicht 100%ig zustimmen. JBoss und gut und schnell, aber korrekt arbeiten sie eigentlich alle. Für Details wär ich hier dankbar.

maki hat gesagt.:
Hat dein Servlet Instanzvariablen?
Das wäre das einzige Problem,Nebenläufigkeit eben :)
Servlets dürfen keine Instanzvariablen haben!

VETO! Dinge wie ServletConfig und ServletContext werden in Servlets als Instanzvariablen gehalten. Typischerweise sollten Instanzvariablen in der init()-Methode gesetzt und während der (parallelen) Requestverarbeitung nur gelesen werden. Wenn du dennnoch Instanzvariablen während der Requestverarbeitung modifizieren willst (z.B. irgendwelche Collections mit Daten befüllen oder weiß der Geier), dann solltest du die eine Zeile synchronisieren mit der Instanzvariablen als mutex.

Eine andere Möglichkeit wäre die Verwendung des Interface SingleThreadModel. Damit werden mehrere Instanzen deines Servlets erzeugt, die wiederrum nur jeweils einmalig pro Zeitpunkt verwendet werden.
 
M

maki

Gast
masseur81 hat gesagt.:
maki hat gesagt.:
Tomcat nimmt die Sache mit der einen Servlet Instanz pro Servletmapping (nicht pro Aufruf!!!)sehr ernst, schliesslich ist Tomcat die Refernzimplemntierng der Servlet spec ;)

Wenn es wirklich eine Referenzimplementierung ist, dann gibt es nicht eine Instanz pro Mapping, sondern eine Instanz pro Servlet-Definition. Verschiedene Mappings auf ein und dasselbe Servlet rufen auch stets dasselbe Objekt auf.
Richtig, ich meinte Servlet Definitionen und nicht URL mappings.

masseur81 hat gesagt.:
maki hat gesagt.:
Anders gesagt, ich hab noch keinen Java Webserver gefunden, der mehr kann oder sauberer arbeitet.

WebContainer, Webserver sind was Anderes. Und ich kann da nicht 100%ig zustimmen. JBoss und gut und schnell, aber korrekt arbeiten sie eigentlich alle. Für Details wär ich hier dankbar.
Genaugenommen meinte ich Servlet Engine, JBoss setzt übrigens auch auf Tomcat.
Unter bestimmten Umständen funktioniert zB. Websphere 5 anders wenn es um session.invalidate() geht, da wird die Session nicht immer sofort invalidiert ;)
Man kann sich einen Test bei Tomcat runterladen, der testet dann die Konformität.

masseur81 hat gesagt.:
maki hat gesagt.:
Hat dein Servlet Instanzvariablen?
Das wäre das einzige Problem,Nebenläufigkeit eben :)
Servlets dürfen keine Instanzvariablen haben!

VETO! Dinge wie ServletConfig und ServletContext werden in Servlets als Instanzvariablen gehalten. Typischerweise sollten Instanzvariablen in der init()-Methode gesetzt und während der (parallelen) Requestverarbeitung nur gelesen werden. Wenn du dennnoch Instanzvariablen während der Requestverarbeitung modifizieren willst (z.B. irgendwelche Collections mit Daten befüllen oder weiß der Geier), dann solltest du die eine Zeile synchronisieren mit der Instanzvariablen als mutex.
Dein Veto verstehe ich nicht ganz, schliesslich sagst du auch nicht anderes als ich in diesem Punkt, ausser vielleciht dass du vorschlägst doch welche zu haben diese aber zu synchronieren/als mute zu deklarieren.
Ich bin da etwas radikaler, besser gar keine eigenen Instanzvariablen, es geht sehr gut ohne.

masseur81 hat gesagt.:
Eine andere Möglichkeit wäre die Verwendung des Interface SingleThreadModel. Damit werden mehrere Instanzen deines Servlets erzeugt, die wiederrum nur jeweils einmalig pro Zeitpunkt verwendet werden.
Abgesehen davon das die Performance erbärmlich mit STM ist, stellt es nicht sicher, das Servlets/Webanwendungen Threadsicher sind, schliesslich muss man auf ressourcen zugreifen, die auch von anderen Threads geändert werden könnten.
Das STM was eine Totgeburt, schon 2001 stand in jedem Servletbuch das es nicht verwendet werden sollte ;)
 

WeirdAl

Bekanntes Mitglied
Hi,
also ich habe jetzt 5 Servlet Mappings die auf ein zentrales Servlet "zeigen". Ich nutze InitParams in web.xml um das Verhalten des Servlets zu steuern.
Heisst das jetzt das im Tomcat eine Instanz dieses einen Servlets erzeugt wird und jeweils nur noch die .doPost(req,resp) neu aufgerufen wird? D.h. falls ich init() unbedingt pro Servletmapping nutze wollte, ich pro Mapping ein Servlet machen müsste?

Ich glaube ich muss mir die Servlet Spec wieder durchlesen :)

Cu
Alex
 

Ralf Ueberfuhr

Bekanntes Mitglied
Wenn du momentan ein Servlet mit Name und Klasse definierst, und 5 URLs darauf mappst, dann ist das immer dasselbe Objekt.

Wenn du 5 verschiedene Objekte haben willst ,dann musst du deine Servlet-Klasse im Deployment Descriptor als 5 Servlets definieren, und pro Servlet-Definition ein URL-Mapping vornehmen. Dann musst du auch 5mal Initialisierungsparameter definieren.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Jakarta Servlet API 5.0 Allgemeines EE 1
pkm Frage wegen AJAX-Zugriff auf ein Servlet Allgemeines EE 1
Dimax Servlet Servlet Kommunikation Allgemeines EE 18
K Unterschied zwischen JSP & Servlet gegenüber REST mittels JAX-RS Allgemeines EE 1
Dimax Servlet läuft in Eclipse, aber nicht im Browser Allgemeines EE 74
M URL Servlet Request getParameter Allgemeines EE 2
M Servlet Methoden Aufruf im Servlet Allgemeines EE 10
J 404 Not found (Servlet) Allgemeines EE 1
J Asynchrones Servlet löst NullPointerException aus Allgemeines EE 5
E Servlet Servlet das richtige? Allgemeines EE 11
B HTTP-Header-Inspektor-Servlet Allgemeines EE 1
N JSP Servlet mit JSP ansprechen Allgemeines EE 2
F Mehrere Bilder aus MySQL DB via Servlet darstellen. Allgemeines EE 1
J FTP und Servlet Allgemeines EE 11
H Post an Servlet Allgemeines EE 2
A Binärdatei vom Servlet erzeugen lassen Allgemeines EE 3
S Servlet Authentication Filter Allgemeines EE 0
S LDAP JAAS oder Servlet Allgemeines EE 0
G Problem: Servlet in JSP einbinden mit <jsp:include> Allgemeines EE 3
F eigene Anwendung per Servlet Container starten Allgemeines EE 9
F Servlet Daten im Speicher ablegen Allgemeines EE 3
L Servlet ClassNotFoundException Servlet Allgemeines EE 3
G Allgemeine Frage zu Authentifizierung mittels Servlet API Allgemeines EE 2
J Servlet "package does not exist" Allgemeines EE 5
K Servlet-Mapping Allgemeines EE 9
0 Servlet mit ArrayList Allgemeines EE 3
E Servlet unter mehreren Adressen Allgemeines EE 16
S Pfad-Zugriff über Servlet-init() Allgemeines EE 2
E Servlet Wie kann ich ohne Hilfe von Eclipse in JBoss mein servlet aufrufen Allgemeines EE 2
S Servlet.service() threw exception Allgemeines EE 4
A Servlet erkennt request Objekt nicht Allgemeines EE 8
G Direkter Zugriff auf Servlet- doPost Allgemeines EE 15
G Servlet doGet, doPost Allgemeines EE 3
A Kodierungsproblem bei Parameterübergabe von Browser an Servlet (GET) Allgemeines EE 2
Antoras servlet-mapping auf dynamische URLs Allgemeines EE 17
0 Problem mit librarys javax.servlet.http.HttpServletRequest cannot be resolved Allgemeines EE 1
MQue Ajax - Servlet Allgemeines EE 2
MQue Servlet Allgemeines EE 9
S [Design] Dynamischer EJB Aufruf von Servlet Allgemeines EE 3
S Servlet auf JBoss 5? Allgemeines EE 11
B HttpSession bekommen wenn nicht in Servlet Allgemeines EE 8
MQue Servlet / Button Allgemeines EE 5
S In Eclipse werden die "Servlet-Klassen" nicht gefu Allgemeines EE 2
U javax.faces und javax.servlet cannot be resolved Allgemeines EE 2
W Potentielles Memory Leak bei Servlet Allgemeines EE 6
B unterschied servlet und bean Allgemeines EE 2
Escorter Servlet .sar und jede Menge .jar Archive Allgemeines EE 2
N Servlet und JSF (URL-Rewriting)? Allgemeines EE 3
A jsf: Servlet aufrufen, wie geht das? web.xml Fehler? Allgemeines EE 13
N Servlet zyklisch aktualisieren Allgemeines EE 2
zilti Verbindung Applet <-> Servlet Allgemeines EE 5
ARadauer Servlet Bild Rückgabe Allgemeines EE 2
I Über Formular Daten zu Servlet Allgemeines EE 36
H Servlet - Zwischenmeldung anzeigen bei längerer Berechnung Allgemeines EE 2
G Ordner mit Umlauten einlesen - Servlet Allgemeines EE 3
A web.xml für Servlet in Tomcat 5.5 erstellen Allgemeines EE 2
M Zwei Buttons in einem Servlet Allgemeines EE 2
M Servlet lässt sich nicht aufrufen Allgemeines EE 6
A web.xml für Servlet in Tomcat erstellen Allgemeines EE 6
B Servlet Allgemeines EE 3
G EJB - EJB wird nicht ins Servlet geladen Allgemeines EE 3
K load-on-startup -> in der Servlet Klasse Allgemeines EE 6
G Objekt an Servlet übergeben - oder Objekt global definieren? Allgemeines EE 4
R Zugriff auf Filter Servlet Allgemeines EE 10
I JBOSS Jsp Files Pfad im Servlet? Allgemeines EE 4
N Servlet-Request abbrechen? Allgemeines EE 3
D Java Servlet mit Radio Buttons Allgemeines EE 2
G Servlet debugging Allgemeines EE 8
N Thread von Servlet aus starten Allgemeines EE 16
N JSP: Collection im Servlet überwachen (mit AJAX)? Allgemeines EE 5
J Socket daten darstellen per jsp,servlet Allgemeines EE 2
W servlet über https Allgemeines EE 2
L Servlet kann Funktion nicht aufrufen Allgemeines EE 3
B Parameterübergane von Servlet an JSP funktioniert nicht ? Allgemeines EE 2
M Aus einem Servlet auf ein anderes zugreifen ? Allgemeines EE 2
G Servlet Serializable Allgemeines EE 2
B Servlet-Api.jar auf JBoss? (Migration von Tomcat zu JBoss) Allgemeines EE 4
H Servlet - Importieren von Code Allgemeines EE 2
P Java Servlet - Umgang mit Verlinkungen Allgemeines EE 7
M Wert aus Servlet an normale Klasse übergeben Allgemeines EE 2
E Servlet soll JFRame öffnen. Jframe.setvisible schlägtfehl Allgemeines EE 2
M servlet --> jsp - problem beim umstrukturieren Allgemeines EE 5
D Servlet Problem über Server Allgemeines EE 26
K Servlet per Formular aufrufen Allgemeines EE 8
L sessions mit servlet oder jsp ? Allgemeines EE 9
B JSF - Servlet mit Parametern über einen Link öffnen Allgemeines EE 3
D Binärdaten im Servlet entgegen nehmen, aber wie? Allgemeines EE 5
T Servlet-Instanzen und ServletContext Allgemeines EE 2
L speichern von daten mittels servlet in xml Allgemeines EE 8
N Collection überwachen (Servlet + AJAX) Allgemeines EE 3
N Liste mit Checkboxen an Servlet übergeben? Allgemeines EE 3
T Wie Datenbank und Servlet koppeln? Allgemeines EE 3
G Ladeseite anzeigen lassen während das Servlet noch arbeitet? Allgemeines EE 6
P Tomcat Servlet POST Daten als Array Allgemeines EE 2
P PDF per Servlet übertragen, danach keinen Inhalt mehr Allgemeines EE 12
N JSP kann Servlet nicht aufrufen! :-( Allgemeines EE 2
J Servlet Parameter aus web.xml übergeben, wie zugreifen? Allgemeines EE 2
L servlet.jar ? Allgemeines EE 2
K Servlet: Respone.redirect mit POST-Parametern Allgemeines EE 5
S kann eigenes object nicht von applet zu servlet senden Allgemeines EE 3

Ähnliche Java Themen

Neue Themen


Oben