que - servlet java ejemplo
Subproceso en segundo plano para una aplicación de servlet Tomcat (5)
Esta pregunta ya tiene una respuesta aquí:
No estoy muy familiarizado con Tomcat, en mi opinión, básicamente se abstrae como un servidor cgi que guarda la JVM entre llamadas, aunque sé que puede hacer mucho más que eso.
Estoy buscando una manera de iniciar un hilo de fondo cuando se inicie un servidor Tomcat, que actualizaría periódicamente el contexto del servidor (en mi caso particular, este es un hilo que escucha latidos de otros servicios y actualiza información de disponibilidad, pero uno puede imaginar una variedad de usos para esto).
¿Hay una manera estándar de hacer esto? ¿Tanto el lanzamiento como la actualización / consulta del Contexto?
Cualquier apunte a la documentación relevante y / o ejemplos de código sería muy apreciado.
Estoy buscando una manera de iniciar un hilo de fondo cuando se inicia un servidor Tomcat
Creo que está buscando una forma de iniciar un hilo de fondo cuando su aplicación web sea iniciada por Tomcat.
Esto se puede hacer usando un ServletContextListener . Está registrado en web.xml y se ejecutará cuando se inicie o se detenga su aplicación. A continuación, puede crear (y luego detener) su subproceso, utilizando las formas Java normales para crear un subproceso (o ExecutionService).
Al poner <load-on-startup>1</load-on-startup>
en el bloque <servlet>
en su web.xml se forzará el init()
su servlet tan pronto como se inicie Tomcat, en lugar de esperar al primero solicitud para llegar. Esto es útil si desea generar el hilo de fondo de init()
.
Otra forma si usa un marco basado en primavera puede especificar la clase / hilo que desea inicializar en beans.xml. Entonces, cuando se inicia Tomcat, beans.xml inicializará todas las clases mencionadas en él. También puede pasar argumentos de constructor si es necesario. A continuación se muestra el ejemplo de lo mismo.
beans.xml
<bean id="monitoringSvc" class="com.mypackage.MonitoringService">
<constructor-arg value="60"></constructor-arg>
</bean>
MonitoringService.java
public class MonitoringService{
private MyThread myThread;
public MonitoringService(int seconds){
myThread = new MyThread(seconds);
myThread.start();
}
}
Si desea iniciar un hilo cuando se despliega su WAR, puede definir un detector de contexto dentro del web.xml:
<web-app>
<listener>
<listener-class>com.mypackage.MyServletContextListener</listener-class>
</listener>
</web-app>
Luego implementa esa clase algo como:
public class MyServletContextListener implements ServletContextListener {
private MyThreadClass myThread = null;
public void contextInitialized(ServletContextEvent sce) {
if ((myThread == null) || (!myThread.isAlive())) {
myThread = new MyThreadClass();
myThread.start();
}
}
public void contextDestroyed(ServletContextEvent sce){
try {
myThread.doShutdown();
myThread.interrupt();
} catch (Exception ex) {
}
}
}
Solo haría un pequeño cambio en la respuesta muy detallada que Chris dio; Establecería myThread
para que sea un hilo de Daemon por myThread.setDaemon(true);
que básicamente mantendrá el hilo activo siempre y cuando tengas otros hilos no Daemon en funcionamiento que necesiten tu hilo de fondo. Cuando todos estos hilos terminan, la JVM detiene su hilo Daemon y no necesita manejarlo en contextDestroyed
. Pero eso es solo mis 2 centavos.