2010-11-19 6 views
4

Ich habe einen Tomcat-Server bereitgestellt, der von Sensoren im JSON-Format übertragene Beobachtungen empfängt. Ich habe auch einen Sensor, der die Ontologie beschreibt, die ich benutzen möchte.Instanziieren Objekt, wenn Tomcat startet

Allerdings würde Ich mag die Ontologie laden, bevor Sensorbeobachtungen vom Server empfangen werden. Wie kann ich ein Objekt instanziieren, sobald Tomcat geladen ist?

+0

Dupes: http://stackoverflow.com/questions/3289737/load-on-startup-tomcat, http://stackoverflow.com/questions/2057563/how-do-i-run-a-method-before -republishing-zu-jboss, http://stackoverflow.com/questions/3468150/using-init-servlet, http://stackoverflow.com/questions/2364390/i-want-to-use-a-method-which -ist-genannt-nur-einmal-nach-Bereitstellung-zu-Server, http://stackoverflow.com/questions/4175726/how-do-i-load-a-java-class-not-a-servlet-when -the-tomcat-server-startet, etc..etc .. – BalusC

Antwort

7

Aktionen auszuführen, wenn die Anwendung startet oder stoppt Sie eine ServletContextListener verwenden sollte: http://download.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html

In web.xml:

<web-app> 
    ... 
    <listener> 
     <listener-class>com.example.Listener</listener-class> 
    </listener> 
    ... 
</web-app> 

Im Gegensatz zu Peter Knegos Vorschlag ist diese Lösung portabel zu jedem Servlet-Container und nicht auf Tomcat beschränkt.

+0

+1: Das ist wahrscheinlich sauberer als meine Servlet.init() - Lösung, je nachdem, ob die Ontologie konzeptionell * in der Servlet-Klasse * ist oder nur ihren Lebenszyklus verkürzt. –

+0

Es ist in der Tat der Weg zu gehen. – BalusC

1

Ich vermute, dass genau das, was Sie tun möchten, ein Objekt instanziieren, sobald Ihr Servlet von Tomcat geladen wird. (Es wäre nicht wirklich sinnvoll, Tomcat selbst für eine anwendungsspezifische Funktionalität zu modifizieren).

In diesem Fall kann Ihre Servlet Klasse die Methode überschreiben/implementieren. Dies wird vom Servlet-Container (in diesem Fall Tomcat) aufgerufen, wenn das Servlet initialisiert wird, und es ist genau der richtige Ort, um eine statische Startlogik auszuführen, z. B. die Art, auf die Sie hier verweisen.

Tatsächlich kann das Servlet nicht einmal Verbindungen empfangen, bis seine Init-Methode zurückgegeben wurde, so dass Sie garantieren können, dass die Ontologie vollständig geladen wird, bevor die Sensorbeobachtungen eintreffen.

+0

Das sieht aus wie es funktioniert! Allerdings habe ich jetzt Probleme mit der Ontologie. Wird Antwort annehmen, wenn ich bestätigen kann. – Bailz

0

könnten Sie event listeners verwenden, die aufgerufen werden, wenn die Web-App (contex) geladen wird. Dort initialisieren Sie Ihre Objekte und speichern sie unter ServletContext, wo sie für alle Servlets in Ihrer App verfügbar sind.

ServletContextListener implementieren und in seiner contextInitialized() Put:

contextInitialized(ServletContextEvent sce){ 

    // Create your objects 
    Object myObject = ... 

    sce.getServletContext().setAttribute("myObjectKey", myObject); 
} 

Dann register the listener in Tomcat context.xml:

<Context path="/examples" ...> 
    ... 
    <Listener className="com.mycompany.mypackage.MyListener" ... > 
    ... 
</Context>