Hallo,
ich bin noch ziemlich neu bzgl. Servlets und Tomcat und bin
derzeit dabei, eine Applikation als Servlet zu exportieren und
ans Web anzuschließen.
Dabei bin ich aber nun auf ein Problem gestossen, bei dem ich
nun einfach nicht mehr weiterkomme.
Mein System: Linux 2.6.8.1, Apache Tomcat/4.1
Es handelt sich bei dem Programm um ein Suchprogramm, das aus
einem größeren XML-Dokument gewisse Daten ausliest und diese
dann intern in einer von mir selbst organisierten
Datenstruktur hält. Der Benutzer kann nun eine Eingabe tätigen
und anhand dieses Inputs sucht das Programm in seiner
Datenstruktur nach der passenden Antwort.
Das Programm lief bisher in der Konsole und dabei einwandfrei.
Nun soll der Benutzer das Programm aber über ein Servlet per
Browser abfragen können.
Ich habe also angefangen, ein Servlet zu schreiben und dachte
mir, da das Erstellen der Datenstruktur einige Zeit
beansprucht und sich die Daten nicht ändern, dies nur einmal
zu machen, also eine Instanzvariable des Typs "SuchProgramm"
im Servlet zu halten und es in der init-Methode zu
initialisieren. Die Requests nutzen dann nur die
Abfragemethode suche(String input) und erhalten die Antwort
zurück.
Also in etwa so:
<PRE>
public class SuchServlet
extends HttpServlet
{
static SuchProgramm suchproramm;
public void init()
{
suchprogramm = new SuchProgramm();
suchprogramm.init();
}
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws IOException, ServletException
{
String input = request.getParameter( "input" );
String answer = suchprogramm.suche( input );
// usw. Antwort zurückgeben
}
//doPost usw.
}
</PRE>
Das funktioniert leider nicht richtig, meistens stürzt Tomcat
einfach ab. Das komische ist aber, wenn ich sämtliche Klassen
im classes-Verzeichnis von Tomcat neu kompiliere und
unmittelbar darauf Tomcat neu starte und eine Anfrag starte,
funktioniert es. Auch wenn ich dann Tomcat neu starte geht es.
Wenn ich dann aber den PC reboote und nach dem Hochfahren eine
neue Anfrage starte, geht es wieder nicht.
Wenn ich das Suchprogramm nicht persistent als Instanzvariable
halte funktioniert es auch einwandfrei z.B.:
<PRE>
public class SuchServlet
extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws IOException, ServletException
{
SuchProgramm suchprogramm = new SuchProgramm();
suchprogramm.init();
String input = request.getParameter( "input" );
String answer = suchprogramm.suche( input );
// usw. Antwort zurückgeben
}
//doPost usw.
}
</PRE>
Hier ist ein Auszug aus der Log-Datei von Tomcat (bei
Nichtfunktionieren):
2004-11-01 01:33:09 invoker: init: Associated with Context
'/webdav'
2004-11-01 01:33:09 jsp: init
2004-11-01 01:33:09 HostConfig[localhost]: Starting
background thread
2004-11-01 01:33:09 HostConfig[localhost]: BACKGROUND THREAD
Starting
2004-11-01 01:33:10 StandardHost[localhost]: Mapping request
URI '/examples/servlet/SuchServlet'
2004-11-01 01:33:10 StandardHost[localhost]: Trying the
longest context path prefix
2004-11-01 01:33:10 StandardHost[localhost]: Mapped to
context '/examples'
2004-11-01 01:33:10 invoker: included='false',
requestURI='/examples/servlet/SuchServlet'
2004-11-01 01:33:10 invoker: servletPath='/servlet',
pathInfo='/HelloServlet'
2004-11-01 01:33:10 invoker: Processing servlet 'SuchServlet'
with path info ''
2004-11-01 01:33:10 invoker: Creating wrapper for
'SuchServlet' with mapping '/servlet/SuchServlet/*'
2004-11-01 01:33:10 org.apache.catalina.INVOKER.SuchServlet:
init
2004-11-01 01:33:10 HostConfig[localhost]: HostConfig:
Processing STOP
2004-11-01 01:33:10 HostConfig[localhost]: Stopping
background thread
2004-11-01 01:33:10 HostConfig[localhost]: Deploying
discovered web applications
2004-11-01 01:33:10 HostConfig[localhost]: BACKGROUND THREAD
Stopping
2004-11-01 01:33:10 HostConfig[localhost]: Undeploying
deployed web applications
2004-11-01 01:33:10 HostConfig[localhost]: Undeploying web
application at context path /webdav
2004-11-01 01:33:10 StandardHost[localhost]: Removing web
application at context path /webdav
2004-11-01 01:33:10 HostConfig[localhost]: Undeploying web
application at context path /examples
2004-11-01 01:33:10 StandardHost[localhost]: Removing web
application at context path /examples
2004-11-01 01:33:10 SessionListener: contextDestroyed()
2004-11-01 01:33:10 ContextListener: contextDestroyed()
Es geht also bis zur Aktion
org.apache.catalina.INVOKER.HelloServlet: init
dann bricht das Ganze komischerweise ab.
Es muss meiner Meinung nach irgendwas mit der Persistenz des
Suchprogramms zu tun haben aber nur was genau?
Ist dafür eventuell eine spezielle Tomcat-Einstellung nötig?
Ich google nun schon seit Tagen, komme aber einfach nicht mehr
weiter.
Kann mir hier bitte jemand helfen?
Gruß,
Jens
ich bin noch ziemlich neu bzgl. Servlets und Tomcat und bin
derzeit dabei, eine Applikation als Servlet zu exportieren und
ans Web anzuschließen.
Dabei bin ich aber nun auf ein Problem gestossen, bei dem ich
nun einfach nicht mehr weiterkomme.
Mein System: Linux 2.6.8.1, Apache Tomcat/4.1
Es handelt sich bei dem Programm um ein Suchprogramm, das aus
einem größeren XML-Dokument gewisse Daten ausliest und diese
dann intern in einer von mir selbst organisierten
Datenstruktur hält. Der Benutzer kann nun eine Eingabe tätigen
und anhand dieses Inputs sucht das Programm in seiner
Datenstruktur nach der passenden Antwort.
Das Programm lief bisher in der Konsole und dabei einwandfrei.
Nun soll der Benutzer das Programm aber über ein Servlet per
Browser abfragen können.
Ich habe also angefangen, ein Servlet zu schreiben und dachte
mir, da das Erstellen der Datenstruktur einige Zeit
beansprucht und sich die Daten nicht ändern, dies nur einmal
zu machen, also eine Instanzvariable des Typs "SuchProgramm"
im Servlet zu halten und es in der init-Methode zu
initialisieren. Die Requests nutzen dann nur die
Abfragemethode suche(String input) und erhalten die Antwort
zurück.
Also in etwa so:
<PRE>
public class SuchServlet
extends HttpServlet
{
static SuchProgramm suchproramm;
public void init()
{
suchprogramm = new SuchProgramm();
suchprogramm.init();
}
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws IOException, ServletException
{
String input = request.getParameter( "input" );
String answer = suchprogramm.suche( input );
// usw. Antwort zurückgeben
}
//doPost usw.
}
</PRE>
Das funktioniert leider nicht richtig, meistens stürzt Tomcat
einfach ab. Das komische ist aber, wenn ich sämtliche Klassen
im classes-Verzeichnis von Tomcat neu kompiliere und
unmittelbar darauf Tomcat neu starte und eine Anfrag starte,
funktioniert es. Auch wenn ich dann Tomcat neu starte geht es.
Wenn ich dann aber den PC reboote und nach dem Hochfahren eine
neue Anfrage starte, geht es wieder nicht.
Wenn ich das Suchprogramm nicht persistent als Instanzvariable
halte funktioniert es auch einwandfrei z.B.:
<PRE>
public class SuchServlet
extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse
response)
throws IOException, ServletException
{
SuchProgramm suchprogramm = new SuchProgramm();
suchprogramm.init();
String input = request.getParameter( "input" );
String answer = suchprogramm.suche( input );
// usw. Antwort zurückgeben
}
//doPost usw.
}
</PRE>
Hier ist ein Auszug aus der Log-Datei von Tomcat (bei
Nichtfunktionieren):
2004-11-01 01:33:09 invoker: init: Associated with Context
'/webdav'
2004-11-01 01:33:09 jsp: init
2004-11-01 01:33:09 HostConfig[localhost]: Starting
background thread
2004-11-01 01:33:09 HostConfig[localhost]: BACKGROUND THREAD
Starting
2004-11-01 01:33:10 StandardHost[localhost]: Mapping request
URI '/examples/servlet/SuchServlet'
2004-11-01 01:33:10 StandardHost[localhost]: Trying the
longest context path prefix
2004-11-01 01:33:10 StandardHost[localhost]: Mapped to
context '/examples'
2004-11-01 01:33:10 invoker: included='false',
requestURI='/examples/servlet/SuchServlet'
2004-11-01 01:33:10 invoker: servletPath='/servlet',
pathInfo='/HelloServlet'
2004-11-01 01:33:10 invoker: Processing servlet 'SuchServlet'
with path info ''
2004-11-01 01:33:10 invoker: Creating wrapper for
'SuchServlet' with mapping '/servlet/SuchServlet/*'
2004-11-01 01:33:10 org.apache.catalina.INVOKER.SuchServlet:
init
2004-11-01 01:33:10 HostConfig[localhost]: HostConfig:
Processing STOP
2004-11-01 01:33:10 HostConfig[localhost]: Stopping
background thread
2004-11-01 01:33:10 HostConfig[localhost]: Deploying
discovered web applications
2004-11-01 01:33:10 HostConfig[localhost]: BACKGROUND THREAD
Stopping
2004-11-01 01:33:10 HostConfig[localhost]: Undeploying
deployed web applications
2004-11-01 01:33:10 HostConfig[localhost]: Undeploying web
application at context path /webdav
2004-11-01 01:33:10 StandardHost[localhost]: Removing web
application at context path /webdav
2004-11-01 01:33:10 HostConfig[localhost]: Undeploying web
application at context path /examples
2004-11-01 01:33:10 StandardHost[localhost]: Removing web
application at context path /examples
2004-11-01 01:33:10 SessionListener: contextDestroyed()
2004-11-01 01:33:10 ContextListener: contextDestroyed()
Es geht also bis zur Aktion
org.apache.catalina.INVOKER.HelloServlet: init
dann bricht das Ganze komischerweise ab.
Es muss meiner Meinung nach irgendwas mit der Persistenz des
Suchprogramms zu tun haben aber nur was genau?
Ist dafür eventuell eine spezielle Tomcat-Einstellung nötig?
Ich google nun schon seit Tagen, komme aber einfach nicht mehr
weiter.
Kann mir hier bitte jemand helfen?
Gruß,
Jens
Comment