Download Cap8-imp - DCC - Universidad de Chile
Document related concepts
no text concepts found
Transcript
Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Java Spaces 1 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores JavaSpaces es parte de Jini (spec.). Jini es una colección de especificación de servicios Ayuda a que ellos se encuentren mutuamente en la red Máquinas provistas de Jini pueden encontrar servicios en la red a la cual se conectan y ofrecen los suyos Las máquinas son clientes y servidores a la vez 2 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Ejemplo ? 3 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Services provistos por Jini Lookup Services (reggie) rmid JavaSpace (outriggger) Fiddler Mercury Norm Transaction Services (mahalo.jar) HTTP-Server (tools.jar) 4 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores ¿ Qué provee Jini concretamente ? Un espacio en el cual se pueden guardar objetos, recuperar o sacar una coipa de ellos. Métodos : write, read, take, (readIfExists, takeIfExists) Un mecanismo para proveer completitud de transacciones Un mecanismo para notificación de eventos 5 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Los métodos write y read write Space read A copy 6 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores El método take write Space X take Existe solo aquí 7 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Cómo crear un JavaSpace en una máquina Un JavaSpace puede crearse levantando el servicio outrigger de Jini con un nombre como parámetro. Este será el nombre del espacio. Pero antes de poder levantar el outrigger hay que levantar: El servidor http que viene en tools.jar Un rmid El servidor de lookup rigger El servidor de transacciones mahalo 8 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Comandos java -jar c:\jini_1\tools.jar –dir C:\jini1_1 rmid -J-Dsun.rmi.activation.execPolicy=none. java -Djava.security.policy=policy.txt -jar C:\jini1_1\reggie.jar http://froebel:8080/reggie-dl.jar policy.txt reggie_log public java -Djava.security.policy=policy.txt -jar $JINI/mahalo.jar http://froebel:8080/mahalodl.jar policy.txt txn_log public java -Djava.security.policy=policy.txt Djava.rmi.server.codebase=http://froebel:8080 /outrigger-dl.jar Dcom.sun.jini.outrigger.spaceName=JavaSpaces -jar C:\jini1_1\transient-outrigger.jar public 9 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Como escribir objetos en el espacio Las clases definidas por el usuario deben declarar que implementan la interfaz Entry. Esto es solo una marca para decirle a Java que un objeto de esta clase puede ser escrito en un JavaSpace Los campos (variables) en esta clase deben ser objetos. Si se necesitan primitivas (como nímeros enteros) deben usarse wrappers Integer i = new Integer(4) 10 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Ejemplo de una clase import net.jini.core.entry.Entry; public class Message implements Entry { public String content; public Integer counter; public Message() { //this is mandatory !!!!! } public Message(String content, int initVal) { this.content = content; counter = new Integer(initVal); } public String toString() { return content + counter + " times."; } public void increment() { counter = new Integer(counter.intValue() + 1); } } 11 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Guardando objetos en un espacio import net.jini.core.lease.Lease; import net.jini.space.JavaSpace; import java.io.*; public class WriteMessages { public static void main(String[] args) { try { BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); JavaSpace space = SpaceAccessor.getSpace(); System.out.print("Message ? "); String m = in.readLine(); Message2 msg = new Message2(m,0); space.write(msg, null, Lease.FOREVER); } catch (Exception e) {e.printStackTrace(); } } } 12 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Recuperando objetos import java.io.*; import net.jini.core.lease.Lease; import net.jini.space.JavaSpace; public class ReadMessage { public static void main(String[] args) { try { Message2 template; JavaSpace space = SpaceAccessor.getSpace(); BufferedReader in = new BufferedReader( new InputStreamReader(System.in)); System.out.print("Message (**=null)? "); String m = in.readLine(); template = new Message2(m); Message2 result = (Message2)space.read(template,null,Long.MAX_VALUE); System.out.println("Got "+result.toString()); } catch (Exception e) {e.printStackTrace(); } } 13 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Reglas para recuperar objetos EL objeto debe coincidir con la estructura y contenidos del template Referencias a null actúan como comodines No hay reglas para decidir qué objeto será recuperado si hay más de uno que coincide Los parámetros: un objeto template, una transacción (por ahora null) y un timeout por si no se encuantra un objeto que coincida con el dado. Long.MAX_VALUE hace que se espere para siemre 14 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Tomando objetos Funciona igual que el read pero borra el objeto que se lee del espacio Para evitar deadlocks o esperas demasiado largas existe readIfExists y takeIfExists Su estructura es la misma que read y write pero retornarán de inmediato si no existe el objeto buscado La clase SpaceAccessor con el método getSpace no es standard, la usamos para simplificar el código y la explicación en este curso 15 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Un arreglo “distribuido” WriteElements index index content content index content ReadElements UpdateElements 16 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Sincronizando clientes Customer(.java) - Toma un número, - incrementa el Ticket Disp. Ticket Dispenser - Toma el objeto de servicio - espera para ser servido number - incrementa el número de servicio Service Number Un cliente será servido sólo number si tiene el objeto de número de servicio Al principio el prog. TicketInit crea y pone en el espacio los dos objetos 17 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores El Chatting Un objeto tail in indica cuál es el número del último mensaje para ese Channel Cada Message tiene un contenido y un número correlativo El canal identifica el „chatthread“ Channel Tail number Message number Channel Message number Channel Message number Channel 18 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Archivos: Tail: implementa la clase del objeto que marca el número del último mensaje para un canal de chat MessageChat: contiene un mensaje CreateChannel: crea un “canal” de chat nuevo (con un nombre y tail en 0) ChatSpace: programa que permite usar el espacio para el chat (ChatClient), inicia 2 threads (leer y escribir) ChannelChatRead: lee mensajes del espacio para un channel determinado ChannelChatWrite: escribe mensajes en el 19 espacio para un channel determinado Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Eventos Distribuidos 4- El oidor es notificado 1- Crear un objeto Listener 3- Un objeto que coincide el template entra en el espacio 2- Notificar al servidor sobre el interés en recibir los eventos 20 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores import import import import Cómo escribir un Listener java.rmi.server.*; java.rmi.RemoteException; net.jini.core.event.*; net.jini.space.JavaSpace; public class Listener implements RemoteEventListener { private JavaSpace space; public Listener(JavaSpace space) throws RemoteException { this.space = space; UnicastRemoteObject.exportObject(this); } public void notify(RemoteEvent ev) { Message template = new Message(); try { Message result = (Message)space.read(template, null, Long.MAX_VALUE); System.out.println(result.content); } catch (Exception e) { e.printStackTrace(); } } } 21 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Un programa que escucha import net.jini.core.lease.Lease; import net.jini.space.JavaSpace; public class HelloWorldNotify { public static void main(String[] args) { JavaSpace space = SpaceAccessor.getSpace(); try { Listener listener = new Listener(space); Message template = new Message(); space.notify(template, null, listener, Lease.FOREVER, null); } catch (Exception e) { e.printStackTrace(); } } } 22 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Llamando al método notify Después de esto, cuando cualquier programa que escriba un mensaje en el espacio (no importa el contenido) el objeto Listener del programa HelloWorldNotify será „notificado“, esto es, el método notify será llamado Message msg = new Message(); msg.content = "Hello World"; space.write(msg, null, Lease.FOREVER); 23 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Transacciones Es un conjunto de operaciones que deben realizarse atómicamente, o sea, todas o ninguna. En JavaSpaces se puede definir un conjunto de operaciones write, read, y take que deban ser realizadas de esta manera. Para esto, un objeto transaction debe ser creado y pasado como parámetro con cualquier operación que deba pertenecer a la transacción Una vez que todas las opreaciones write, read, take, con la misma transacción han sido “ejecutadas” una operación commit va a ejecutar todas o nunguna. En el ultimo caso se lanza una exception 24 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1 Módulo 9: Desarrollo de Aplicaciones en Redes de Computadores Ejemplo JavaSpace space = SpaceAccessor.getSpace(); TransactionManager mgr = TransactionManagerAccessor.getManager(); //get a reference to the transaction manager service Try { Transaction.Created trc = TransactionFactory.create(mgr, 3000); Transaction txn = trc.transaction; SharedVar template = new SharedVar(url); SharedVar counter = (SharedVar) space.take(template, txn, Long.MAX_VALUE); counter.increment(); space.write(counter, txn, Lease.FOREVER); txn.commit(); } catch (Exception e) { System.err.println("Transaction failed"); return; } 25 Universidad de Chile - Tupper 2007, Santiago - Fono: 678 4888 - Fax: 698 8427 - Email: victoria.gaete @die.uchile.cl 2000/1