Glassfish: Ignora silenciosamente a fonte de dados indisponíveis no início da aplicação

Eu tenho um aplicativo EJB que usa JPA 2.0 no Glassfish 3.1.2 (provedor é EclipseLink). Quando o database está inativo, o aplicativo não inicia e ainda mais: não pode ser implantado. Isso ocorre porque o EclipseLink faz alguma verificação inicial.

Existe uma maneira que o aplicativo pode ser deloyed e iniciado mesmo se o database estiver inoperante?

Antecedentes: O recurso não disponível não entra em jogo até que a primeira function de negócios seja chamada, acessando o database. Desde a boot do aplicativo até a primeira chamada de function de negócios, há uma janela de tempo em que o database pode ser iniciado.

Alterar os padrões em glassfish-resources.xml para os atributos connection-creation-retry-attempts e connection-creation-retry-interval-in-seconds de ajuda de alguma forma, mas ainda verifica a disponibilidade do database na boot não no primeiro uso.

ExceptionHandler do EclipseLink não é o que eu tenho em mente: quando o manipulador de exceção entra em jogo, o EclipseLink já iniciou o processo de verificação e, portanto, tentou se conectar ao database. A maneira que estou procurando é adiar o próprio processo de verificação até a primeira binding comercial.

A verificação do database EclipseLink é executada no primeiro uso. No entanto, esse primeiro uso é provavelmente um ponto de injeção @PersistanceUnit que é manipulado pelo contêiner. @PersistanceUnit injeção @PersistanceUnit é manipulada no momento da implantação e não há nada que você possa fazer para descobrir isso. Se você não quiser que o EclipseLink seja verificado no momento da implementação, será necessário manipular seu próprio EntityManagerFactory .

Eu recomendo criar um ouvinte de contexto de aplicativo, ele pode conter uma cópia de seu EntityManagerFactory e ser executado quando você desimplanta / reimplanta. Durante uma corrida normal, você pode simplesmente não configurar nada até que seja necessário. Aqui está o modelo básico que eu seguiria: https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom

Você pode usar um EclipseLink ExceptionHandler para capturar o erro.