|
Buscador
Secciones
Registro
¡Colabora!
Ganamos
Servicios
|
Inicio > Tutoriales > Lenguajes orientados a objeto > Java > J2EE > Construir Aplicaciones EJB con JBoss, Lomboz y Eclipse
![]()
|
OK, OK!, Como referencia aquí tienes los pasos a seguir:
|
Añadir Métodos de Retrollamada:Al contrario que en el bean sin estado, el método ejbCreate tendrá un argumento. Este se utilizará para inicializar un campo persistente en el bean.
private String userID;
/**
* @ejb.interface-method
* view-type="remote"
*/
public void setUserID(String userID) {
this.userID = userID;
}
/**
* @ejb.interface-method
* view-type="remote"
*/
public String getUserID() {
return userID;
}
public void ejbCreate (String userID)

Ahora, los otros dos métodos de retrollamadas necesarios para completar este bean son:
protected SessionContext ctx;

|
NOTA:
La clase StoreAccessStateSession desciende de la clase abstracta StoreAccessStateBean e implementa SessionBean, que sobrescribirá todos los métodos del interface SessionBean. Por eso, después de completar los métodos de la clase Bean debes regenerar las clases EJB. Se sobreescribirán los métodos SessionContext como se vió en la página anterior. |
|
NOTA:
En páginas anteriores ya vimos los pasos para generar las clases EJB. |
Implementar el Interface DAO:No tenemos que implementar el interface DAO porque estámos utilizando la clase StoreAccessDAOImpl creada en la página anterior.

Ya se han implementado todos los métodos, sólo quedan por terminar los descriptores de despligue.
Desplegar el Bean:Antes de desplegar el bean tenemos que declarar unas cuantas etiquetas en la clase StoreAccessStateBean:

@ejb.resource-ref res-ref-name="jdbc/DefaultDS" res-type="javax.sql.Datasource" res-auth="Container"
Esta etiqueta generará los descriptores de despliegue en ejb-jar.xml, ya que el bean tiene que saber a qué fuentes de datos va a conectarse, de qué tipo, etc. Esto generará estos descriptores:

@jboss.resource-ref res-ref-name="jdbc/DefaultDS" jndi-name="java:/DefaultDS"
Esta etiqueta generará los descriptores de despliegue en jboss.xml, ya que el servidor de aplicaciones tiene que saber qué nombre JNDI tendrá la fuente de datos. Esto generará estos descriptores:

