Pessoal,
Estou estudando EJB pelo livro “EJB em Ação”.
O livro me diz que os EJBs Stateful (com estado) conseguem manter a sessão com cliente.
Então fui fazer uma aplicaçãozinha pra testar isso.
Então criei um EJB Stateful com uma variável de instancia primitiva que irei incrementar a cada requisição apenas para ver como se comporta a sessão.
Coloquei três métodos de negócio, cada um incrementa a variável e a imprime no console. O ultimo método com a anotação @Remove.
Mais dois métodos como Listeners com as anotações “@PostConstruct” e “@PreDestroy” para imprimir no console quando um EJB é criado e quando é distruido.
Criei um cliente WEB com três Servlets, cada uma responsavel pela chamada de um método do meu EJB.
Quando chama a primeira Servlet ela executa a chamada do primeiro método do meu EJB e logo em seguida renderiza uma página com a o form action apontando para a próxima Servlet e assim por diante.
Problema:
Executo a primeira Servlet ela faz a chamada para o primeiro método do meu EJB, o método anotado com @PostConstruct executa normalmente, a váriavel de instancia é incrementada e impressa no console e a servlet escreve no response uma nova página que contém um form action que redireciona para a proxima Servlet.
Quando faço a chamada para a próxima Servlet pelo form que a ultima Servlet criou, ela faz a chamada para o segundo método do meu EJB só que o método anotado com “@PostConstruct” é executado novamente e a váriavel de instancia é impressa com o valor incrementado após seu valor default.
Então com isso percebi que outro EJB estava sendo criado para o mesmo cliente.
Será que isso tem algo haver por que eu estou fazendo a chamada para esse EJB em Servlets diferentes?
Servlets diferentes são clientes diferentes?
Estou sem entender o que está acontecendo, caso alguém possa ajudar aí eu ficarei muito agradecido 
Segue os códigos para qualquer coisa…
EJB:
@Stateful
public class CaminhoClientBean implements CaminhoClient {
private int passo = 0;
@PostConstruct
public void onLoad() {
System.out.println("Iniciei.");
}
@PreDestroy
public void onDestroy() {
System.out.println("Fui destruido.");
}
@Override
public String passoUm() {
return "Passo: " + ++passo;
}
@Override
public String passoDois() {
return "Passo: " + ++passo;
}
@Override
@Remove
public String passoTreis() {
return "Passo: " + ++passo;
}
}
Servlets Clientes:
public class ServletUm extends HttpServlet {
@EJB
CaminhoClient caminho;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter p = response.getWriter();
p.println(caminho.passoUm());
System.out.println(caminho.passoUm());
p.println("<form action='/EJBzaoWebClient/ServletDois' />");
p.println("<input type='submit' value='Passo 2' />");
p.println("</form>");
p.flush();
}
}
public class ServletDois extends HttpServlet {
@EJB
CaminhoClient caminho;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
PrintWriter p = response.getWriter();
p.println(caminho.passoDois());
p.println("<form action='/EJBzaoWebClient/ServletTres' />");
p.println("<input type='submit' value='Passo 3' />");
p.println("</form>");
p.flush();
}
}
:lol: