PROGRAMACION DISTRIBUIDA



Documentos relacionados
PROGRAMACION DISTRIBUIDA MobileTracker: Ejemplo de implementación con RMI

Java RMI Remote Method Invocation. Invocación Remota de Métodos en Java

Java RMI. las RPC de Java. Parte I. Luis Fernando Llana Díaz. Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid

JAVA RMI (REMOTE METHOD INVOCATION)

1. Visión general de RMI

Java RMI. Sistemas Distribuidos Rodrigo Santamaría

Modelo de Objetos Distribuidos

CONTENIDO. Serialización. Carga dinamica de stubs RMI AVANZADO. Callbacks. Carga dinámica de Stubs

en otra máquina exactamente de la misma manera que si se encontrará en la misma máquina

Sistemas Distribuidos (Capítulo 8 de Distributed Computing de M. L. Liu)

Sistemas Distribuidos Java RMI (Remote Method Invocation) Alberto Lafuente Mikel Larrea Dpto. ATC, UPV/EHU

DISEÑO DE UNA ARQUITECTURA CLIENTE/SERVIDOR MEDIANTE OBJETOS DISTRIBUIDOS EN JAVA

5.1 Introducción a las tecnologías de objetos distribuidos con Java RMI

Código Fuente. Creamos en C:\ una carpeta para ubicar el código fuente del servidor. En mi caso, he creado una carpeta denominada rmi4

Arquitectura Cliente/Servidor. Invocación de Métodos Remotos RMI: Remote Method Invocation. Llamadas a Métodos Remotos

RMI [Remote Method Invocation]

Ingeniería del Software Arquitectura Física en 3 niveles

Llamada a métodos remotos (RMI). Curso 04/05. Tema 9. Departament d Informàtica. Universitat de València. 1. Introducción 2

Práctica 4: Java Remote Method Invocation (RMI)

El servicio de echo en Java-RMI

Práctica 2: Java Remote Method Invocation (RMI)

JAVA - Serializacíon / RMI. (C) Philippe Roose , 2005

Interacción entre Aplicaciones: objetos distribuidos e invocación remota

FSD Práctica Invocación Remota: JavaRMI. Estudio Previo. Información

Invocación de métodos remotos en Java: JAVA - RMI

Remote Method Invocation (RMI) Basado en: Fundamentals of RMI. Short Course. JGuru.

Java RMI. Sistemas distribuidos

Una introducción a Java RMI

RMI Remote Method Invocation

Práctica sobre compartición de instancias remotas.

'HVDUUROORGH$SOLFDFLRQHV FRQ-DYD50,

SISTEMAS DISTRIBUIDOS

TEMA 7: Paso de Mensajes con RMI

VII.1: RMI: Remote Method Invocation

MONITORES EN JAVA. Antonio Tomeu Control de la Concurrencia en Java: API Estándar

RMI. Aplicaciones Distribuidas

Ejercicio 4. EJB Sesión - Sistema SGA. Java EE. Ejercicio 4. EJB Sesión Sistema SGA. Curso de Java EE

PROGRAMACION DISTRIBUIDA

Examen parcial Convocatoria de junio de 2005 FUNDAMENTOS DE LA PROGRAMACIÓN

El servicio de echo con sockets

Cliente/Servidor en Java

Java RMI. las RPC de Java. Parte II. Luis Fernando Llana Díaz. Departamento de Sistemas Informáticos y ProgramaciónUniversidad Complutense de Madrid

class Nombre_Clase extends Nombre_SuperClase { cuerpo de la clase extendida }

Multitarea en Java. Rafa Caballero - UCM

CAPITULO 3 ARQUITECTURA DE COMPONENTES GIS EN INTERNET

Tema 3. Objetos distribuidos

1. Sistemas de colas de mensajes 2. Agentes móviles 3. Servicios de red 4. Espacios de objetos

Servicios web con SOAP y Eclipse

Solución Examen Junio 2007 (a) Ejercicio GeoTaxi (1h 20 min.) Diagrama de Casos de Uso y. Casos de uso (2,5 puntos) Modelo de Dominio (1,5 puntos)

Introducción a Java LSUB. 15 de enero de 2015 GSYC

PROGRAMACION DISTRIBUIDA

3.9 Patrón Distributed callback

HOJA DE EJERCICIOS 5 PROGRAMACIÓN CON EXCEPCIONES EN JAVA

TEMA 5: Control de la Concurrencia en Java (API Estándar)

Componentes Distribuidos EJBs. Ing. Cesar Julio Bustacara Medina

Ejecución de hebras. En realidad, todas las aplicaciones escritas en Java son aplicaciones multihebra (recuerde el recolector de basura).

RESUMEN DE CONCEPTOS BASICOS DE PROGRAMACION JAVA

SISTEMAS DISTRIBUIDOS

NIVEL 15: ESTRUCTURAS RECURSIVAS BINARIAS

Identificadores, palabras reservadas, tipos de datos, operadores aritméticos y el sistema estándar de salida en Java

Universidad ORT - Arquitectura de Software. Requisitos

Invocación remota de métodos. Jorge Iván Meza Martínez

Objetos Distribuidos

Threads. La plataforma JAVA soporta programas multhreading a través del lenguaje, de librerías y del sistema de ejecución. Dos.

Sistemas de colas de mensajes

SISTEMAS DISTRIBUIDOS Profesor: José Luis Montoya Restrepo

Sistemas de Información

Programación Concurrente en Java

Sockets en Java. Prof. Wílmer Pereira Universidad Simón Bolívar

Primer Parcial Septiembre 5 de 2009

PROGRAMACIÓN ORIENTADA A OBJETOS 10/02/2009. Examen de Java. Nombre: DNI: Titulación:

TutorJava recomienda...

PROGRAMACIÓN ORIENTADA A OBJETOS (L40629) Sabino Miranda-Jiménez

Examen de Prácticas de Programación Ingeniería Informática

Guías para la práctica (2): Acceso a Salesforce

1 HILOS (THREADS) EN JAVA

Práctica 5: Common Object Request Broker Architecture CORBA

UNIVERSIDAD CARLOS III DE MADRID DEPARTAMENTO DE INGENIERÍA TELEMÁTICA. Daniel Díaz Sánchez

Repaso de las características más importantes de la programación Java y su adaptación a Android

CORBA desde Java. Diego Sevilla Ruiz Sistemas Distribuidos. 1. Introducción

FUNDAMENTOS DE PROGRAMACIÓN. SEPTIEMBRE 2005

Transcripción:

PROGRAMACION DISTRIBUIDA Ejemplo de uso de estrategias de diseño con RMI Héctor Pérez 2 Ejemplo de callback: SwiftEagle shot() setdirection() Target nearnessreport(target,observer) signal? explode() SwiftEagle (Server) Is near Missile (remote) shot(initpos,password) getposition():position setdirection(direction) nearnessreport(target,observer) explode() turnoff() Observer (remote) ObserverTarget (Server) signal() MissileControler (Client)

3 Dos estrategias de que el Server transmita información al cliente Polling (Estrategia client/server estricta) Callback (Estrategia client/server no estricta) :MissileController :SwiftEagle :MissileController :SwiftEagle isintarget()->false getposition() getposition() Create and register in RMI :TargetObserver nearnessreport(position, observer); isintarget()->false getposition() asclosedtotarget=true observer.signal() isintarget()->true 4 Organización del código

5 Especificación de la aplicación distribuida SwiftEagle (1/3) 6 Especificación de la aplicación distribuida SwiftEagle (2/3) TargetObserver

