2012-05-01 13 views
6

La especificación dice que el contenedor CDI elimina un SFSB cuando el contexto del alcance está a punto de destruirse. ¿Cómo elimina exactamente el EJB? No parece estar llamando al método anotado con @Remove.¿Cómo elimina CDI el bean de sesión con estado?

@Stateful 
public class CustomerDAOImpl implements CustomerDAO { 
    @PreDestroy 
    public void onDestroy() { 
     //This is getting called as expected 
    } 
    @Remove 
    public void deleteMyBean() { 
     //This is not getting called! 
    } 
} 

Entonces, CDI está técnicamente haciendo lo que dice la especificación. La pregunta es ¿cómo se las arregla para pedir al contenedor EJB que elimine la instancia? Gracias.

Respuesta

2

Como covener dice que esto se hace usando una API EJB específica de implementación, eso no es parte de la API estándar de EJB.

Como dice Covener, llamar a @Remove es NO la forma correcta de proceder. El código de los usuarios llama a los métodos @Remove, y indican el contenedor EJB para eliminar el EJB. Si desea una devolución de llamada cuando se elimina el EJB, utilice @PreDestroy.

-1

El método con anotación @Remove debe ser llamado explícitamente por el cliente, luego el contenedor llamará al método anotado con @PreDestroy implícitamente, si existe. Después de eso, la instancia de bean estará lista para la recolección de basura.

Este es el único método de ciclo de vida que el cliente puede controlar, todos los demás métodos están controlados por el contenedor.

+0

Sí, ese es el comportamiento normal. ¿Pero cómo es el contenedor CDI eliminando el EJB? ¿Está utilizando algún tipo de API no documentada para solicitar al contenedor EJB que realice la eliminación? – RajV

+0

@RajV No pude ubicarlo en la especificación, pero puede encontrar información útil en el tutorial de Java EE, en el tema 'El ciclo de vida de un bean de sesión de Stateful' en http://docs.oracle.com/javaee/5 /tutorial/doc/bnbmt.html –

+0

@downvoter Atención para explicar por -1 –

3

Creo que el contenedor CDI necesita un gancho en el contenedor EJB para pedirle que "haga lo que haría si un método @Remove acaba de completar". En cuanto a las especificaciones EJB, EJB 2.1 tenía un mecanismo para esto en las interfaces que tenía que extender.

Por razones obvias, el contenedor que llama a un método arbitrario @Remove anotado para el efecto secundario es bastante desaconsejable.

+0

+1, pero como nit, el contenedor posee la implementación de EJBObject (que tiene .remove, que es básicamente lo que CDI quiere usar), pero el bean implementa SessionBean. –

+0

Esto no es una respuesta sino una especulación. Si efectivamente existiera tal gancho, será altamente específico del vendedor. ¿Cómo puede una implementación como Weld hacerlo de forma genérica? – RajV

+0

La pregunta no es si la soldadura lo hace de forma portátil. Weld requiere específicamente contenedores para proporcionar todo tipo de implementaciones de interfaces, incluida SessionObjectReference # remove – covener

Cuestiones relacionadas