2008-10-14 3 views
2

은 가정하자 나는 봄 콩의 몇 가지있다. "A"가 부주의하지 않는 시간을로드한다고 가정하십시오. 즉, 다시 시작하는 동안 응용 프로그램이 원격 클라이언트를 중단시킵니다. 원격 클라이언트는 실제로 서버에 연결할 수 있지만 스프링 컨테이너가 완전히 초기화 될 때까지 응답을 기다립니다.봄 초기화 순서

내가 할 수 있기를 원하는 것은 "B"원격 서비스가 (응용 프로그램 상태에 따라) NOT_READY 또는 일부만 반환 할 수 있다고해도 즉시 응답하도록하는 것입니다. 그러나 컨테이너는 lazy-init으로 Bean을 지정하고로드 순서와 관계없이 모든 Bean이 초기화 될 때까지 기다려야합니다.

"B"를 즉시 사용할 수 있다는 것은 스프링이 부분적으로 초기화 된 컨테이너를 사용할 수 있어야한다는 것을 의미하는 것으로 나쁘게 들립니다. 그러나 초기화 순서에 대해 알게 된 정보와 합리적인 해결 방법을 찾았는지 여부에 대해 고맙게 생각합니다.

+0

Bean A가 왜 그 자체를 인스턴스화하는 "무시할 수없는 시간"을 갖는지에 대해 자세히 설명해 주시겠습니까? Bean A를 다시 고려해 볼 수있는 가능한 대답이있어 무시할 수없는 시간이 인스턴스화 프로세스 외부에서 호출되는 함수가됩니까? –

답변

3

빈 "A"를 직접 참조하지 마십시오. 대신 bean "A"에 대한 FACTORY 인 bean을 참조하십시오. 이런 방식으로 Factory Bean은 "A"를 인스턴스화하기 위해 초기화 히트를하지 않고 생성 될 수 있습니다. 물론 "A"를 참조하는 클래스를 리팩터링하여 "A"를 먼저 검색해야합니다.

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

귀하의 정의에서 "무시할 수없는 시간이 걸리는"것에 대한 모든 힌지가 있습니다. 로드하는데 무시할 수없는 시간이 걸리는 이유는 무엇입니까? A에서 진행되는 몇 가지 특히 까다로운 초기화가 있습니까? 아니면 JVM을 질식시키는 거대한 괴물일까요?

0

왜 "A는 부주의하지 않는 시간이 걸릴 것"이라고 생각하지만, A를 리팩터링하여 게으른 초기화를 할 수는 있습니다. InitializingBean을 사용하거나 ApplicationEvent를 처리하지 마십시오. 먼저 처리 할 요청을 초기화하십시오. 이렇게하면 첫 번째 요청이 느려집니다!

다른 가능성은 ApplicationEvent를 처리하는 bean에 의해 작성된 분리 된 스레드로 초기화를 이동하는 것입니다. 스레드는 bean의 초기화 메소드를 비동기 적으로 호출합니다. 초기화되지 않은 bean에 대한 요청을 처리하려면주의하십시오!

+0

A가로드되는 동안 호출자는 소켓을 열 수 있지만 서버 초기화가 완료 될 때까지 기다릴 수 있기 때문에 시간 초과가 될 때까지 응답하지 않습니다. 서비스를 수동으로로드하여 즉시 응답하십시오. 나는 수동으로 시작된 백그라운드 스레드에서 초기화하는 지저분한 대안을 피하기를 희망했다. –