2012-01-31 12 views
6

supe beans con estado mantienen la sesión de conversación entre diferentes llamadas método de instancia, pero sin estado pregunta voluntad not.My, supongamos que tengo una aplicación bean sin estado, como a continuaciónsin estado y con estado bean de sesión

import javax.ejb.Stateful; 
import javax.ejb.Stateless; 

import com.tata.ejb3.data.HelloEJBInterface; 

@Stateless 
public class ValueEJB implements ValueEJBInterface{ 

    private int value; 
    @Override 
    public int getValue() { 
     return this.value; 
    } 

    @Override 
    public void setValue(int value) { 
     this.value = value; 
    } 
} 

tengo mi cliente de frijol (Un servlet) que inicia la invocación de frijol de la siguiente manera

@EJB(mappedName="E/ValueEJB /remote") 
ValueEJBInterface value; 

.... 

value.setValue(250); 
System.out.println(value.getValue());//This statement prints the value 250 

.... 

según mi entendimiento es como mi frijol bean sin estado no debe visualizado por el valor 250.

valor privado int; es una variable instantánea, si un método sin estado establece su valor, el valor expirará en la salida del método. Pero aquí, puedo obtener el valor '250' incluso a través de mi segunda llamada al método. ¿Es una violación del concepto de apátrida? ¿Me falta algo?

Respuesta

2

Pregunta interesante y, básicamente, tienes toda la razón. Investigué un poco y el consejo general es: "Espere que su bean olvide todo después de cada método ..." (page 81). Además, de acuerdo con ese recurso, el algoritmo responsable de mantener el estado de Sessionless Beans es específico del contenedor/proveedor. Por lo tanto, el contenedor puede optar por destruir, recrear o borrar la instancia después de la ejecución del método.

Puede crear una prueba de múltiples hilos y ver cómo se comporta con los clientes de varias pilas.

+0

Okay.You son right.if no estoy equivocado, el escenario similar se comportó de manera diferente en EJB2.0/Weblogic contenedor EJB, donde mi cliente EJB tiene 0 como getValue, significa en mi siguiente llamada, el contenedor sirve con una instancia diferente de ejb. – ASChakkalakal

2

No hay violación de ningún concepto. Esto se debe a que el contenedor de la agrupación selecciona la misma instancia de bean para atender otra solicitud.

Los beans sin estado se agrupan en &, por lo tanto, tienen un beneficio de rendimiento sobre los beans stateful, también su propósito principal es procesar sin mantener ningún estado.

Los datos sensibles o específicos del usuario no se deben almacenar en variables de instancia de beans sin estado. Deben usarse ampliamente para procesar datos sin ninguna consideración de estado.

Puede consultar here para conocer los eventos del ciclo de vida manejados por el contenedor.

+0

Gracias por los detalles. Una pregunta más aquí. @stateless (mappedName = "XXX"), ¿mi ejb sería referido a través de XXX aquí después? He visto que JBoss AS ha recibido un mapeo JNDI diferente a pesar de XXX.¿Es puramente específico del vendedor? – ASChakkalakal

+0

No, mappedName es un atributo opcional y se deja al vendedor, JBoss opta por este atributo y usa su propia convención. –

+0

He notado una cosa más interesante, mappedName solo se toma cuando mi interfaz de servicio era Remote interface. Cuando especifiqué mappedName para un EJB cuya interfaz de servicio anotaba con @Local (o incluso no especifiqué nada aquí), mi contenedor JBoss lo ignoró y enlazado con su propio JNDI, algo así como xxxxx/Local – ASChakkalakal

5

Diferencia entre Stateful v Comportamiento de beans sin estado al llamar a métodos diferentes.


pleno estado: Al llamar a diferentes métodos en un Stateful Bean, diferentes instancias del bean se crean.

((MyStatefulBeanRemote) ctx.lookup("ejb/MyStatefulBean")).doingStatefulThing(); 

((MyStatefulBeanRemote) ctx.lookup("ejb/MyStatefulBean")).doingNothingStatefulThing(); 

***Output: Note the creation of separate objects.*** 

INFO: Calling doingStatefulThing...com.myeclipseide.ejb3.stateful.**[email protected]** 

INFO: Calling doingNothingStatefulThing...com.myeclipseide.ejb3.stateful.**[email protected]** 

STATELESS: Al llamar a diferentes métodos en un Stateless Bean, los granos se agruparon, por lo tanto, no se crean nuevas instancias del bean.

((MyStatelessBeanRemote) ctx.lookup("ejb/MyStatelessBean")).doSomething(); 

((MyStatelessBeanRemote) ctx.lookup("ejb/MyStatelessBean")).doNothing(); 

***Output: Note the reuse of he bean object.*** 

INFO: Doing something ...com.myeclipseide.ejb3.stateless.**[email protected]** 

INFO: Doing Nothing ...com.myeclipseide.ejb3.stateless.**[email protected]** 
Cuestiones relacionadas