¿Hay algún método o API que pueda usar para que cada vez que implemente un nuevo archivo WAR, se ejecute una parte del código o quizás cuando se inicie Tomcat, el servlet respectivo debería iniciar o ejecutar algún código continuamente.¿Se puede ejecutar algún código cuando desplegamos por primera vez un archivo WAR?
Respuesta
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.
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:
- implementar el
ServletContextListener
oyente y sus métodoscontextInitialized()
ycontextDestroyed()
. - 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étodosaddListener()
definidos enServletContext
.
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>
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);
}
}
- 1. ¿Cómo puedo ejecutar algún código cuando se llama por primera vez al método de guardado de un modelo de Django?
- 2. ¿Cómo se puede iniciar un LaunchAgent por primera vez sin reiniciar cuando su código se ejecuta como LaunchDaemon?
- 3. UIScrollView salta hacia abajo cuando se tocó por primera vez
- 4. ¿Se puede implementar un archivo war en cualquier servidor?
- 5. ¿Cómo iniciar actividad solo una vez cuando la aplicación se abre por primera vez?
- 6. WebView no puede iniciar sesión cuando la aplicación se inicia por primera vez
- 7. : Ejecutar código la primera vez que se instala o usa un paquete
- 8. error al ejecutar cpan la primera vez
- 9. ¿Cuándo se crea por primera vez un archivo de preferencias compartidas?
- 10. Excepción cuando el código intentó crear la base de datos por primera vez
- 11. ¿Cuánta memoria consume un hilo cuando se creó por primera vez?
- 12. ¿Por qué getRealPath() devuelve nulo cuando se implementa con un archivo .war?
- 13. ¿Cómo ejecutar código JavaScript cuando se restablece un formulario?
- 14. Creando un instalador MSI por primera vez
- 15. Impedir que el modelo Backbone.js se valide cuando se agrega por primera vez a la colección
- 16. Restablecer la pantalla de Eclipse al valor predeterminado cuando se instaló por primera vez
- 17. HttpWebRequest se ejecuta lentamente por primera vez dentro de SQLCLR
- 18. ¿ApplicationDidFinishLaunching: recibe una llamada cuando la aplicación se actualiza y se inicia por primera vez?
- 19. Instalación de Django por primera vez
- 20. Problema al usar PDO por primera vez
- 21. ¿Cómo configurar postgresql por primera vez?
- 22. cache.manifest funciona por primera vez, luego falla
- 23. Aprendizaje de Oracle por primera vez
- 24. LocalDateTime de Jodatime es lento cuando se usa por primera vez
- 25. Animación de visualización de Google cuando el gráfico se carga por primera vez
- 26. Mongo Map Reducir por primera vez
- 27. Xcode: cómo hacer que PickerView comience en una fila determinada cuando se muestra por primera vez
- 28. IDataErrorInfo - Inicialmente ignore los errores cuando se carga la vista por primera vez
- 29. Ejecutar un comando de shell cuando se agrega un archivo
- 30. ¿Se puede compilar un código groovy para ejecutar en JRE?
por lo tanto, si necesito que el programa se ejecute de forma continua a continuación, ¿qué debo hacer? – ayyappa
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. –
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