2010-11-19 12 views
4

センサーからJSON形式で送信された観測情報を受け取るTomcatサーバーが配備されています。私は、使いたいオントロジーを記述したセンサーも持っています。Tomcat起動時にオブジェクトをインスタンス化する

しかし、センサの観測値がサーバによって受信される前にオントロジをロードしたいと思います。 Tomcatがロードされるとすぐにオブジェクトをインスタンス化するにはどうすればよいですか?

+0

Dupes:http://stackoverflow.com/questions/3289737/load-on-startup-tomcat、http://stackoverflow.com/questions/2057563/how-do-i-run-a-method-before -republishing-to-jboss、http://stackoverflow.com/questions/3468150/using-init-servlet、http://stackoverflow.com/questions/2364390/i-want-to-use-a-method-whichサーバーへのデプロイ後に1回のみと呼ばれる、http://stackoverflow.com/questions/4175726/how-do-i-load-a-java-class-not-a-servlet-when -the-tomcat-server-starts、etc..etc .. – BalusC

答えて

7

アプリケーションは、あなたがServletContextListenerを使用する必要がありますを開始または停止したときにアクションを実行するには:http://download.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html

web.xml:

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

このソリューションはPeter Knegoの提案とは対照的に、任意のサーブレットコンテナに移植可能であり、Tomcatに限定されていません。

+0

+1:サーブレットクラスに概念的に*属しているのかどうかに依存して、Servlet.init()ソリューションよりもきれいです。 –

+0

それは確かに行く方法です。 – BalusC

1

厳密に言えば、というサーブレットがTomcatによってロードされるとすぐにオブジェクトをインスタンス化するとします。 (アプリケーション固有の機能のためにTomcat自体を変更することは実際には意味がありません)。

この場合、Servletクラスはinit(ServletConfig config)メソッドをオーバーライド/実装できます。これは、サーブレットが初期化されるときにサーブレットコンテナ(この場合はTomcat)によって呼び出され、ここで参照している種類のような静的起動ロジックを実行するのに適しています。

実際、サーブレットはinitメソッドが返されるまで接続を受け取ることさえできないため、センサーの観測が到着する前にオントロジが完全にロードされることを保証できます。

+0

これは動作するようです!しかし、私は今オントロジーに問題があります。私が確認できると答えを受け入れます。 – Bailz

0

event listenersは、Webアプリケーション(contex)が読み込まれたときに呼び出されます。ここでオブジェクトを初期化し、ServletContextに保存します。ここで、それらのオブジェクトはアプリ内のすべてのサーブレットで使用できるようになります。

ServletContextListenerを実装し、それにcontextInitialized()プットです:次に

contextInitialized(ServletContextEvent sce){ 

    // Create your objects 
    Object myObject = ... 

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

のTomcatのcontext.xmlでregister the listener

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