2011-04-27 22 views
7

En Tomcat, cuando el servidor se está cerrando, intenta establecer todas las variables estáticas en las clases que conoce para anular. Al tocar estas clases, se ejecutan sus inicializadores estáticos, lo que puede dar como resultado un ciclo sin fin para algunas de nuestras clases heredadas que tienen iniciadores estáticos masivos.¿Cómo saber si un cierre está actualmente en curso?

¿Existe una forma elegante de detectar si un cierre está actualmente en curso? Podríamos verificar en la parte superior de los inicializadores estáticos si estamos en el modo de apagado y luego ignorar la inicialización.

La única manera que encontramos que parece funcionar es cualquier cosa menos elegante:

try{ 
     Thread hook = new Thread(); 
     Runtime.getRuntime().addShutdownHook(hook); // fires "java.lang.IllegalStateException: Shutdown in progress" if currently in shutdown 
     Runtime.getRuntime().removeShutdownHook(hook); 
    }catch(Throwable th){ 
     throw new Error("Init in shutdown thread", th); 
    } 
+0

Eso podría ser lo mejor que obtendrá sin nativo ... –

Respuesta

2

Usted puede mirar si Tomcat utiliza un nuevo hilo para hacer el trabajo de apagado, si sí se podía atravesar las discusiones actuales y buscar este hilo.

A continuación, configurando ServletContextListener, para que active y desactive la bandera en el contextoInicializado y contextDestroyed, sus clases verifican esa marca.

2

¿Tiene control sobre la configuración de la aplicación web? Si es así, puede desactivar la limpieza de las referencias estáticas mediante el establecimiento,

clearReferencesStatic=false 

en /META-INF/context.xml como se indica en la documentation

De lo contrario, estoy de acuerdo que el establecimiento de una bandera en el ServletContextListener es probablemente su mejor opción.

Cuestiones relacionadas