Quando eu implemento meu aplicativo JEE6 no JBoss EAP 6.3 e encerro o servidor antes de manualmente desimplantar o aplicativo, recebo exceções inesperadas (veja abaixo).
Estou procurando uma maneira de tornar o trabalho de desligamento ou uma fonte confiável que declare que ele não funciona e não será corrigido.
No entanto, o encerramento do aplicativo funciona bem, se feito manualmente (exclua o diretório .ear do diretório de implantação, aguarde a remoção de implementação e, em seguida, encerre o JB). Nenhuma exceção ocorre e tudo funciona conforme o esperado.
Então, eu suponho que existe uma maneira de configurar o JBoss de uma maneira que automaticamente desligue o servidor, envie um sinal de parada para os aplicativos, espere até que eles desapareçam ou atinjam o tempo limite e desligue o servidor.
Eu encerro o JBoss 7 com este comando:
jboss-cli.bat --connect --command=:shutdown --timeout=30000 --controller=127.0.0.1:9999
As exceções que recebo (por exemplo, JBAS0141134) me fazem pensar que o JBoss está removendo Beans e Recursos dos quais meu aplicativo depende antes que a sequência de desligamento seja concluída.
Eu controlo o meu processo de encerramento dentro de um @PreDestroy
dentro de um @Singleton
que chama alguns @Stateless
beans que, por sua vez, têm os recursos da base de dados, etc.
A exceção mais importante que recebo:
ERROR - JBAS014134:
EJB-Aufruf an Komponente MyStatelessBean
für Methode public abstract void MyStatelessLocal.performShutdownOperation() fehlgeschlagen:
javax.ejb.EJBAccessException: JBAS014502:
Aufruf an Methode: public abstract void MyStatelessLocal.performShutdownOperation()
von Bean: MyStatelessBean ist nicht gestattet
(a indentação é minha)
Lembre-se de que, apesar de dizer "chamada não é permitida", a chamada funciona bem se eu remover a implantação do aplicativo, sem desligar o servidor.