@jboss.container-configuration name ="Standard Stateful SessionBean"
Esta etiqueta generará los descriptores de despliegue en jboss.xml, ya que el servidor de aplicaciones tiene que saber qué configuración va a leer el bean con estado desde standardjboss.xml bajo /opt/jboss/jboss-3.2.1/server/all/conf/. Esto generará los siguientes descripores en jboss.xml:
<session>
<ejb-name>StoreAccessState</ejb-name>
<jndi-name>StoreAccessStateBean</jndi-name>
<configuration-name>Standard Stateful SessionBean</configuration-name>
<resource-ref>
<res-ref-name>jdbc/DefaultDS</res-ref-name>
<jndi-name>java:/DefaultDS</jndi-name>
</resource-ref>
</session>
|
NOTA:
Esta configuración es para que el bean de sesión con estado lea el contenedor de JBoss. JBoss viene con un timeout de 60 minutos para los beans de sesión con estado. Cambia el atributo <max-bean-life> a 120 segundos y reinicia el servidor. Como puedes ver en el siguiente fragmento de código del fichero /opt/jboss/jboss-3.2.1/servaer/all/conf/standardjboss.xml:
<container-configuration>
<container-name>Standard Stateful SessionBean</container-name>
<call-logging>false</call-logging>
<invoker-proxy-binding-name>stateful-rmi-invoker</invoker-proxy-binding-name>
<container-interceptors>
-------------------------------------------------------------------
----------------------------------------------------------------------
---------------------------------------------------------------------
<container-cache-conf>
<cache-policy>org.jboss.ejb.plugins.LRUStatefulContextCachePolicy</cache-policy>
<cache-policy-conf>
<min-capacity>50</min-capacity>
<max-capacity>1000000</max-capacity>
<!--remover-period>1800</remover-period-->
<remover-period>120</remover-period>
<max-bean-life>120</max-bean-life>
<!-- By default Jboss comes withh 60 mins time out for stateful bean,change it
to 120 secs (2 mins) and restart the server to read this config.
-->
<!--max-bean-life>1800</max-bean-life-->
<!-- 1800 secs = 30 mins -->
<overager-period>300</overager-period>
<max-bean-age>600</max-bean-age>
<resizer-period>400</resizer-period>
<max-cache-miss-period>60</max-cache-miss-period>
<min-cache-miss-period>1</min-cache-miss-period>
<cache-load-factor>0.75</cache-load-factor>
</cache-policy-conf>
</container-cache-conf>
----------------------------------------------------------------------
---------------------------------------------------------------------
|
Ahora, ya está todo terminado y ha llegado el momento de desplegar el bean.
|
NOTA:
Hemos regenerado las clases una y otra vez para poder explicar cada paso y su resultado. Una vez que estés familiarizado con estos pasos sólo necesitas generar tus clases de vez en cuando. De cualquier modo, no afecta a tu implementación, por eso puedes (re)generar tus clases siempre que quieras. |
Ahora espera un poco para ver el resultado del despliegue.
Si todo ha ido bien, obtendrás en la consola un mensaje como este:

Ya que hemos desplegado con éxito nuestro bean creemos un cliente de prueba, que llamará al método loginUser de StoreAccessStateBean.
Crear un Test de Cliente:

Esto generará los métodos de ayuda necesarios en la clase SessionStateClient y simplemente tendremos que llamar al método loginUser del bean.
public void testBean() {
String userID = null;
try {
au.com.tusc.sessionState.StoreAccessState myBean =
getHome().create(userID);
//--------------------------------------
//This is the place you make your calls.
//System.out.println(myBean.callYourMethod());
System.out.println("Request from client : ");
userID = myBean.loginUser("ANDY","PASSWD");
System.out.println("Reply from Server: Your userid is " + userID);
myBean.setUserID(userID);
System.out.println("Going to Sleep for 1 min ......................... " );
Thread.sleep(60000); // sleep for 1 minute.
System.out.println("Reply from bean after 1min " + myBean.getUserID());
System.out.println("Again going to Sleep for 3 min ......................... " );
Thread.sleep(180000); // sleep for 3 minute.
System.out.println("Resuming after 3 mins ......................... " );
//Next statement will not be executed as bean will timeout on the server side
//resulting in exception.
System.out.println("Reply from bean after 2mins " + myBean.getUserID());
}catch (InterruptedException e) {
}catch (NoSuchObjectException e) {
System.out.println("No Such Object Exception caught ");
} catch (RemoteException e) {
System.out.println("Remote Exception caught ");
} catch (CreateException e) {
e.printStackTrace();
} catch (NamingException e) {
e.printStackTrace();
} catch (EJBException e) {
System.out.println("EJB Exception caught ");
}
}
public static void main(String[] args) {
SessionStateClient test = new SessionStateClient();
test.testBean();
}
Probar el ClienteAhora bajo la consola, si obtienes una respuesta U2 para ANDY, antes de un minuto, pero después de 3 minutos se captura una NoSuchObjectException significará que el bean con estado está funcionando con éxito.

| Leer comentarios (72) | |
| Escribir comentario | |
| Puntuación: |
|
| Votar | |
| Recomendar este tutorial | |
| Estadísticas |
Copyright © 1999-2006
Programación en castellano.
Todos los derechos reservados.
Formulario de Contacto -
Datos legales -
Publicidad
Hospedaje web y servidores dedicados linux por
Ferca Network