Bom dia galera!!
Estou cehgando com algumas dúvidas.
Ao usar application-managed entity manager temos que explicitamente cuidar para que tanto o EntityManager quanto a EntityManagerFactory sejam devidamente fechados.
Usar esta estratégia em aplicações JEE, usando ainda (RESOURCE_LOCAL) é uma estratégia problemática, e o melhor seria utilizar as facilidades oferecidas pela especificação, como injeção de dependência, propagação automática de transações e de contextos de persistência.
E quando usar esta estratégia é uma necessidade?
Preciso usar esta estratégia pois tenho que, em tempo de execução, passar novos parâmetros para a criação de EntityManagers, e creio que injeção de recursos não pode me ajudar nesse caso.
Propagação de contexto de persistência e transações
Propagar o contexto de persistência e transações iniciadas em um EJB Stateful para outros EJBs Stateless que precisam participar de um fluxo de atividade só está sendo possível com a passagem do EntityManager como parâmetro aos métodos desses EJB Stateless (feio isso).
Controlar o ciclo de vida de objetos EntityManager e EntityManagerFactory em EJBs Stateful.
Idealmente gostaria de abrir somente um EntityManager por EJB Stateful, e passar o mesmo a quaisquer outros EJB Stateless que precisem processar operações cuja transação é iniciada e terminada no Stateful (vejam nesse caso o EJB Stateful como um gerenciador de fluxo de atividades, que coordena o uso dos outros EJBs Stateless). Preciso fazer isso por conta do que foi explicado acima, e a intenção de abrir somente um é por questão de desempenho (imagine abrir um EM a cada chamada de método).
Pois bem, preciso me certificar de que estes objetos serão fechados quando o EJB Stateful não for mais necessário, e antes que o mesmo seja passado para o estado Does Not Exist. Poderia fechar estes recursos em um método anotado com @preDestroy, mas o problema é que métodos anotados com @preDestroy não tem a garantia de serem chamados pelo container, e em caso de exceções de sistema nenhum método anotado com @preDestroy é chamado.
É isso galera, resolvi compartilhar as dúvidas pois pode ser que outras pessoas tenham os mesmos problemas, e quem sabe colher algumas sugestões.
Agradeço a quem puder ajudar!!!