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
Descargar

Cap8-imp - Universidad de Chile