El EJB tutorials muestra que un EJB puede ser Singleton o Stateful o o Stateless. Nunca he tratado de usar más de una de estas anotaciones, pero estoy bastante convencido de que lo correcto es usar solo una de ellas.
A partir de este enlace:
beans de sesión Singleton mantener su estado entre el cliente invocaciones
Así que, a su pregunta:
si defino un EJB con @Singleton la anotación ¿tendrá estado por defecto o tengo que definirla con @Stateful también?
Si para Stateful se refiere a la capacidad de mantener su estado, la respuesta es: sí, un Singleton tendrá Stateful por defecto.
Tenga en cuenta que hay algunas situaciones particulares en las que un Singleton no se comporta como un Singleton, lea esto article al respecto. Generalmente, no ejecuta este tipo de riesgo si se encuentra fuera de un clúster y evita usar el constructor predeterminado: siempre debe usar referencias de un EJB al inyectarlo en otro EJB o un cliente web usando:
@EJB MyEJB myEJB;
Finalmente, eche un vistazo a this parte del tutorial de Java EE 6, sobre el ciclo de vida EJB, explicando que la principal diferencia entre Stateful y otros EJB es la capacidad de pasivado por el contenedor durante su vida. Esta diferencia es la razón principal por la cual la afirmación "un Singleton es Stateful por defecto" no es correcta estrictamente hablando, pero es correcta en el contexto de su pregunta.
Gracias por algunas buenas pautas. Aunque estoy un poco preocupado porque dice en el tutorial de Java EE 6: "Al final del ciclo de vida, el contenedor EJB llama al método anotado @PreDestroy, si existe. El bean de sesión singleton ahora está listo para la recolección de elementos no utilizados. " ¿Esto solo sucederá cuando cierro mi servidor de aplicaciones o puede ocurrir de otra manera? – Marthin
Mi experiencia es que esto solo ocurrirá cuando la aplicación se desactive o se desenroble o el servidor se apague. – perissf