Los componentes JavaBeans Enterprise se ejecutan dentro de Contenedores JavaBeans Enterprise, que son suministrados por servidores de JavaBeans Enterprise de terceras partes. Las siguientes instrucciones nos ayudar�n a descargar e instalar el servidor BEA Weblogic en el que ejecutaremos el ejemplo DemoBean.
Nota: las instrucciones de instalaci�n mostradas aqu� son para Sun Solaris, pero el proceso es similar para Windows NT.
- Descargar el servidor Bea WebLogic desde su Web site.
- Extraer la distribuci�n usando las utilidades jar o unzip. Este tutorial asume que el Weblogic est� instalado en el directorio /export, por ejemplo, /export/weblogic.
- Descargar la �ltima versi�n de Java Development Kit desde la web site del JDK para Solaris.
- Configuramos el CLASSPATH sobre el host del servidor.
A�adimos weblogic/classes y weblogic/lib/weblogicaux.jar a nuestro CLASSPATH.
A�adimos weblogic/lib/solaris a nuestro LD_LIBRARY_PATH
- Editar el fichero de propiedades de BEA WebLogic: weblogic.properties
Seleccionamos la propiedad de password del sistema, weblogic.password.system
- Arrancamos el servidor Weblogic usando el script startTengah.sh.
Despu�s seguimos los pasos de este tutorial para construir y desarrollar el Bean de ejemplo, probar que los beans JavaBeans Enterprise se han desarrollado correctamente, o chequeando la ventana de la l�nea de comandos del servidor, o abriendo la Consola y examinado el "EJB" bajo el "Distributed Objects"; deber�amos ver el DemoBean instalado, y podremos monitorizar su actividad.
�Paso 2: Especificar el Interface Remoto de JavaBeans Enterprise
En este paso crearemos un interface remoto JavaBean Enterprise.
El interface remoto es la vista del cliente de los JavaBeans Enterprise, y las tareas que desarrolla nuestro javaBean se declaran en este interface usando las s�ntaxis RMI de Java. Es responsabilidad del proveedor de las herramientas de contenedores de JavaBeans Enterprise generar el c�digo para este interface.
Nota: Hay algunas limitaciones sobre lo que se puede especificar en este interface. Para una lista completa puedes ver la secci�n 16 de la Especificaci�n de JavaBeans Enterprise. Es importante que, todos los objetos usados, los par�metros, los valores de retorno y las excepciones sean tipos v�lidos en la "especificaci�n de mapeo de Java a IDL".
Aqu� tenemos el c�digo fuente del interface remoto para el sencillo DemoBean. Debemos grabarlo en un fichero llamado Demo.java.
/** * Demo -- this is the "remote" interface of * our enterprise JavaBean, it * defines only one simple method called * demoSelect(). As this is meant to be * the simplest of examples demoSelect() * never goes to a database, it just * returns a string * * Note: The implementation of this interface is * provided by the container tools * but the demoSelect() method and any * other methods in this interface * will need to have equivalent * implementations in the demobean.java * which is supplied by the bean writer * ..i.e., you! */ package ejb.demo; import java.rmi.RemoteException; import java.rmi.Remote; import javax.ejb.*; public interface Demo extends EJBObject, Remote { // NB this simple example does not even do a // lookup in the database public String demoSelect() throws RemoteException; }
�Paso 3: Especificar el Interface Home
El interface home para un bean de sesi�n proporciona el mecanismo mediante el cual el contenedor crea nuevos beans de sesi�n en nombre del cliente. El interface home, al igual que el interface remoto, se declara con la s�ntaxis RMI, y de nuevo, lo implementa la herramienta proveedora de contenedores. En este punto el programador no tiene mucho trabajo, es s�lo declaraciones.
Aqu� est� el c�digo fuente para el DemoBean EJB.
/** * DemoHome.java - This is the Home interface it must * extend javax.ejb.EJBHome and define one or more * create() methods for the bean. * * Note: The implementation of this interface is * generated by the container tools. */ package ejb.demo; import javax.ejb.*; import java.rmi.Remote; import java.rmi.RemoteException; import java.util.*; /** * This interface is extremely simple it declares only * one create method. */ public interface DemoHome extends EJBHome { public Demo create() throws CreateException, RemoteException; }
�Paso 4: Escribir la Clase JavaBean Enterprise
Este paso nos ense�a c�mo se crea el c�digo de una aplicaci�n (la l�gica del negocio). Hasta ahora, hemos declarado interfaces para los que la herramienta de contenedores generaba c�digo, pero aqu� es donde se codifica la funcionalidad del JavaBean.
Una cosa importante a observar sobre la implementaci�n del Bean, es el poco c�digo que debemos generar. La mayor�a del c�digo es simplemente implementar m�todos de la especificaci�n de JavaBeans Enterprise. Es f�cil crear plantillas y herramientas que nos hagan la mayor parte del trabajo de implementaci�n. Esto es comparable con la forma en que algunas herramientas crean los entornos GUI para Beans.
Aqu� est� el c�digo fuente del JavaBean DemoBean.java.
/** * DemoBean -- This is implemented by the EnterPrise * Bean author This class must extend * javax.ejb.SessionBean and implement * the methods in this interface as well as providing * the implementation of the business methods. * */ package ejb.demo; import javax.ejb.*; import java.io.Serializable; import java.util.*; import java.rmi.*; public class DemoBean implements SessionBean { static final boolean verbose = true; private transient SessionContext ctx; private transient Properties props; // Implement the methods in the SessionBean // interface public void ejbActivate() { if (verbose) System.out.println("ejbActivate called"); } public void ejbRemove() { if (verbose) System.out.println("ejbRemove called"); } public void ejbPassivate() { if (verbose) System.out.println("ejbPassivate called"); } /** * Sets the session context. * * @param SessionContext */ public void setSessionContext(SessionContext ctx) { if (verbose) System.out.println("setSessionContext called"); this.ctx = ctx; props = ctx.getEnvironment(); } /** * This method corresponds to the create method in * the home interface DemoHome.java. * The parameter sets of the two methods are * identical. When the client calls * DemoHome.create(), the container allocates an * instance of the EJBean and calls ejbCreate(). */ public void ejbCreate () { if (verbose) System.out.println("ejbCreate called"); } /** * **** HERE IS THE BUSINESS LOGIC ***** * Do the demoSelect() but don't even go to * the database in this eg but instead just * return a String. * The really BIG thing to notice here is that * this is the only code we have invented at all * the rest of the code has been declarations * or simply implementing methods which are * part of the EJB interfaces and in this example * are not even used. */ public String demoSelect() throws RemoteException { return("hello world"); } }
�Paso 5: Crear el Fichero ejb-jar
Una de las grandes ventajas de los JavaBeans Enterprise es la habilidad de empaquetar y distribuir la l�gica del lado del servidor de la misma forma portable que los componentes GUI. En este paso los ficheros fuente procedentes de los pasos anteriores son compilados y empaquetados en un fichero ejb-jar. Completando los siguientes pasos produciremos el fichero Demo.jar ejb-jar, que estar� listo para el despliegue o instalaci�n en el Contenedor de JavaBeans Enterprise.
�5.1. Compilar los ficheros .java
Ejecutamos javac sobre los ficheros que acabamos de crear, es decir, los interfaces remoto y home, y el propio bean JavaBeans Enterprise.
javac ejb/demo/DemoHome.java javac ejb/demo/Demo.java javac ejb/demo/DemoBean.java
�5.2. Crer el Descriptor de Desarrollo
Nota: Desarrollo es el t�rmino en JavaBeans Enterprise para instalar los componentes JavaBeans dentro de un contenedor JavaBeans Enterprise.
El papel del descriptor de desarrollo es permitir que el desarrollador del Bean personalice muchas de las propiedades del Bean antes de desplegarlo. El descriptor de desarrollo se describe en la especificaci�n de JavaBeans Enterprise (secci�n 15.2) como un ejemplar de javax.ejb.deployment.SessionDescriptor o javax.ejb.deployment.EntityDescriptor. En el ejemplo DemoBean, es un ejemplar de javax.ejb.deployment.SessionDescriptor. Abajo hay un ejemplo del fichero de texto de entrada a las utilidades de WebLogic que genera el ejemplar serializado de este descriptor de desarrollo.
Observa que la metodolog�a para crear el descritor de desarrollo no est� especificada, por eso las herramientas usadas para desplegar los JavaBeans Enterprise podr�an aparecer y actuar de forma diferente unos de otros, sin afectar a las propias habilidades del propio bean muti-plataforma.
Este ejemplo contin�a con la creacci�n de DeploymentDescriptor con las herramientas de WebLogic. La implementaci�n del servidor de Bea WebLogic ofrece versiones para la l�nea de comandos y GUI. Por eso para desplegar el JavaBean Enterprise usando las herramientas de la l�nea de comandos, env�amos estos comandos.
java weblogic.ejb.utils.DDCreator -dir ejb/demo ejb/demo DeploymentDescriptor.txt
Esto crear� DemoBeanDD.ser en el directorio ejb/demo.
Un ejemplo del fichero de texto DeploymentDescriptor.txt como entrada para las herramientas de Bea WebLogic: (fuente).
(SessionDescriptor ; This file must start with SessionDescriptor or ; EntityDescriptor ; Indicate the name which the bean will be bound ; into the JNDI name as beanHomeName demo.DemoHome ; The enterprise Java Bean class (see step 4) enterpriseBeanClassName ejb.demo.DemoBean homeInterfaceClassName ejb.demo.DemoHome ; The home interface implemented by a class ; generated by the container provided tools ; see step 3 remoteInterfaceClassName ejb.demo.Demo ; See step 2 isReentrant false ; Always false for session beans stateManagementType STATELESS_SESSION ; Either STATELESS_SESSION or STATEFUL_SESSION. ; DemoBean is a stateless session bean sessionTimeout 5 ; seconds (controlDescriptors ; This section decides the run-time properties when ; a method is called. The DEFAULT sub-section applies ; to all methods, but can be overridden on a per-method ; basis, similar to the "accessControlEntries" above. (DEFAULT isolationLevel TRANSACTION_SERIALIZABLE transactionAttribute TX_REQUIRED runAsMode CLIENT_IDENTITY ) ; end isolationLevel ) ; end controlDescriptors (environmentProperties maxBeansInFreePool 100 ) ; end environmentProperties ) ; end SessionDescriptor
Nota: Este ejemplo es para el servidor BEA Weblogic que usa punto y coma (;) para l�neas de comentario.
�5.3. Crear el Manifiesto
El manifiesto lo genera autom�ticamente la utilidad jar, pero tomar� una plantilla, por eso crear un fichero de texto (por ejemplo, ejb/demo/manifest.txt) con los siguientes contenidos. Puedes referirte a la secci�n sobre el empaquetado del Bean para ver como se usa este fichero de texto.
Para una descripci�n del fichero de manifiesto, puedes ver la Secci�n 15,3 de la Espcificaci�n de JavaBeans Enterprise.
Name: ejb/demo/DemoBeanDD.ser Enterprise-Bean: True
�5.4. Asegurarnos de que Tenemos todas las Piezas
Aqu� est�n las piezas que el desarrollador y proveedor de JavaBeans Enterprise necesita suministrar para crear un fichero ejb-jar v�lido, es decir, el bean JavaBean Enterprise.
- Las clases del bean Enterprise + cualquier otra clase de las que dependa el Bean (Paso 4).
- El interface remoto del Bean Enterprise (Paso 2).
- El interface home del Bean Enterprise (Paso 3).
- Un descriptor de desarrollo (ver arriba).
- Un ejemplar de java.util.Properties, si lo necesita el Bean.
- Un fichero manifiesto que identifica los descriptores de desarrollo del fichero ejb-jar.
El proveedor de Bean JavaBeans Enterprise es responsable de poner todas estas clases dentro del fichero ejb-jar, pero se espera que la mayor�a de los proveedores de contenedores y servidores proporcionen herramietnas para hacer este empaquetado y ensamblaje.
�5.5. Crear el Fichero ejb-jar
Para el ejemplo juntamos todas las piezas para crear un fichero jar llamando Demo.jar. Se espera que las futuras herramietnas hagan el empaquetado y la generaci�n del fichero ejb-jar mucho m�s sencillas. Podemos imaginar un ayudante que nos guie y que chequee las dependencias.
Para crear el fichero ejb-jar Demo.jar para el ejemplo, podemos asumir que las piezas del fichero jar est�n para un directorio llamado ejb. Simplemente creamos un fichero jar con la estructura de este directorio.
Notas: Usamos la bandera m para empaquetar y el fichero ejb/demo/manifest.txt como una plantilla para el manifiesto. No es necesario poner el fichero manifest.txt dentro del fichero jar.
jar cvfm Demo.jar ejb/demo/manifest.txt ejb/demo/*.class \ ejb/demo/*.ser
Al inspeccionar el fichero Demo.jar deberiamos ver una salida similar a esta.
jar tf Demo.jar META-INF/MANIFEST.MF ejb/demo/Demo.class ejb/demo/DemoBean.class ejb/demo/DemoHome.class ejb/demo/DemoBeanDD.ser
Como puedes ver, no hay nada demasiado especial sobre el fichero ejb-jar.
�Paso 6: Desplegar el DemoBean JavaBean Enterprise
En este paso el JavaBean DemoBean es instalado, o desplegado, dentro de un contenedor de JavaBeans Enterprise. Es importante observar que cada vendedor de servidores tendr� herramietnas espec�ficas para permitir esta instalaci�n.
Seguimos las siguientes instrucciones para instalar DemoBean dentro del servidor de Bea Weblogic que instalamos en el Paso 1.
�Desarrollo en BEA WebLogic
En la versi�n actual del servidor de Weblogic desde Bea Weblogic, desplegar el Bean JavaBean Enterprise significa "poner las clases del Bean donde el servidor Weblogic pueda encontrarlas." Esto no es una cosa dificil, pero tampoco es muy elegante, y esperamos que haya algunas herramientas para simplificar este paso y que hagan lo que est� sucediendo m�s �bvio.
Nota: Este ejemplo asume que el servidor Weblogic est� instalado en el directorio /export.
�6.1. Generar las Implementaciones
Este paso crea las implementaciones de los interfaces especificados anteriormente, y las clases de soporte espec�ficas del BEA WebLogic para el DemoBean. Observa que no est�n empaquetadas con nuestro Bean. Las clases generadas son, por ejemplo, los interfaces home y remoto, as� como las clases requeridas para el soporte de los protocolos de comunicaci�n. El hecho de que est�s clases sean generadas durante el despliegue, y no escritas por el proveedor del Bean (programador) es la parte m�s importante que permite que los JavaBeans Enterprise sean de protocolo neutral.
Nota: Asumimos que el servidor WebLogic ha sido instalado en el directorio /export. Tendremos que modificar el directorio de destino (con el par�metro -d) si est� instalado en otro lugar.
Para generar las implementaciones para el DemoBean usamos las herramientas de Bea WebLogic.
java weblogic.ejbc -d /export/weblogic/classes ejb/demo/DemoBeanDD.ser
Esta utilidad crea clases con nombres similares a �stos y los pone bajo el directorio /export/weblogic/classes.
ejb/demo/DemoBeanEOImpl.class ejb/demo/DemoBeanHomeImpl.class ejb/demo/Skel5k5x705r2x671nd1i1vy2v524ua5y.class ejb/demo/Skel5q585f5sfzo601q4e725b233m5140.class ejb/demo/Stub5k5x705r2x671nd1i1vy2v524ua5y.class ejb/demo/Stub5q585f5sfzo601q4e725b233m5140.class
�6.2. Poner el fichero Demo.jar dentro del CLASSPATH del servidor Weblogic
Hay varias formas de hacer esto, pero la m�s simple es poner el fichero Demo.jar en el directorio /export/weblogic/classes, luego editar el script /export/weblogic/startTengah.sh para incluir el fichero Demo.jar.
/export/weblogic/startTengah.sh
#!/bin/sh # # Shell script to manually start Weblogic # Server on UNIX systems CLASSPATH=$CLASSPATH:/export/weblogic/classes/Demo.jar echo $CLASSPATH java -ms16m -mx16m -verbosegc weblogic.Server
�6.3. Editar el Fichero weblogic.properties
Incluimos las instrucciones de carga y arranque para los nuevos JavaBeans Enterprise.
/export/weblogic/weblogic.properties
# # # # # # # # # # # # # # # # # # # # # # # # # # # Weblogic Enterprise JavaBeans DEMO PROPERTIES # ------------------------------------------------- # Uncomment the appropriate lines below and modify # DBMS-related info and paths to match your particular # installation. # # Deploys the Enterprise JavaBean examples. Uncomment to use. weblogic.ejb.deploy=\ /export/weblogic/classes/beanManaged.jar,\ /export/weblogic/classes/containerManaged.jar,\ /export/weblogic/classes/statefulSession.jar,\ /export/weblogic/classes/DemoBeanDD.jar # # weblogic.properties file continues below... #
�6.4. Parar y re-arrancar el servidor Weblogic
Podemos usar las herramientas de Bea WebLogic para parar y re-arrancar el servidor WebLogic o en un entorno simplemente eliminamos el proceso principal de WebLogic, y usamos el script /expot/weblogic/startTengah.sh para re-arrancarlo. Para m�s detalles puedes ver la documentaci�n sobre las Herramietnas de BEA Weblogic.
�Paso 7: Escribir el Cliente JavaBean Enterprise
Si hemos completado con �xito los pasos del 1 al 6, el DemoBean deber�a estar desplegado dentro del contenedor de JavaBeans Enterprise y estar� listo para aceptar llamadas de un cliente a cualquiera de los m�todos especificados en el interface remoto.
�Escribir el Cliente
La escritura del cliente es otra de las partes del proceso donde tendremos que escribir alg�n c�digo, aparte de la propia l�gica de negocio del Bean JavaBean Enterprise.
El cliente de un JavaBean Enterprise puede ser una gran variedad de cosas: por ejemplo, un servelt, un applet, o quiz�s un programa C/C++. El ejemplo DemoClient.java es el cliente para el JavaBean Enterprise DemoBean, creado en los pasos anteriores. Las cosas m�s importantes a observar en este programa son.
- Establecer el contexto inicial JNDI.
- Localizar el interface home del JavaBean Enterprise usando JNDI.
- Usar el interface home para instruir al Contenedor para que cree un ejemplar del JavaBean Enterprise.
- Usar el interface remoto para instruir al Contenedor de que ejecute los m�todos del JavaBean Enterprise.
Otra cosa a observar es que como hemos desplegado el Bean en diferentes servidores/contenedores, necesitaremos diferentes versiones del c�digo del cliente. Las diferencias en este c�digo no se espera que sean importantes, pero podr�an crear problemas, como los strings correctos para la conexi�n inicial. Por ejemplo, consideremos el siguiente c�digo, que configura el objeto Properties para que el Bea WebLogic recupere el objeto initialContext JNDI. Podr�a diferir del string Properties de Oracle para obtener el objeto initialContext.
p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.T3InitialContextFactory");
Hay una gran variedad de peque�os problemas que podr�an requerir alg�n ajuste o recompilaci�n del c�digo del cliente, pero no se espera que se necesiten grandes cantidades de trabajo.
El siguiente cliente demuestra c�mo localizar el JavaBean Enterprise y como invocar a su m�todos remotos.
(C�digo fuente) de DemoClient.java
/** * DemoClient -- demonstrates using a minimal * Java application to talk to the DemoBean * stateless session bean */ package ejb.demo; import javax.ejb.*; import javax.naming.*; import java.rmi.*; import java.util.Properties; /** * DemoClient demonstrates using a minimal stateless * session bean. * Remember view session beans as an extension of your * client running in the server. */ public class DemoClient { public static void main(String[] args) { System.out.println("\nBegin DemoClient...\n"); parseArgs(args); try { // Create A DemoBean object, in the server // Note: the name of the class corresponds to the // JNDI property declared in the // DeploymentDescriptor // From DeploymentDescriptor ... // beanHomeName demo.DemoHome Context ctx = getInitialContext(); DemoHome dhome = (DemoHome) ctx.lookup("demo.DemoHome"); // Now you have a reference to the DemoHome object // factory use it to ask the container to creat an // instance of the Demo bean System.out.println("Creating Demo\n"); Demo demo = dhome.create(); // Here is the call that executes the method on the // server side object System.out.println("The result is " + demo.demoSelect()); } catch (Exception e) { System.out.println(" => Error <="); e.printStackTrace(); } System.out.println("\nEnd DemoClient...\n"); } static void parseArgs(String args[]) { if ((args == null) || (args.length == 0)) return; for (int i = 0; i < args.length; i++) { if (args[i].equals("-url")) url = args[++i]; else if (args[i].equals("-user")) user = args[++i]; else if (args[i].equals("-password")) password = args[++i]; } } static String user = null; static String password = null; static String url = "t3://localhost:7001"; /** * Gets an initial context. * * @return Context * @exception java.lang.Exception if there is * an error in getting a Context */ static public Context getInitialContext() throws Exception { Properties p = new Properties(); p.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.T3InitialContextFactory"); p.put(Context.PROVIDER_URL, url); if (user != null) { System.out.println ("user: " + user); p.put(Context.SECURITY_PRINCIPAL, user); if (password == null) password = ""; p.put(Context.SECURITY_CREDENTIALS, password); } return new InitialContext(p); } }
�Paso 8: Compilar y Ejecutar el Cliente
Todo lo que queda por hacer es compilar y ejecutar el programa cliente para asegurarnos de que los JavaBeans Enterprise, instalados en el servidor, funcionan correctamente.
La compilaci�n y ejecuci�n del cliente son id�nticos para todas las plataformas, y tambi�n lo deber�an ser los resultados del cliente.
�8.1. Compilar el Cliente
javac ejb/demo/DemoClient.java
�8.2. Ejecutar el Cliente
El string "Hello World" viene del m�todo DemoSelect() del JavaBean Enterprise. Al ejecutarlo deber�amos ver los siguientes mensajes.
java ejb.demo.DemoClient <cr>
Begin DemoClient... Creating Demo The result is hello world End DemoClient...