2011-04-27 14 views
7

W Tomcat, gdy serwer jest wyłączany, próbuje ustawić wszystkie zmienne statyczne w klasach, o których wie, że mają wartość null. Dotykając tych klas, uruchamiane są ich statyczne inicjalizatory, co może skutkować nieskończoną pętlą dla niektórych klas, które mają masywne inicjatory statyczne.Jak sprawdzić, czy obecnie trwa wyłączanie?

Czy istnieje elegancki sposób wykrywania, czy obecnie trwa wyłączanie? Możemy wtedy sprawdzić u góry statycznych inicjalizatorów, czy jesteśmy w trybie zamknięcia, a następnie zignorować inicjalizację.

Jedynym sposobem znaleźliśmy który wydaje się działać wcale nie jest elegancki:

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

To może być najlepsze, co otrzymasz bez rodzimej ... –

Odpowiedz

2

Możesz zajrzeć jeśli Tomcat wykorzystuje nowy wątek do pracy wyłączania, jeśli tak można przemierzać aktualnych tematów i spojrzeć na to wątek.

Następnie, konfigurując ServletContextListener, włącza i wyłącza flagowanie w contextInitialized i contextDestroyed, twoje klasy sprawdzają tę flagę.

2

Czy masz kontrolę nad konfiguracją webapp? Jeśli tak, można wyłączyć wyczyszczenie referencji poprzez ustawienie statycznych,

clearReferencesStatic=false 

w /META-INF/context.xml jak stwierdzono w documentation

przeciwnym razie, zgadzam się, że ustawienie flagi w ServletContextListener jest chyba najlepszym rozwiązaniem.

Powiązane problemy