martes, 17 de agosto de 2010

Stateless VS Stateful

En este ejemplo voy a demostrar la diferencia entre Stateful Beans y Stateless Beans.
Para este ejemplo estoy usando Ubuntu version 10.04, Netbeans 3.0 y Glassfish V3.
Primeramente creamos una aplicacion Java EE, desde Netbeans

Para mi caso la voy a llamar SessionProject

Seleccionamos Glassfish como servidor y marcamos la casilla de creacion de un cliente para probar nuestra aplicación.



Una vez hecho esto, creamos un EJB Session Bean llamado StatefulBean, Este bean es Remoto de tipo Stateful en el paquete com.ejb.stateful

Ahora tenemos crear los métodos, para esto usamos Netbeans y dentro de StatefulBean damos click con el botón derecho seleccionamos InsertCode y luego AddBusinessMethod y creamos un método llamado incremetar, que devuelve un Integer



Una vez acabado esto nos quedará el siguiente código:
Para la Interface

package com.ejb.stateful;

import javax.ejb.Remote;

@Remote
public interface StatefulBeanRemote {

Integer incrementar();

}

ParaStatefulBean:

package com.ejb.stateful;

import javax.ejb.Stateful;

@Stateful
public class StatefulBean implements StatefulBeanRemote {
private Integer valor=0;
public Integer incrementar() {
return ++valor;
}

}


Ahora vamos a crear el Stateless.
Una vez hecho esto, creamos un EJB Session Bean llamado StatelessBean, Este bean es Remoto de tipo Stateless en el paquete com.ejb.stateless

Ahora tenemos crear los métodos, para esto usamos Netbeans y dentro de StatefulBean damos click con el botón derecho seleccionamos InsertCode y luego AddBusinessMethod y creamos un método llamado incremetar, que devuelve un Integer


Una vez acabado esto nos quedará el siguiente código:
Para la Interface


package com.ejb.stateless;

import javax.ejb.Remote;

@Remote
public interface StatelessBeanRemote {

Integer incrementar();
}



Para StatelessBean

package com.ejb.stateless;

import javax.ejb.Stateless;

@Stateless
public class StatelessBean implements StatelessBeanRemote {
private Integer valor=0;
public Integer incrementar() {
return ++valor;
}
}


Hecho esto, vamos a cambiar las propiedades del proyecto para ejecutar el cliente.Para esto damos botón derecho sobre el proyecto principal(SessionProject) y seleccionamos properties. Luego seleccionamos Run y en el Client Module seleccionamos SessionProject-app-client.


Una vez configurado, abrimos la clase main de SessionProject-app-client
damos boton derecho sobre el método main y seleccionamos InsertCode y luego "Call Enterprise Bean". Luego de esto seleccionamos SessionProject-ejb y en Reference Name colocamos statefulbean1. Los mismos pasos seguimos para statefulbean2, statelessbean1,statelessbean2



Con esto se nos genera el siguiente código:
@EJB(name = "statefulbean1")
private static StatefulBeanRemote statefulbean1;
@EJB(name = "statefulbean2")
private static StatefulBeanRemote statefulbean2;
@EJB(name = "statelessbean1")
private static StatelessBeanRemote statelessbean1;
@EJB(name = "statelessbean2")
private static StatelessBeanRemote statelessbean2;


Luego agregamos el siguiente código en el método main:
System.err.println("Variable Stateful1");
System.err.println(statefulbean1.incrementar());
System.err.println(statefulbean1.incrementar());
System.err.println(statefulbean1.incrementar());

System.err.println("Variable Stateful2");
System.err.println(statefulbean2.incrementar());
System.err.println(statefulbean2.incrementar());
System.err.println(statefulbean2.incrementar());

System.err.println("Variable Stateless1");
System.err.println(statelessbean1.incrementar());
System.err.println(statelessbean1.incrementar());
System.err.println(statelessbean1.incrementar());

System.err.println("Variable Stateless2");
System.err.println(statelessbean2.incrementar());
System.err.println(statelessbean2.incrementar());
System.err.println(statelessbean2.incrementar());


Con lo que el código final nos quedará como:
package sessionproject;

import com.ejb.stateful.StatefulBean;
import com.ejb.stateful.StatefulBeanRemote;
import com.ejb.stateless.StatelessBean;
import com.ejb.stateless.StatelessBeanRemote;
import javax.ejb.EJB;

public class Main {


@EJB(name = "statefulbean1")
private static StatefulBeanRemote statefulbean1;
@EJB(name = "statefulbean2")
private static StatefulBeanRemote statefulbean2;
@EJB(name = "statelessbean1")
private static StatelessBeanRemote statelessbean1;
@EJB(name = "statelessbean2")
private static StatelessBeanRemote statelessbean2;

public static void main(String[] args) {
System.err.println("Variable Stateful1");
System.err.println(statefulbean1.incrementar());
System.err.println(statefulbean1.incrementar());
System.err.println(statefulbean1.incrementar());

System.err.println("Variable Stateful2");
System.err.println(statefulbean2.incrementar());
System.err.println(statefulbean2.incrementar());
System.err.println(statefulbean2.incrementar());

System.err.println("Variable Stateless1");
System.err.println(statelessbean1.incrementar());
System.err.println(statelessbean1.incrementar());
System.err.println(statelessbean1.incrementar());

System.err.println("Variable Stateless2");
System.err.println(statelessbean2.incrementar());
System.err.println(statelessbean2.incrementar());
System.err.println(statelessbean2.incrementar());
}
}


Si ejecutamos el proyecto principal(SessionProject)
En la consola tenemos la siguiente salida:

Variable Stateful1
1

2
3
Variable Stateful2
1
2
3
Variable Stateless1
1
2
3
Variable Stateless2
4
5
6

La idea es que los cambios a stateless afectará a todas las instancias creadas de stateless. Mientras que en stateful, las instancias son independientes y no se ven afectadas.

No hay comentarios:

Publicar un comentario