Servlet: init() wird 2x ausgeführt

Status
Nicht offen für weitere Antworten.

HyperHyper

Mitglied
Habe ein Servlet erzeugt (läuft unter Tomcat 5.0) welches in der Methode init() jetzt nur mal eine Konsolenausgabe macht damit ich nachschauen kann ob das läuft. Wenn ich nun den Tomcat starte und mit dem Browser auf das Servlet zugreife, klappt auch alles wunderbar. Die Meldung aus init() wird angezeigt. Nehme ich nun das Lasttestprogramm JMeter und erzeuge mit diesem einen Request, so wird die init() erneut ausgeführt obwohl dies überhaupt nicht sein dürfte!

Hier der Auszug aus nem Buch, was mich nun irritiert:
The init method is called when the servlet is first created; it is not called again for each user
request. So, it is used for one-time initializations, just as with the init method of applets.

Jemand ne Idee was das sein könnte? Laut diverser Bücher wird die init() nur ein einziges mal aufgerufen und zwar wenn das Servlet initialisiert wird.


Code:
public void init() throws ServletException
{
  System.out.println("Servlet wurde initialisiert!");
}


Link: JMeter http://jakarta.apache.org/jmeter/
 

Leroy42

Top Contributor
Du kannst schon davon ausgehen, daß jeder Browser die init-Methode
tatsächlich nur einmal aufruft.

Da der JMeter ja ausschließlich der Performance-Messung dient,
würde ich mir über den doppelten init-Aufruf nicht allzuviel Sorgen machen.

Zur Not spendierst du deinem Applet, während seiner JMeter-Messung, einfach
noch eine boolean-Instanzvariable, mit der du verhinderst, daß kritischer
Code erneut aufgerufen wird.

Code:
public void init() {
  if (!inited) {
    ...
  }
}
 

HyperHyper

Mitglied
Also die Init-Methode soll eigentlich nur 1x aufgerufen werden, und zwar wenn das Servlet zum ersten mal initialisiert wird. Danach soll Init() nie mehr aufgerufen werden egal wie oft nun auf das Servlet zugegriffen wird. Würde in der Init() gerne Konfigurationsdaten einlesen, allerdings werden diese wie im vorherigen Thread beschrieben nun 2x eingelesen.

Den Trick mit einer boolean-Instanzvariable habe ich auch schon probiert, das hat nicht geholfen. Wie gesagt, als JMeter darauf zugriff wurde plötzlich eine neue Servlet-Instanz aktiviert.

Habe hier noch folgenden Hinweis gefunden:
Hinweis: Obwohl der Servlet-Server in der Regel mehrere Threads initialisiert, die auf die init()-Methode zugreifen, kann die init()-Methode mehrfach aufgerufen werden, um mehrere Exemplare einer Servlet-Klasse zu erzeugen. Dann ist es ungünstig, Ressourcen wie Datenbankverbindungen ständig neu anzufordern, obwohl vielleicht schon eine andere init()-Methode dies gemacht hat. Da es mehrere Exemplare der Servlet-Klasse im Servlet-Container geben kann, sollten statische Initialisierungen nicht in der init()-Methode durchgeführt werden.
http://www.galileocomputing.de/open...sel17_016.htm#Rxx747java17016040006BA1F02410E


Also wenn das mit dem Init() nicht klappen sollte, hat jemand eine Idee wie ich es schaffen könnte das eine Konfiguration nur 1x ausgeführt wird wenn das Servlet gestartet wird?
 
R

Roar

Gast
es geht um servlets nich um applets.
da is auch nix mit browsern :noe:
 

Leroy42

Top Contributor
Ach du redest von einem Servlet, ich hab' fälschlicherweise Applet gelesen. :oops:

Von deinem Servlet werden, je nach Servlet-Container's Lust und Laune, bei
jedem Aufruf neue Instanzen kreiert oder bereits vorhandene genutzt.

Wenn du eine Initialisierunsmethode nur einmal aufgerufen haben willst,
mach sie static in der Art

Code:
public class MyServlet extends HTTPServlet {
  static {
    myStaticInit();
  }
  ...
  static void myStaticInit() {
  // wird garantiert nur einmal aufgerufen
  }
}
 

HyperHyper

Mitglied
Hat leider auch nicht geklappt. Sobald ich mit JMeter eine HTTP-Request-Anfrage sende, wird eine neue Servlet-Instanz erzeugt welche den Code der in "static void myStaticInit()" steht erneut ausführt.

Wenn schon JMeter eine neue Instanz erzeugen kann, so kann das doch auch jeder andere Browser machen oder? Ist halt nicht hilfreich wenn meine Konfiguration mehrmals eingelesen wird. Muss man eventuell bei der Tomcat-Konfiguration etwas einstellen damit jeder Request nur einen Thread erzeugt und keine neue Servlet-Instanz?

Ich würde nämlich gerne jeden Request auswerten und z.B. den Request-URL in einen einzigen ArrayList (implementiert als Singleton) reinschreiben lassen. So wie es gerade ist, würde es dann plötzlich 2 ArrayListen geben, jede mit unterschiedlichen Daten. Das darf natürlich nicht sein.
 

Leroy42

Top Contributor
HyperHyper hat gesagt.:
wird eine neue Servlet-Instanz erzeugt welche den Code der in "static void myStaticInit()" steht erneut ausführt.

Das passiert mit Sicherheit nicht.

Es sieht so aus, als ob nicht nur eine neue Servlet-Instanz erzeugt wird, sondern die
Klasse tatsächlich mehrfach geladen wird, denn so wie ich es eben gecodet habe,
wird die myStaticInit-Methode nur einmal beim Laden der Klasse ausgeführt.

Also, ich weiß da auch nicht weiter ???:L
 

Terminator

Aktives Mitglied
Also ich hab auch das Problem unter nem SJSAS.
Init Methode wird mehrfach ausgeführt.

Meiner Meinung nach könnte das sein dass die Application irgendwie mehrfach unter verschiedenen Contexten deployed wird.
Bei mir tritt das hauptsächlich ein, wenn ich auf Entwickler Rechner einen Deploy mit nen Pfad zur App angebe.

Wenn ich aber ne war deploy, die der Container in sein eigenes Verzeichnis entpackt funzts.
(soweit ich bisher beobachtet habe)
 

HyperHyper

Mitglied
So ich denk mal ich habe anhand des Tipps vom Terminator herausgefunden woran es liegt - und zwar am Mapping. Ich hatte in der web.xml ein doppeltes Mapping drinnen stehen um die verschiedenen Schreibweisen zu berücksichtigen. Siehe hier:

Code:
  <servlet-mapping>
    <servlet-name>testservlet</servlet-name>
    <url-pattern>/testservlet</url-pattern>
  </servlet-mapping>
  
  <servlet-mapping>
     <servlet-name>testservlet</servlet-name>
     <url-pattern>/TestServlet</url-pattern>
  </servlet-mapping>


Unglücklicherweise hatte ich vom Browser aus mein Servlet immer mit "../testservlet" und vom JMeter aus mit "../Testservlet" aufgerufen gehabt. Dies hat dazu geführt das nun 2 Exemplare meiner Servlet-Klasse existierten.

So, nun wissen wir alle wieder etwas mehr :)

Danke für eure hilfe! :toll:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Pfad-Zugriff über Servlet-init() Allgemeines EE 2
J init-Methode eines Servlet ausführen ohne vorherigen request Allgemeines EE 2
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
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
W Was bei Servlet-Entwicklung alles beachten? Allgemeines EE 8
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

Ähnliche Java Themen


Oben