2011-03-17 18 views

Respuesta

6

Puede incluir un "ContextListener" en web.xml. Se creará una instancia de esta clase cuando la aplicación WAR de Webb esté a punto de implementarse/iniciarse.

Este código puede iniciar un hilo que seguirá ejecutándose hasta que se despliegue la aplicación.

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

+0

por lo tanto, si necesito que el programa se ejecute de forma continua a continuación, ¿qué debo hacer? – ayyappa

+0

Puede hacer System.exec para iniciar un proceso. Ese proceso se mantendría funcionando incluso cuando la aplicación no se haya desplegado o el contenedor se detenga. –

+0

Señor, necesito ejecutar un servlet que pueda ejecutarse continuamente en segundo plano después de su implementación ... ¿cómo lo hago? ¿alguna sugerencia? – ayyappa

9

La reactivación de una vieja cuestión ya que la única respuesta no muestra ningún ejemplo.

Con el fin de ejecutar una pieza personalizada de código cada vez que un WAR de la aplicación Web se despliega/sin desplegar o se inicia Tomcat/parada, es necesario:

  1. implementar el ServletContextListener oyente y sus métodos contextInitialized() y contextDestroyed().
  2. Informe a Tomcat acerca de su implementación. De acuerdo con documentation, puede agregar la clase de implementación al descriptor de implementación, anotarla con WebListener, o registrarla a través de uno de los métodos addListener() definidos en ServletContext.

Aquí es un ejemplo (basado en 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); 
     } 
    } 
} 

Y añadir lo siguiente a web.xml (o, alternativamente, utilizar la anotación WebListener o addListener() método):

<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

i encuentre una manera de ejecutar algún código solo en la implementación de la aplicación (* .war): funciona al menos para los servlets de jersey con el servlet de Java usando javax.ws.rs.core.Application.

La aplicación en el archivo ApplicationConfig.java (ver a continuación) contiene un método público getClasses al que se llama durante la implementación de la aplicación. Por lo tanto, agregar código en getClasses hace que se ejecute en la implementación de la aplicación. La única cueva que noté es que extrañamente esta función se llama dos veces, no sé por qué, así que agregué una variable global en la clase ApplicationConfig para saber si mi código ya se ha ejecutado.

Aquí está mi solución:

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); 
    } 

} 
Cuestiones relacionadas