7 Especificación de la aplicación distribuida SwiftEagle (3/3) TargetObserver 8 Organización del código en paquetes grant{ permission java.security.allpermission; grant{ permission java.security.allpermission; permission java.net.socketpermission "*:1024-","accept, resolve";

9 Tipos de datos comunes public class Direction implements Serializable{ private static final long serialversionuid = 333; public double ux=0; public double uy=0; public double uz=0; public Direction(double ux,double uy,double uz){ double mod=math.sqrt(math. pow(ux, 2)+ Math. pow(uy, 2)+ Math. pow(uz, 2)); if (mod!=0){this.ux=ux/mod;this.uy=uy/mod;this.uz=uz/mod; public class Position implements Serializable { private static final long serialversionuid = 444; public double x, y, z; public Position(double x,double y,double z){ t his.x=x; this.y=y; this.z=z; public class UnknownException extends Exception { private static final long serialversionuid = 1 1 1 ; public class UnreadyException extends Exception { private static final long serialversionuid = 222; 10 Interfaces remotas definidas import java.rmi.remote; import java.rmi.remoteexception; public interface Observer extends Remote { void signal() throws RemoteException; import java.rmi.*; public interface Missile extends Remote { void shot(position initpos, long password) throws UnreadyException, RemoteException; Position getposition() throws RemoteException; void setdirection(direction dir) throws RemoteException; void nearnessreport (Position pos, Observer observer) throws RemoteException; void explode(long password) throws UnknownException,RemoteException; void turnoff() throws RemoteException; Parámetros que se pasan por referencia remota

11 Cliente: Objeto remoto TargetObserver import java.rmi.remote; import java.rmi.remoteexception; public interface Observer extends Remote { void signal() throws RemoteException; import java.rmi.remoteexception; import java.rmi.server.unicastremoteobject; public class TargetObserver extends UnicastRemoteObject implements Observer { public TargetObserver() throws RemoteException { super(); public void signal() throws RemoteException { MissileController.asCloseToTarget = true; 12 Cliente: Clase principal MissileController public class MissileController { public static boolean asclosetotarget=false; public static void main(string[] args) { String missilename=args[0]; try { Observer observer=(observer) new TargetObserver(); // Nuestro objeto de callback long thepassword=(long)(long.max_value*math.random()); Registry registry = LocateRegistry.getRegistry(); Missile themissile = (Missile) registry.lookup(missilename); themissile.shot(new Position(0,0,0), thepassword); //*** Comienza el control del missil ***// themissile.setdirection(new Direction(1,1,10)); themissile.nearnessreport(new Position(0,0,1000), observer);//pasamos objeto de callback al server while(!asclosetotarget){ código necesario? Thread.sleep(500); Position pos=themissile.getposition(); System.out.println("current position: "+pos.x+" "+pos.y+" "+pos.z); try{ themissile.explode( thepassword); catch(unknownexception u) { System.out.println("Eres un intruso y no exploto"); themissile.turnoff(); try { UnicastRemoteObject.unexportObject(observer, false); catch (NoSuchObjectException e) {... catch (Exception e) { System.err.println("Excepción del cliente: " + e.tostring());

13 Servidor: Clase servidora SwiftEagle (1/3) public class SwiftEagle extends Thread implements Missile {. public void shot(position initpos, long password) throws UnreadyException {... public Position getposition() throws RemoteException {... public void setdirection(direction dir)throws RemoteException {... public void explode(long password)throws UnknownException, RemoteException{... public void turnoff() throws RemoteException{... Observer observer; public void nearnessreport(position target, Observer observer) throws RemoteException { this.target=target; this.observer=observer; Objeto de callback public void run(){ observer.signal();... 14 Servidor: Clase servidora SwiftEagle (2/3) public class SwiftEagle extends Thread implements Missile {... public void run() { while (!interrupted()) { try {sleep(update_period); catch (InterruptedException e){break; pos.x+=vel*dir.ux*update_period/1000.0; // Actualizamos pos.y y pos.z también... if (target!=null) { double currenttargetdist=math.sqrt(...); if (currenttargetdist>targetdist){ target=null; targetdist=double.max_value; callback try { observer.signal(); catch (RemoteException e) { else {targetdist=currenttargetdist; try {UnicastRemoteObject.unexportObject(this, false); catch (NoSuchObjectException e) { // Close run

15 Servidor: Clase servidora SwiftEagle (3/3) public class SwiftEagle extends Thread implements Missile { /. public static void main (String[] args) { String missilename= null; if (args.length >=1) missilename = args[0]; SwiftEagle eagle=new SwiftEagle(); try{ Remote rmtref= UnicastRemoteObject.exportObject(eagle,0); Registry theregistry=locateregistry.createregistry(1099); theregistry.rebind(args[0], rmtref); catch (RemoteException e) { System.err.println("Error en Servidor SwiftEagle " +args[0]); System.exit(-1); System.out.println("Servidor SwiftEagle " +args[0]+ " READY"); // Close main // Close SwftAegle 16 Ejecución Cliente Servidor SwitfEagle

17 SwiftEagle: Variaciones (1/2) Cómo minimizar los cambios en el código de negocio? 18 SwiftEagle: Uso del patrón proxy clase modificada clase nueva

19 Cliente: Nueva clase proxy SwiftEagle public class SwiftEagle { Registry registry = null; String missilename = Misil7831 ; Missile themissile = null; // Constructor del proxy public SwiftEagle(){ try { registry = LocateRegistry.getRegistry(); // Localiza el Registry en el puerto 1099 this.themissile = (Missile) registry.lookup(missilename); // Localiza el misil catch (RemoteException e) {... catch (NotBoundException e) {... Invocación remota public void setdirection(direction dir) { try { themissile.setdirection(dir); catch (RemoteException e) {... public Position getposition() throws RemoteException {...... 20 Cliente: Clase principal MissileController modificada public class MissileController { public static boolean asclosetotarget=false; public static void main(string[] args) { try { Observer observer=(observer) new TargetObserver(); // Nuestro objeto de callback long thepassword=(long)(long.max_value*math.random()); // *** Se genera el proxy ***// SwiftEagle themissile = new SwiftEagle (); Código nuevo themissile.shot(new Position(0,0,0), thepassword); //*** Comienza el control del missil ***// themissile.setdirection(new Direction(1,1,10)); themissile.nearnessreport(new Position(0,0,1000), observer);//pasamos objeto de callback al server while(!asclosetotarget){ Thread.sleep(500); Position pos=themissile.getposition(); System.out.println("current position: "+pos.x+" "+pos.y+" "+pos.z); try{ themissile.explode( thepassword); catch(unknownexception u) { System.out.println("Eres un intruso y no exploto"); themissile.turnoff(); try { UnicastRemoteObject.unexportObject(observer, false); catch (NoSuchObjectException e) {... catch (Exception e) { System.err.println("Excepción del cliente: " + e.tostring());

21 SwiftEagle: Variaciones (2/2) Cómo minimizar los cambios en el código de negocio? Cómo implementar la carga dinámica de clases? 22 SwiftEagle: Carga dinámica de clases (1/6) grant{ permission java.security.allpermission; grant{ permission java.security.allpermission; permission java.net.socketpermission "*:1024-","accept, resolve";

23 SwiftEagle: Carga dinámica de clases (2/6) public class SwiftEagle extends Thread implements Missile { /. public static void main (String[] args) { String missilename= null; if (args.length >=1) missilename = args[0]; SwiftEagle eagle=new SwiftEagle(); try{ Remote rmtref= UnicastRemoteObject.exportObject(eagle,0); Registry theregistry=locateregistry.getregistry(); theregistry.rebind(args[0], rmtref); catch (RemoteException e) { System.err.println("Error en Servidor SwiftEagle " +args[0]); System.exit(-1); System.out.println("Servidor SwiftEagle " +args[0]+ " READY"); // Close main // Close SwftAegle 24 SwiftEagle: Carga dinámica de clases (3/6)

25 SwiftEagle: Carga dinámica de clases (4/6) Dado que el registro no tiene acceso a las clases del proyecto, debemos indicarle dónde puede descargarlas (http, file, ftp, etc) 26 SwiftEagle: Carga dinámica de clases (5/6) Por defecto, el rmiregistry sólo permite cargar las clases que están en su CLASSPATH

27 SwiftEagle: Carga dinámica de clases (6/6) Para habilitar la carga dinámica de stubs, debemos modificar la propiedad UseCodebaseOnly del rmiregistry si es TRUE, la carga de clases sólo se realiza desde el CLASSPATH y desde el java.rmi.server.codebase de la JVM del rmiregistry