entre ejemplo diferencia container bean ejb stateless-session-bean stateful-session-bean session-bean

ejb - ejemplo - ¿Cuándo usar Bean Stateful Session sobre Bean de sesión sin estado?



ejb singleton (2)

Creo que el mejor ejemplo de usar un bean de sesión Stateful es para un carrito de compras , donde almacena todos los productos que el usuario quiere comprar.

Stateful session bean se define de la siguiente manera:

Stateful Session Beans El estado de un objeto consiste en los valores de sus variables de instancia. En un bean de sesión con estado, las variables de instancia representan el estado de una sesión de cliente-bean única. Debido a que el cliente interactúa ("habla") con su bean, este estado a menudo se denomina estado conversacional.

El bean de sesión sin estado se define de la siguiente manera:

Beans de sesión sin estado Un bean de sesión sin estado no mantiene un estado conversacional con el cliente. Cuando un cliente invoca los métodos de un bean sin estado, las variables de instancia del bean pueden contener un estado específico para ese cliente, pero solo mientras dure la invocación. Cuando el método finaliza, el estado específico del cliente no debe retenerse. Sin embargo, los clientes pueden cambiar el estado de las variables de instancia en beans sin estado agrupados, y este estado se mantiene en la siguiente invocación del bean sin estado agrupado. Excepto durante la invocación del método, todas las instancias de un bean sin estado son equivalentes, lo que permite que el contenedor EJB asigne una instancia a cualquier cliente. Es decir, el estado de un bean de sesión sin estado debe aplicarse a todos los clientes.

También se menciona la ventaja del bean de sesión sin estado de la siguiente manera:

Como los beans de sesión sin estado pueden admitir varios clientes, pueden ofrecer una mejor escalabilidad para aplicaciones que requieren grandes cantidades de clientes. Normalmente, una aplicación requiere menos beans de sesión sin estado que beans de sesión con estado para admitir la misma cantidad de clientes.

Entonces, la pregunta que viene a la mente es cuando uno debería usar beans de sesión con estado. Para mi ingenua comprensión del asunto, uno debe quedarse con el uso de bean de sesión sin estado como pueda.

¿Cuáles serían los candidatos en los que se debería usar beans de sesión con estado? ¿Algún buen ejemplo?

Session Bean


Primero, debe comprender cómo se crean y manejan los beans en el servidor.

Para los beans de sesión sin estado, el servidor puede mantener una cantidad variable de instancias en un grupo. Cada vez que un cliente solicita un bean sin estado (por ejemplo, a través de un método) se elige una instancia aleatoria para atender esa solicitud. Eso significa que si el cliente realiza dos solicitudes posteriores, es posible que dos instancias diferentes del bean sin estado atiendan las solicitudes. De hecho, no hay un estado conversacional entre las dos solicitudes. Además, si el cliente desaparece, el bean sin estado no se destruye y puede atender la próxima solicitud de otro cliente.

Por otro lado, un bean de sesión con estado está estrechamente conectado con el cliente. Cada instancia se crea y limita a un único cliente y solo atiende solicitudes de ese cliente en particular. Ocurre que si realiza dos solicitudes posteriores en un bean con estado, su solicitud se servirá siempre desde la misma instancia del bean. Eso significa que puede mantener un estado de conversación entre las solicitudes. Al final del ciclo de vida, el cliente llama a un método de eliminación y el bean está siendo destruido / listo para la recolección de basura.

¿Cuándo usar stateless o stateful?

Eso depende principalmente de si desea mantener el estado conversacional . Por ejemplo, si tiene un método que suma números y devuelve el resultado, utiliza un bean sin estado porque es una operación de una sola vez. Si llama a este método por segunda vez con otros números, ya no está interesado en el resultado de la adición anterior.

Pero si quiere, por ejemplo, contar la cantidad de solicitudes que ha hecho un cliente, debe usar un bean stateful. En este escenario, es importante saber con qué frecuencia el cliente ha solicitado el método Bean antes, por lo que debe mantener el estado conversacional en el bean (por ejemplo, con una variable). Si utilizara un bean sin estado aquí, la solicitud del cliente se serviría cada vez desde un bean diferente, lo que daña sus resultados.