2011-03-17 100 views

回答

6

您可以在web.xml中包含「ContextListener」。當Webb應用程序WAR即將部署/啓動時,將創建此類的一個實例。

此代碼可以啓動一個線程,該線程將繼續運行直到部署應用程序。

例子:http://www.javafaq.nu/java-example-code-233.html

+0

這樣的話,如果我需要一個程序來連續運行,然後我該怎麼辦? – ayyappa 2011-03-17 08:11:33

+0

您可以執行System.exec來啓動進程。即使應用程序未部署或容器停止,該進程仍會繼續運行。 – 2011-03-17 08:15:16

+0

先生,我需要運行一個可以在部署後在後臺連續運行的servlet ..我該怎麼做?有什麼建議麼? – ayyappa 2011-03-17 08:35:32

9

回想起一個老問題,因爲唯一的答案不顯示任何實例。

爲了運行每當一個Web應用程序WAR部署/取消部署或Tomcat啓動時的代碼定製片/停止,您需要:

  1. 落實ServletContextListener監聽器和它的方法contextInitialized()contextDestroyed()
  2. 讓Tomcat知道你的實現。根據documentation,您可以將實現類添加到部署描述符中,使用WebListener對其進行註釋,或者通過ServletContext上定義的addListener()方法之一對其進行註冊。

這裏是(基於this post)的示例:

package com.example; 
import javax.servlet.ServletContext; 
import javax.servlet.ServletContextEvent; 
import javax.servlet.ServletContextListener; 

public class MyServletContextListener implements ServletContextListener { 
    /** The servlet context with which we are associated. */ 
    private ServletContext context = null; 

    @Override 
    public void contextDestroyed(ServletContextEvent event) { 
     log("Context destroyed"); 
     this.context = null; 
    } 

    @Override 
    public void contextInitialized(ServletContextEvent event) { 
     this.context = event.getServletContext(); 
     log("Context initialized"); 
    } 

    private void log(String message) { 
     if (context != null) { 
      context.log("MyServletContextListener: " + message); 
     } else { 
      System.out.println("MyServletContextListener: " + message); 
     } 
    } 
} 

並添加以下到web.xml(或備選地,可使用WebListener註解或addListener()法):

<web-app id="WebApp_ID" version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> 
    ... 
    <listener> 
     <listener-class>com.example.MyServletContextListener</listener-class> 
    </listener> 
</web-app> 
0

我找到一種方法來僅在應用程序(* .war)部署時運行一些代碼: 它至少適用於使用java servlet的澤西島servlet使用javax.ws.rs.core.Application。

ApplicationConfig.java文件中的應用程序(請參見下文)包含一個方法public getClasses,它在應用程序部署時調用。 因此,在getClasses中添加代碼會導致它在應用程序部署時執行。我注意到唯一的洞穴是奇怪的是這個函數被調用兩次,不知道爲什麼,所以我在ApplicationConfig類中添加了一個全局變量來知道我的代碼是否已經運行。

這裏是我的解決方案:

package eu.oca; 

import java.util.Set; 
import javax.ws.rs.core.Application; 

/**                                
*                                
* @author mattei                            
*/ 
@javax.ws.rs.ApplicationPath("jersey") 
public class ApplicationConfig extends Application { 

    private boolean alreadyRun = false; 

    @Override 
    public Set<Class<?>> getClasses() { 

     System.out.println("Sidonie : ApplicationConfig : getClasses : alreadyRun = " + String.valueOf(alreadyRun)); 
     alreadyRun = true; 
     Set<Class<?>> resources = new java.util.HashSet<>(); 
     addRestResourceClasses(resources); 
     return resources; 
    } 

    /**                               
    * Do not modify addRestResourceClasses() method.                   
    * It is automatically populated with                      
    * all resources defined in the project.                      
    * If required, comment out calling this method in getClasses().                
    */ 
    private void addRestResourceClasses(Set<Class<?>> resources) { 
     resources.add(eu.oca.ResultatGeneralAF.class); 
     resources.add(eu.oca.ResultatGeneralF.class); 
     resources.add(eu.oca.ResultatMesuresAF.class); 
     resources.add(eu.oca.ResultatMesuresF.class); 
     resources.add(eu.oca.SidonieAccueilD.class); 
     resources.add(eu.oca.SidonieWelcomeR.class); 
    } 

} 
相關問題