507953 1 Contenido Contenido 2 Cambios 2 Introducción 3 Descripción del servicio Introducción Arquitectura 4 4 4 Paso a paso Capa de negocio Adapter Interface Service Proxy Fichero de propiedades Despliegue del servicio Cliente 5 5 5 7 7 9 9 10 Cambios FECHA 15/05/2005 AUTOR Jorge Vea-murguía Merck CAMBIOS Creación del documento jvea [arroba] ita [punto] es Instituto Tecnológico de Aragón 2 Introducción El presente documento expone una documentación básica del primer ejemplo desarrollado por el Instituto Tecnológico de Aragón para el proyecto Digital Business Ecosystem. Entorno de ejecución El presente ejemplo ha sido probado con el siguiente entorno de ejecución: Producto / Librería Versión servENT 0.1.2 FADA 5.2.6.1 JVM 1.4.8_02 Lib dbe-toolkit-protocoladapter 0.5.1 Lib dbe-toolkit-proxyframework 0.6.3 Lib fada-toolkit 5.2.6.1 Lib sun-servent 0.2.1 Referencias Para obtener más información sobre el proyecto, el lector puede acudir a las siguientes referencias: • Página oficial del proyecto: http://www.digital-ecosystem.org • Página oficial del proyecto en Aragón: http://www.ita.es/dbe • Página oficial con la ayuda: http://gaudi.techideas.info/dist/user_guide/ En el caso de querer contactar con el grupo, puede hacerlo en la dirección dbe [arroba] ita [punto] es 3 Descripción del servicio Seguidamente pasamos a describir el servicio de Helloword desarrollado. Introducción Integración de un negocio dentro del DBE. Arquitectura Hay una capa que representa un aplicación final, la cual integramos en el mundo DBE. La comunicación con el ServENT se realiza a través de un adapter, que abre un canal de comunicación utilizando RMI. En el Proxy implementamos el cliente de RMI, el cual da paso a los clientes del DBE a la capa de negocio. Toda la arquitectura puede estar en la misma máquina. • HelloWorld: responsable de recibir mensajes y guardarlos en un fichero, anotando la hora y fecha de recepción. Es capaz de publicar en una página Web los mensajes que va recibiendo (los que están almacenados en el fichero). • Client: Se ha creado un cliente que ejecuta el servicio a través de el ServENT El interfaz que hará las veces de descriptor de servicio (SDL), será el IHelloWorldInterface.java void addMessage (String message); 4 Paso a paso Los pasos a seguir para poder desarrollar este servicio son los siguientes: 1- Definir una capa de negocio 2- Crear un adapter que sirva de puente entre el service Proxy y capa de negocio 3- Definir el interface del servicio del adapter. 4- Desarrollar la implementación del interface dentro del service Proxy. 5- Crear el fichero con las propiedades del servicio. 6- Desplegar el servicio en un serVENT. 7- Opcionalmente, desarrollar un cliente a modo de prueba que conecte con un servENT (el mismo o bien un vecino) y ejecute el servicio desplegado. Capa de negocio En primer lugar nos creamos nuestro negocio. Tiene dos funcionalidades básicas. La primera es la escritura en un fichero de texto y la segunda la publicación vía Web de los mensajes almacenados en el mismo. HelloWorld.java Este fichero contiene el main de nuestra aplicación. Message.java Se encarga de escribir en el fichero mensajes WebServer.java Publica vía Web los mensajes almacenados en el fichero. Adapter Para entrar en el mundo DBE tenemos que modificar nuestro negocio. Las comunicaciones las realizamos a través de RMI. RMI es una opción, podríamos haber utilizado Soap. package org.dbe.demos.ita.helloworld; import java.rmi.*; 5 import java.rmi.server.UnicastRemoteObject; public class messageRMI extends UnicastRemoteObject implements IMessage{ public messageRMI(String name) throws RemoteException { super(); System.setSecurityManager(new RMISecurityManager()); try { Naming.rebind("rmi://193.144.228.57/IMessage",this); System.out.println("RMI Server"); } catch(Exception e) { System.err.println("Excepcion"+e.getMessage()); e.printStackTrace(); } } public void message(String message)throws RemoteException { try { Message myMessage=Message.getInstance("message"); myMessage.addMessage(message); } catch(Exception e) { System.err.println("Excepcion"+e.getMessage()); e.printStackTrace(); } } 6 } Interface Heredamos el interface de IMessage. Nos sirve de puente entre la capa de negocio y DBE. Aquí definimos las funciones que vamos a utilizar desde el ServENT. Casualmente el interface que nos creamos es el mismo que el que ya teníamos creado con la clase mensaje package org.dbe.demos.ita.helloworld.client; import org.dbe.demos.ita.helloworld.IMessage; public interface IHelloWorldInterface extends IMessage{ } Service Proxy La comunicación con el adapter se realiza en el propio proxy, por lo que no sólo hace las funciones de service Proxy. Como Proxy debe implementar el interface anterior y el interface Adapter, para que pueda ser desplegado dentro del servENT. package org.dbe.demos.ita.helloworld.client; import java.net.MalformedURLException; import java.rmi.Naming; import java.rmi.NotBoundException; import java.rmi.RMISecurityManager; import java.rmi.RemoteException; import org.dbe.demos.ita.helloworld.IMessage; import org.dbe.servent.Adapter; import org.dbe.servent.ServiceContext; public class HelloWorldServiceImpl implements Adapter,IHelloWorldInterface{ 7 IMessage mymessageRMI; public HelloWorldServiceImpl(){ } public void init(ServiceContext arg0) { System.setSecurityManager(new RMISecurityManager()); try { mymessageRMI=(IMessage)Naming.lookup("rmi://"+ arg0.getParameter("ip")+"/IMessage"); } catch (MalformedURLException e) { e.printStackTrace(); System.err.println("MalformedURLException!"+e); } catch (NotBoundException e) { e.printStackTrace(); System.err.println("NotBoundException!"+e); } catch (RemoteException e) { e.printStackTrace(); System.err.println("RemoteException!"+e); } } public void destroy() { 8 } public void message(String message) { try { mymessageRMI.message(message); } catch (RemoteException e) { e.printStackTrace(); System.err.println("RemoteException!"+e); } } } Fichero de propiedades Antes de realizar el despliegue del servicio, es preciso generar el fichero con las propiedades del mismo. Para ello, hay que generar un fichero deployment.props con la siguiente información: • applicationName: Nombre del servicio • adapter: clase que implementa el interface y hace de adapter • smid: identificador del service manifest • ip: IP es el parámetro que se lee desde la clase service proxy por el método init(), que comunica con nuestra capa de negocio. En nuestro ejemplo, el fichero deployment.props queda como sigue: applicationName=ITA Helloworld Service adapter=org.dbe.demos.ita.helloworld.client.HelloWorldServiceImpl smid=helloword ip=193.144.228.57 Despliegue del servicio Para desplegar el servicio, la forma más simple es copiar el fichero de propiedades junto con las clases bajo la carpeta deploy del servENT. La estructura final sería la siguiente: 9 Bajo la carpeta: servent/deploy/MiEjemplo/, ubicaremos: • El fichero deployment.props • La carpeta classes con todas las clases. Primero el registro de rmiregistry desde la ruta donde tengamos las clases de la capa de negocio. rmiregistry& Después ejecutamos la capa de negocio con las variables de sistema de java correspondientes. -Djava.security.police: Tendremos especia cuidado en permitir la comunicación de RMI. Para ello hay que modificar el fichero de políticas de java o pasarle como parámetro un fichero de política que no interfiera en otros programas de java. -Djava.rmi.server.hostname: La Ip de la maquina que hace de servidor de RMI -Djava.rmi.server.codebase: las clases donde estan los ficheros RMI ejemplo para lanzar la capa de negocio java -Djava.security.police=file:../helloworld/bin/javaallow.police -Djava.rmi.server.hostname=193.144.228.57 Djava.rmi.server.codebase=file:../helloworld/bin/ org.dbe.demos.ita.helloworld.HelloWorld - Por último, deberemos iniciar el ServENT o reiniciarlo en caso de que ya estuviera lanzado mediante el script servent/bin/run.sh Cliente Para comprobar el correcto funcionamiento del servicio, hemos desarrollado un cliente que manda el mensaje de hola desde el dbe. Para lanzar el cliente hay que escribir la IP de nuestro servidor DBE A la hora de crear el ClientHelper que permite obtener la referencia al servicio, hay que poner la dirección de un ServENT, de forma que pueda efectuar la búsqueda a través de FADA y devuelva la referencia al servicio dado. import java.net.URL; import org.dbe.demos.ita.helloworld.client.IHelloWorldInterface; import org.sun.dbe.ClientHelper; public class Client { String _ip; public Client(String ip) {_ip=ip; } public void test() { 10 try { System.out.println("Creating ClientHelper..."); ClientHelper helper = new ClientHelper(new URL( "http://"+_ip+":2728")); System.out.println("Getting IHelloWorldInterface..."); IHelloWorldInterface myHelloWorld = (IHelloWorldInterface) helper.getProxy( IHelloWorldInterface.class, new String[] { "helloworld" }); myHelloWorld.message("hola desde el dbe"); } catch (Exception ex) { System.out.println("Don't find DBE."); //ex.printStackTrace(); } } public static void main(String[] args) { try { Client myClient = new Client(args[0]); myClient.test(); } catch (Exception ex) { System.out.println("write ip server DBE..."); //ex.printStackTrace(); } } } Si ejecutamos el cliente, para ver el resultado, a través de un navegador en la dirección http://legacySystem:8080/ 11