Solía pensar que no, pero ayer tuve que hacerlo. Es una aplicación que utiliza Akka (una implementación del sistema de actores para la JVM) para procesar trabajos asincrónicos. Uno de los actores realiza alguna manipulación de PDF, y debido a que la biblioteca tiene errores, muere con un de StackOverflowError
vez en cuando.
El segundo aspecto es que Akka está configurado para apagar todo su sistema de actores si se detecta algún error fatal de JVM (por ejemplo, StackOverflowError).
El tercer aspecto es que este sistema de actor está incrustado dentro de una aplicación web (por WTF-ish, legacy, razones), por lo que cuando el sistema de actor se cierra, la aplicación web no lo está. El efecto neto es que StackOverflowError
nuestra aplicación de procesamiento de trabajo se convierte en una aplicación web vacía.
Como una solución rápida, tuve que atrapar el StackOverflowError
lanzamiento, para que el grupo de hilos del sistema de actores no se derribara. Esto me lleva a pensar que tal vez a veces está bien detectar tales errores, especialmente en contextos como este. ¿Cuándo hay un grupo de subprocesos que procesa tareas arbitrarias? A diferencia de un, OutOfMemoryError
no puedo imaginar cómo StackOverflowError
puede dejar una aplicación en un estado inconsistente. La pila se borra después de tal error, por lo que el cálculo puede continuar normalmente. Pero tal vez me estoy perdiendo algo importante.
Además, tenga en cuenta que estoy dispuesto a corregir el error en primer lugar (de hecho, ya he arreglado un SOE en esta misma aplicación hace unos días), pero realmente no sé cuándo esto tipo de situación puede surgir.
¿Por qué sería mejor reiniciar el proceso JVM en lugar de detectarlo StackOverflowError
, marcar ese trabajo como fallido y continuar con mi negocio?
¿Hay alguna razón convincente para nunca atrapar a las empresas estatales? Excepto "mejores prácticas", que es un término vago que no me dice nada.
StackOverflowException
s generalmente se debe a una cadena de llamadas de método que no termina - aumentar el espacio de la pila aumentaría el costo de memoria de un nuevo subproceso sin ningún beneficio.
:-)