2012-01-03 2 views
1
에서 모든 클래스에 로그인 할 수 있도록

는 shutdownHook을 가정?어떻게 shutdownHook

예를 들어, doSomething() 메소드는 로그를 기록하는 다른 액세스 가능한 클래스에 대해 여러 메소드를 호출 할 수 있습니다. 이 모든 로그를 건너 뛰고 싶지 않습니다.

+0

무엇을 의미합니까? 왜 로거를 닫을까요? 'doSomething()'은'run()'메소드로 돌아 가야하지 않습니까? – adarshr

+0

http://docs.oracle.com/cd/E17409_01/javase/6/docs/api/java/lang/Runtime.html#addShutdownHook%28java.lang.Thread%29 "또한 서비스에 대해 맹목적으로 의존해서는 안됩니다. 자신의 종료 훅을 등록했을 수 있으므로 스스로 셧다운하는 중일 수 있습니다. " 로거 자체 shutdownHook 것 같습니다. – Mik378

답변

1

반사 반점을 제외하고 불행히도이 작업을 수행하는 쉬운 방법은 없습니다. 1.6 JDK에서 종료 훅은 보장 된 순서를 제공하지 않는 IdentityHashmap에 저장됩니다. 실제로 종료 훅은 해당 맵의 내부 구조에 따라 임의의 순서로 호출됩니다.

리플렉션 측면에서 다음을 시도했지만 hookMap이 나에게 null로 표시됩니다. 작동하도록 만들 수 있다면 log4j 훅을 제거하고 훅이 끝날 때 수동으로 호출 할 수 있습니다. 그러나

Class<?> clazz = Class.forName("java.lang.ApplicationShutdownHooks"); 
Field field = clazz.getDeclaredField("hooks"); 
field.setAccessible(true); 
@SuppressWarnings("unchecked") 
Map<Thread, Thread> hookMap = (Map<Thread, Thread>) field.get(null); 

, 나는 강력하게 종료 훅보다는 뭔가 다른을하고 추천 할 것입니다. main가 끝나기 전에 자신의 후크를 부르는 것은 어떨까요? 우리에게는 Spring과 DisposableBean 패턴이 많이 사용됩니다. 해당 콩 이며 클래스가 인스턴스화 될 때 역순으로 호출되므로 로거에 의존하는 모든 항목은 종료 될 때 여전히 로거를 갖습니다.

희망이 도움이됩니다.