2016-10-05 3 views
0

저는 스프링 컨텍스트 (beanX라고 부름)에 singleton bean을 가지고 있는데, 시작될 때 몇 개의 다른 쓰레드를 회전시키고 파일 시스템에 어떤 상태를 만듭니다. 그래서 컨텍스트가 종료 될 때 리소스를 해제 할 수 있도록 깨끗한 ​​방법으로 중지하고 싶습니다.스프링 빈이 애플리케이션 컨텍스트 초기화 오류에 대한 알림을받을 수 있습니까?

나는 이것을 @Bean(destroyMethod = "shutdown")으로 주석을 달았으며 아무런 문제없이 예상대로 작동합니다.

추가 정보는이 빈이 컨텍스트 시작 시퀀스에서 매우 초기에로드된다는 것입니다 (이 컨테이너는 직접 및 간접적으로 다른 많은 빈을 사용하므로) 나중에로드되는 많은 다른 빈이 있습니다.

이제는 개발을 할 때 다른 빈 중 하나가 시작되지 않고 스프링 컨텍스트의 시작이 실패하게되는 것이 일반적입니다.하지만 이러한 경우에는 beanX가 제대로 종료되지 않습니다.

일반적으로 전체 jvm이 멈추고 리소스가 정리된다는 것을 의미하기 때문에 'productionCode'는 괜찮을 것입니다.하지만 1000 개 이상의 단위 테스트 스위트를 실행할 때 (일부 테스트에는 컨텍스트 충돌이 발생하는 경우) 테스트 JVM이 테스트 사이에 중지되지 않고 각 실패한 테스트 후에 새 스프링 컨텍스트가 만들어지기 때문에 실제 문제가됩니다. 실패한 테스트가 beanX가 시작되었지만 중지 된 적이 없으면 제대로 정리되지 않은 경우에도 !

오늘 필자의 랩톱에서는 테스트를 실행할 때 5 백만 개의 파일 핸들과 13k 스레드를 만들었습니다.

그래서이 작업을 할 수있는 유일한 방법은 현재 beanX를 Spring 컨텍스트에 의해 지연 초기화 된 public static 필드 (ClassX.beanX)로 만드는 것입니다. 그런 다음 테스트 코드에서 수동으로 ClassX.beanX 컨텍스트 로딩 오류가 발생하면 .shutdown().

하지만 더 좋은/다른 '봄'방법이 있다면 골동품입니다.

답변

0

이벤트 처리Spring에 사용할 수 있습니다.

ApplicationContext의 이벤트 처리는 ApplicationEvent 클래스와 ApplicationListener 인터페이스를 통해 제공됩니다. 만약 ApplicationListener 인터페이스를 구현하는 빈 이 컨텍스트로 배치되어있는 경우 마다가 ApplicationEvent는 콩이를 통지하는 의 ApplicationContext, 에 게시됩니다. 본질적으로 이것은 표준 옵저버 디자인 패턴입니다.

+0

Thx, 우리는이 접근 방식으로 '장난감'테스트를 수행했으며 문제를 해결하는 것으로 보입니다. 스프링 컨텍스트가 refresh()를 호출하는 스레드에 오류를 던지기 전에 ContextClosedEvent가 모든 리스너에게 발생합니다. [여기] (http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/ConfigurableApplicationContext.html#refresh--)도 설명되어 있습니다. –

관련 문제