java - solucion - todas las aplicaciones se detienen android
Programador de primavera se detiene inesperadamente (2)
Tenemos una aplicación web Spring 3 en Tomcat 6 que usa varios servicios programados a través de @Scheduled
(principalmente para trabajos que se ejecutan todas las noches). Ahora parece que a veces (rara vez, tal vez una vez cada dos meses aproximadamente) el hilo del programador deja de funcionar, por lo que ninguno de los trabajos se ejecutará la noche siguiente. No hay excepción o entrada de registro en nuestros archivos de registro.
¿Alguien tiene idea de por qué está pasando esto? ¿O cómo obtener más información sobre este problema?
¿Hay alguna manera de detectar esta situación dentro de la aplicación y reiniciar el programador?
Actualmente estamos solucionando esto teniendo también un trabajo de registro que se ejecuta cada 5 minutos y crea una entrada de registro. Si el archivo de registro deja de actualizarse (supervisado por nagios), sabemos que es hora de reiniciar tomcat. Sería bueno reiniciar los trabajos sin un reinicio completo del servidor.
Como esta pregunta obtuvo tantos votos, publicaré cuál fue la solución (probablemente muy específica) para mi problema.
Estamos utilizando la biblioteca Apache HttpClient para realizar llamadas a servicios remotos en los trabajos programados. Lamentablemente, no hay tiempos de espera predeterminados establecidos al realizar solicitudes. Después de la configuración
connectTimeout
connectionRequestTimeout
socketTimeout
a 30 segundos el problema se había ido.
int timeout = 30 * 1000; // 30 seconds
RequestConfig requestConfig = RequestConfig.custom()
.setConnectTimeout(timeout)
.setConnectionRequestTimeout(timeout)
.setSocketTimeout(timeout).build();
HttpClient client = HttpClients.custom()
.setDefaultRequestConfig(requestConfig).build();
Esto es bastante fácil de descubrir. Lo harías con un rastro de pila. Hay muchas publicaciones sobre cómo obtener un seguimiento de pila, en el sistema de Unix ''kill -3'' y el seguimiento de pila aparece en el archivo de registro catalina.out.
Una vez que tenga un seguimiento de pila, encuentre el hilo del programador y vea lo que está haciendo. ¿Es posible que la tarea que estaba ejecutando se haya estancado?
también puede publicar el seguimiento de la pila aquí para obtener más ayuda.
lo que es importante saber es qué planificador usas. si usa SimpleAsyncTaskExecutor, comenzará un nuevo hilo para cada tarea y su programación nunca fallará. Sin embargo, si tiene tareas que no terminan, eventualmente se quedará sin memoria.
http://docs.spring.io/spring/docs/3.0.x/reference/scheduling.html