2010-11-19 4 views
4

У меня установлен сервер Tomcat, который получает наблюдения, передаваемые с датчиков в формате JSON. У меня также есть датчик, описывающий онтологию, которую я хочу использовать.Мгновенный объект при запуске 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 -is-called-only-once-after-deploy-to-server, 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> 

В отличие от предложения Питера Кнего это решение переносится в любой контейнер сервлетов и не ограничивается Tomcat.

+0

+1: Это, вероятно, более чистое, чем мое решение Servlet.init(), в зависимости от того, концептуально ли онтология * принадлежит * в классе сервлетов или просто переписывается на ее жизненном цикле. –

+0

Это действительно путь. – BalusC

1

Я предполагаю, что строго говоря, что вы хотите сделать, это создать объект, как только ваш сервлет загружен Tomcat. (На самом деле не было бы смысла модифицировать Tomcat для специфических для приложения функций).

В этом случае ваш класс Servlet может переопределить/реализовать метод init(ServletConfig config). Это вызвано контейнером сервлета (Tomcat в этом случае), когда сервлет инициализируется, и это именно то место, где нужно выполнить статическую логику запуска, такую ​​как вид, о котором вы говорите здесь.

На самом деле сервлет даже не сможет получать соединения до тех пор, пока его метод init не вернется, поэтому вы можете гарантировать, что онтология будет полностью загружена до того, как будут получены наблюдения датчика.

+0

Кажется, что это работает! Однако сейчас у меня проблемы с онтологией. Примите ответ, когда я смогу подтвердить. – Bailz

0

Вы можете использовать event listeners, которые вызывают при загрузке веб-приложения (contex). Там вы инициализируете свои объекты и сохраняете их до ServletContext, где они будут доступны для всех сервлетов в вашем приложении.

Реализовать ServletContextListener и в это contextInitialized() положить:

contextInitialized(ServletContextEvent sce){ 

    // Create your objects 
    Object myObject = ... 

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

Тогда register the listener в Tomcat context.xml:

<Context path="/examples" ...> 
    ... 
    <Listener className="com.mycompany.mypackage.MyListener" ... > 
    ... 
</Context> 
Смежные вопросы