2012-03-01 15 views
10

Tengo un EJB que debe ser único y con estado, ya que se trata de una especie de grupo de conexiones. Mis preguntas son:@Singleton en Java EJB

  • Si defino un EJB con @Singleton anotación, será entonces con estado por defecto o tengo que definirlo con @Stateful también?
  • ¿Puede ser con la anotación @Stateless?

Intenté encontrar documentación sobre esto pero no tuve suerte hasta el momento, así que cualquier persona que tenga conocimiento puede compartir su sabiduría y tal vez un enlace o dos.

Respuesta

13

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.

+0

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

+1

Mi experiencia es que esto solo ocurrirá cuando la aplicación se desactive o se desenroble o el servidor se apague. – perissf