문제

스프링 콩이 몇 개 있다고 가정 해 봅시다.

<beans>
   <bean name="A" ... />
   <bean name="B" ... />
</beans>

"B"는 "A"가 필요하지 않은 원격 서비스를 노출시킵니다. "a"가 무시할 수없는 시간이 걸린다고 가정합니다. 이것이 의미하는 바는 재시작주기 동안 응용 프로그램이 원격 클라이언트를 매달아 실제로 서버에 연결할 수 있지만 스프링 컨테이너가 완전히 초기화 될 때까지 응답을 기다립니다.

내가 할 수있는 것은 "B"원격 서비스가 즉시 응용 프로그램 상태를 기준으로하더라도 즉시 응답하는 것입니다. 그러나 컨테이너는 콩을 부하 순서와 상관없이 게으른 이니트로 지정하더라도 모든 콩이 초기화 될 때까지 대기를 강요합니다.

나는 "B"를 즉시 사용할 수있게되면 봄이 부분적으로 초기화 된 컨테이너를 제공해야한다는 것을 의미합니다. 그러나 누구나 초기화 순서에 도달 한 정보와 합리적인 해결 방법을 찾은 정보에 감사드립니다.

도움이 되었습니까?

해결책

Bean "A"를 직접 언급하지 마십시오. 대신, "a"의 공장 인 콩을 참조하십시오. 이런 식으로, "A"를 인스턴스화하기 위해 초기화를 취하지 않고 공장 Bean을 만들 수 있습니다. 물론 "A"를 검색하기 위해 "A"를 가리키는 클래스를 리팩토링해야합니다.

또는 초기화 상태가 있고 Bean "A"의 인터페이스를 노출시키는 Bean "A"용기 인 Bean "AA"를 만들 수 있습니다. 호출시 초기화 상태가 초기화되지 않도록 설정하고 일부 스레드에서 Bean "A"의 초기화를 시작합니다. "AA"의 "a"a "내에서"a "의 초기화가 완료 될 때까지"a "a aa"의 인터페이스 메소드에 대한 호출은 준비되지 않은 응답을 차단하거나 반환 할 수 있습니다.

이 모든 것은 "무시할 수없는로드 시간이 걸리는"것에 대한 당신의 정의가 무엇인지에 달려 있습니다. 로드하는 데 무시할 수없는 시간이 걸리는 이유는 무엇입니까? 특히 까다로운 초기화가 있습니까? 아니면 JVM을 질식시키는 것이 너무 엄청나게 거대합니까?

다른 팁

나는 왜 "A가 무시할 수없는 시간이 걸리지 않는가"를 이해하지 못하지만, 아마도 refactoring A를 통해 게으른 초기화를 할 수있을 것이다. 처리 할 첫 번째 요청을 초기화하십시오. 이것은 첫 번째 요청이 느려집니다!

다른 가능성은 초기화를 Bean이 ApplicationEvent를 처리하여 생성 된 분리 된 스레드로 이동하는 것입니다. 스레드는 Bean의 초기화 방법을 비동기 방식으로 호출합니다. 초기화되지 않은 콩에 대한 요청을 처리하도록 조심하십시오!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top