Ordem de inicialização de primavera

Suponha que eu tenha um par de grãos de primavera:


   
   

"B" expõe um serviço remoto que não precisa de "A". Suponha que "A" leve um tempo não desprezível para carregar. O que isso significa é que, durante um ciclo de reinicialização, o aplicativo trava o cliente remoto, que pode realmente se conectar ao servidor, mas aguarda uma resposta até que o contêiner de mola seja totalmente inicializado.

O que eu gostaria de poder fazer é que o serviço remoto "B" responda imediatamente, mesmo que (com base no estado do aplicativo) ele possa retornar apenas NOT_READY ou algo assim. O contêiner, no entanto, força uma espera até que todos os beans sejam inicializados, mesmo se você especificar os beans como lazy-init e independentemente da ordem de carregamento.

Eu suspeito que ter "B" disponível imediatamente significaria que a primavera teria que disponibilizar um contêiner parcialmente inicializado, o que parece ruim. No entanto, agradeço qualquer informação que alguém tenha na ordem de inicialização e se você encontrou alguma solução razoável.

2
Você poderia explicar por que o Bean A leva um "tempo não desprezível" para se instanciar? Uma resposta possível é refatorar o Bean A de modo que o tempo não negligenciável se torne uma função chamada fora do processo de instanciação?
adicionado o autor David Harrison, fonte

2 Respostas

Não se refira diretamente ao bean "A". Em vez disso, consulte um bean que é uma FACTORY para o bean "A"; Dessa maneira, o bean Factory pode ser criado sem obter o hit de inicialização para instanciar "A". Você precisará refatorar suas classes que se referem a um "A" para recuperar um "A" primeiro, é claro.

Ou, você poderia criar um bean "AA", que é um contêiner para o bean "A", que possui um estado de inicialização e que expõe a interface do bean "A"; em cima da invocação, ajusta seu estado de inicialização para não inicializado, e começa a inicialização do bean "A" em algum encadeamento; chamadas para qualquer método de interface de "A" em "AA" podem bloquear ou retornar uma resposta não pronta, até que a inicialização de "A" em "AA" seja concluída.

Isso tudo depende do que sua definição de "leva um tempo não desprezível para carregar" é. Por que demora um tempo não negligenciável para carregar? Existe alguma inicialização particularmente difícil que está acontecendo dentro de um? Ou é A tão monstruosamente grande que sufoca a JVM?

3
adicionado

Eu não entendo, porque "um leva um tempo não negligenciável para carregar", mas talvez você poderia a um preguiçoso inicializar-se refatorando o A. Não use InitializingBean ou manipular um ApplicationEvent. Basta inicializar no primeiro pedido a ser tratado. Isso irá desacelerar o primeiro pedido!

A outra possibilidade é mover a inicialização para um thread separado criado pelo bean manipulando um ApplicationEvent. O encadeamento chama o método de inicialização do bean de maneira assíncrona. Tenha cuidado para lidar com solicitações para o feijão não inicializado!

0
adicionado
Enquanto A carrega, os chamadores interrompem até o tempo limite, pois eles podem abrir um soquete, mas aguardar a inicialização do servidor para concluir.Quer carregar manualmente o serviço para responder imediatamente. Eu estava esperando para evitar a alternativa confusa de inicializar em um thread de plano de fundo iniciado manualmente.
adicionado o autor Steve B., fonte