stop start servidor reiniciar instalar iniciar detener java java-ee tomcat tomcat7

java - servidor - start tomcat windows 10



Detener el temporizador programado al apagar tomcat (4)

¡ No use el Timer en un entorno Java EE! Si la tarea arroja una excepción de tiempo de ejecución, todo el Timer se elimina y ya no se ejecutará. Básicamente, necesitas reiniciar todo el servidor para que vuelva a funcionar. Además, es sensible a los cambios en el reloj del sistema.

Use ScheduledExecutorService lugar. No es sensible a las excepciones lanzadas en las tareas ni a los cambios en el reloj del sistema. Puede apagarlo mediante su método shutdownNow() .

Aquí hay un ejemplo de cómo puede ser toda la implementación de ServletContextListener (nota: no se requiere registro en web.xml gracias a la nueva anotación @WebListener ):

@WebListener public class BackgroundJobManager implements ServletContextListener { private ScheduledExecutorService scheduler; @Override public void contextInitialized(ServletContextEvent event) { scheduler = Executors.newSingleThreadScheduledExecutor(); scheduler.scheduleAtFixedRate(new YourParsingJob(), 0, 5, TimeUnit.HOUR); } @Override public void contextDestroyed(ServletContextEvent event) { scheduler.shutdownNow(); } }

Esta pregunta ya tiene una respuesta aquí:

Tengo un archivo WAR desplegado en el servidor de Tomcat, uno de la clase se llamará en el momento del inicio, luego el método init () programará un temporizador para que se active cada 5 horas para realizar algunas tareas.

Mi código init () se ve así:

public void init() { TimerTask parserTimerTask = new TimerTask() { @Override public void run() { XmlParser.parsePage(); } }; Timer parserTimer = new Timer(); parserTimer.scheduleAtFixedRate(parserTimerTask, 0, PERIOD); }

Mi aplicación se ejecuta sin problemas, pero cuando apago el Tomcat usando /etc/init.d/tomcat7 para , entonces verifico el registro (catalina.out) tiene una entrada como esta:

SEVERO: La aplicación web [/ MyApplication] parece haber iniciado un hilo llamado [Timer-0] pero no ha podido detenerlo. Esto es muy probable que cree una pérdida de memoria.

Entiendo que esto es causado por mí programar el temporizador, pero mi pregunta es:

  1. No configuré setDeamon en verdadero, ¿no debería el temporizador evitar que Tomcat se apague, en lugar de dejarlo funcionando?
  2. ¿Puedo, en mi aplicación, detectar que Tomcat va a estar apagado y cancelar mi temporizador?
  3. ¿Cuáles son las otras soluciones que puedo usar para encargarme de este problema?

¡Gracias!

ACTUALIZAR

Cambié mi código a lo siguiente en base a alguna búsqueda y la respuesta de DaveHowes.

Timer parserTimer; TimerTask parserTimerTask; public void init() { parserTimerTask = new TimerTask() { @Override public void run() { XmlParser.parsePage(); } }; parserTimer = new Timer(); parserTimer.scheduleAtFixedRate(parserTimerTask, 0, PERIOD); } @Override public void contextDestroyed(ServletContextEvent arg0) { Logger logger = Logger.getRootLogger(); logger.info("DETECT TOMCAT SERVER IS GOING TO SHUT DOWN"); logger.info("CANCEL TIMER TASK AND TIMER"); otsParserTimerTask.cancel(); otsParserTimer.cancel(); logger.info("CANCELING COMPLETE"); } @Override public void contextInitialized(ServletContextEvent arg0) { }

Ahora mi nueva pregunta:

  1. Cancelé TimerTask primero y luego Timer, ¿es correcto?
  2. ¿Hay alguna otra cosa que deba hacer?

¡Gracias!

ACTUALIZAR

No funciona Puse una declaración de registro en el método contextDestroyed (), después de cerrar Tomcat, el archivo de registro solo tiene lo siguiente:

PowderGodAppWebService -> [07 Feb 2012 04:09:46 PM] INFO (PowderGodAppWebService.java:45) :: DETECTAR EL SERVIDOR DE TOMCAT VA A CERRAR PowderGodAppWebService -> [07 Feb 2012 04:09:46 PM] INFO (PowderGodAppWebService. java: 46) :: CANCELAR TAREA DE TEMPORIZADOR Y TEMPORIZADOR

CANCELAR COMPLETO no está allí.

También verifiqué los procesos que se están ejecutando (no soy un experto en Linux, así que solo uso el Monitor de Actividad de Mac).

  • Asegúrate de que no se esté ejecutando ningún proceso de Java
  • Inicie Tomcat, tenga en cuenta el PID de ese proceso java
  • Detener a Tomcat
  • Encontré que el proceso de Tomcat ya no está
  • Inicie Tomcat, tenga en cuenta el PID de ese proceso java
  • Implementar mi archivo de guerra
  • Muestra el proceso, mira el hilo [Timer-0]
  • Apagado Tomcat
  • Encontró que el proceso todavía está allí
  • Muestra el proceso
  • Ver [Timer-0] todavía está allí

FIJO

Cambié mi código a parserTimer = new Timer(true); para que mi temporizador se ejecute como un hilo de daemon porque se contextDestroyed() al contextDestroyed() después de que Tomcat se apaga.

"Todos los servlets y filtros se habrán destruido antes de que se notifique a ServletContextListeners sobre la destrucción del contexto".

http://docs.oracle.com/javaee/6/api/javax/servlet/ServletContextListener.html


Intenta usar el marco para la programación.

Si adapta Spring Framework puede usar la compilación en las capacidades de programación.

Al programar con Spring nunca tuve problemas para detener el servidor de aplicaciones.


Ponga parseTimer.purge () en su onContetexyDestroyed. Eliminará todos los temporizadores en la cola, si es que existen.


Se llama al método de destrucción de servlets ya que el servlet está a punto de descargarse. Podría cancelar el temporizador desde allí, siempre que haya modificado el alcance del temporizador del analizador para que sea una variable de instancia. No veo ningún problema con eso, siempre que accedas solo desde init y destruyas.

El motor del servlet puede descargar el servlet cuando lo crea conveniente, pero en la práctica solo me han llamado cuando el motor del servlet está detenido; otras personas pueden tener otras experiencias al respecto, lo que podría darme la razón.