Pergunta

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

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

"B" expõe um serviço remoto que não precisa de "A". Suponha que "A" leva um tempo não-negligble a carga. O que isto significa é que, durante um ciclo de reinicialização, o aplicativo trava o cliente remoto, que pode realmente se conectar ao servidor, mas espera por uma resposta até que o recipiente primavera inicializa totalmente.

O que eu gostaria de ser capaz de fazer é ter o "B" responder serviço remoto imediatamente, mesmo que (com base no estado do aplicativo) só pode retornar NOT_READY ou algo assim. O recipiente, no entanto, as forças de uma espera até que tudo isso de feijão são inicializados, mesmo se você especificar o feijão como preguiçoso-init e independentemente da ordem de carregamento.

Eu suspeito que ter "B" disponível imediatamente significaria que a primavera teria que fazer um recipiente parcialmente inicializado disponível, o que soa mal. No entanto, eu apreciaria qualquer informação alguém tem na ordem de inicialização e se você encontrou quaisquer soluções alternativas razoáveis.

Foi útil?

Solução

não se referem a feijão "A" diretamente. Em vez disso, referem-se a um feijão que é uma fábrica para o feijão "A"; desta forma, o feijão de fábrica pode ser criado sem tomar o hit de inicialização para instanciar "A". Você precisará refatorar suas classes que se referem a um "A" para obter um "A" em primeiro lugar, é claro.

Ou, você poderia criar um bean "AA", que é um recipiente para o feijão "A", que tem um estado de inicialização, e que expõe a interface de feijão "A"; mediante invocação, ele define seu estado de inicialização para não inicializado e começa a inicialização do feijão "A" em alguma linha; chamadas para quaisquer métodos de interface de "A" em "AA" pode então bloquear ou retornar uma resposta não está pronto, até a inicialização de "A" dentro de "AA" foi concluída.

Esta dobradiças todo tipo sobre o que a sua definição de "leva um tempo não negligenciável a carga" é. Por que é preciso uma quantidade não desprezível de tempo para carregar? Existe alguma inicialização particularmente complicado que está acontecendo dentro de A? Ou é um justo tão monstruosamente grande que sufoca a JVM?

Outras dicas

Eu não entendo, por que "A leva um tempo não-negligble a carga", mas talvez você pudesse para uma inicialização preguiçosa-se por refatoração A. Não use InitializingBean ou lidar com um ApplicationEvent. Apenas inicializar na primeira solicitação para ser tratado. Isto irá desacelerar o primeiro pedido!

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top