Download Enlace a presentación de la práctica III

Document related concepts
no text concepts found
Transcript
Práctica III: Java RMI con
Serialización y
Activation Framework
Persistencia
• Caso práctico: JINI
– Necesitamos que el servicio de impresión esté
siempre conectado de manera que, si existe
algún “crash” de la máquina, el servicio
arranque automáticamente.
– Por otra parte, el servicio de control de entrada
no tiene por qué estar arrancado todo el rato; se
espera que JINI lo pueda para y rearrancar “on
demand”.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
2
1.- Serialización en Java
Serialization
• Proceso de conversión de un conjunto de
instancias referenciadas entre sí a un flujo
lineal de bytes (byte stream) para que:
– puedan enviarse por un socket,
– puedan almacenarse en un fichero,
– puedan ser manipulados como un stream más.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
4
Opción 1: invocación remota
Servidor - Cliente
• Prestaciones
• Vulnerable a fallos parciales
Sistemas Distribuidos - Nebrija - Justo Hidalgo
5
Opción 2: envío de copias de la
instancia de C a S
• Los dos objetos son independientes entre sí.
• El mecanismo de copia ha de crear DEEP
COPIES.
• Si un objeto se envía dos veces en métodos
remotos diferentes, son dos copias distintas
(¡pensad en las DEEP COPIES!)
Sistemas Distribuidos - Nebrija - Justo Hidalgo
6
Usos de la Serialización
• Como mecanismo de persistencia:
– se utiliza el stream “FileOutputStream” para almacenar
objetos en ficheros.
• Como mecanismo de copia:
– se utiliza el ByteArrayOutputStream que se puede
almacenar en memoria para después crear duplicados.
• Como mecanismo de comunicación:
– capturar o enviar el stream mediante sockets.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
7
Cómo hacer que una clase sea
Serializable
• Ha de implementar la interfaz Serializable,
• Asegurarse de que el estado local es
serializado apropiadamente,
• Asegurarse de que el estado de la superclase
se serializa apropiadamente,
• Sobrecargar equals() y hashCode().
Sistemas Distribuidos - Nebrija - Justo Hidalgo
8
Implementar interfaz Serializable
• Obvio y fácil.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
9
Estado local serializado
correctamente (I)
• Los atributos de una clase serializable han
public
extendsoAbstractList
declass
ser ArrayList
o primitivos
serializables.
•
}
implements List, Cloneable, Serializable {
elementData[];
Si private
eso noObject
se cumple:
private int size;
– Campos
declarados como transient.
…
– Implementar métodos writeObject/readObject.
– Declaración de serialPersistentFields.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
10
Estado local serializado
correctamente (II): transient
• Vamos, ignorar la variable al serializar.
public
class
extends
• Útil
siArrayList
la variable
noAbstractList
afecta al estado del
implements List, Cloneable, Serializable {
objeto.
private transient Object elementData[];
private
size;
• Útil
si laintvariable
no es serializable, para
…
} evitar excepciones al serializar.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
11
Estado serializado (III):
[write|read]Object
• La variable no es serializable, pero
public classQUEREMOS
ArrayList extends AbstractList
SERIALIZARLA.
implements List, Cloneable, Serializable {
private transient Object elementData[];
• Implementamos
dos métodos:
private int size;
– private
void writeObject(java.io.ObjectOutputStream
out)
private
synchronized
void writeObject(java.io.ObjectOutputStream
stream)
throws java.io.IOException {
throws IOException
stream.defaultWriteObject();
– private
void readObject(java.io.ObjectInputStream in)
stream.writeInt(elementData.length);
throws
IOException, ClassNotFoundException
for(int i = 0; i < size; i++)
stream.writeObject(elementData[i]);
}
}
Sistemas Distribuidos - Nebrija - Justo Hidalgo
12
Estado serializado
(IV):serialPersistentFields
• Declaración explícita de qué variables
serializar, mediante un atributo static final:
Sistemas Distribuidos - Nebrija - Justo Hidalgo
13
Superclase serializada
adecuadamente
• Si la superclase es Serializable, OK.
• Si no, hay que almacenar su estado:
– serialPersistentFields
– writeObject/readObject.
• ¿Qué pasa si la superclase no la conozco en
detalle?
• Además, las clases no serializables, para poder
serlo, han de tener un constructor con cero
argumentos (¡¡!!)
REFACTORING
Sistemas Distribuidos - Nebrija - Justo Hidalgo
14
Sobrecarga de equals() y
hashCode()
•
Primero:
•
Después:
•
Y ahora... hashCode.
public class Money
extends ValueObject
– ByteArrayOutputStream
memoryOutputStream
= new
ByteArrayOutputStream(
);
private int _cents;
– ObjectOutputStream serializer = new
...
ObjectOutputStream(memoryOutputStream);
– serializer.writeObject(serializableObject);
}
– serializer.flush( );
{
– ByteArrayInputStream
memoryInputStream
new pero
• en este caso debería
de devolver= true,
ByteArrayInputStream(memoryOutputStream.toByteArray( ));
devuelve false
– ObjectInputStream deserializer = new
ObjectInputStream(memoryInputStream);
• igual ocurre con hashCode, pues dos
– Object deepCopyOfOriginalObject = deserializer.readObject(
instancias iguales deben devolver el mismo
);
– serializableObject.equals(deepCopyOfOriginalObject)
Sistemas Distribuidos - Nebrija - Justo Hidalgo
15
Ejemplo 1: clases
preserializables
• Envío de objetos mediante sockets
Sistemas Distribuidos - Nebrija - Justo Hidalgo
16
Ejemplo 2: utilización de
read/writeObject
• Se utiliza una matriz simétrica, por lo que
optimizamos espacio modificando los
métodos readObject y writeObject.
• No hay superclases.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
17
Ejemplo 3: superclase no
serializable
• La superclase necesita un constructor sin
argumentos.
• Los atributos de la superclase que no son
serializados han de ser accesibles desde la
superclase.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
18
Activation Framework
Activation Framework
• RMI Activation Framework.
• Es un servicio que se ocupa del ciclo de
vida de un objeto Java, que puede o no estar
en memoria principal
– Concepto CORBA: Objeto vs. Servant.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
20
AF: RMI Activation Daemon
(rmid)
• Es un proceso que asegura que los servicios
“activables” están disponibles cuando se
necesitan.
• Los servicios “activables” se comunican
con rmid para registrarse: devuelven una
referencia remota pero sin implementación
activa.
• Rmid puede arrancar los servicios en la
misma JVM o en una nueva.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
21
AF: RMI Activation Daemon
(rmid): arquitectura del proceso
• El servicio activable corre en un proceso
hijo de rmid.
• Si rmid cae, al tener un log, cuando sea
rearrancado arrancará los servicios que
tuviera activos.
– Por tanto, un servicio ha de desrregistrarse
explícitamente.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
22
AF: Creando un servicio
activable
• Interfaz Java: MyRemoteInterface
– public interface MyRemoteInterface extends java.rmi.Remote
– Como todos.
• Clase de implementación:
– public class ActivatableImplementation extends Activatable
implements examples.activation.MyRemoteInterface
– Ya no extiende UnicastRemoteObject.
– Añade un ActivationId y un MarshalledObject
(representación serializada del objeto) al
constructor.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
23
AF: Creando un servicio
activable
• Creación de la clase “setup”:
– Crea toda la información necesaria para la clase
activable, sin que sea necesario instanciar el
objeto remoto. Se lo pasa al rmid.
– Crea un grupo de activación.
– Crea una descripción de activación (clase,
dónde está e información serializada que pueda
necesitar -no ahora-.
– Registra en rmid y en rmiregistry.
Sistemas Distribuidos - Nebrija - Justo Hidalgo
24
AF: Compilación y ejecución
•
•
•
•
Compilar interfaces remotas, clases, etc.
Rmic
Arrancar rmiregistry.
Arrancar el activation daemon, rmid:
– rmid -J-Dsun.rmi.activation.execPolicy=none
• Setup:
– java -Djava.security.policy=<path>/policy Djava.rmi.server.codebase=file:///<path> examples.activation.Setup
• Cliente
– java -Djava.security.policy=<path>\policy examples.activation.Cliente
<server>
Sistemas Distribuidos - Nebrija - Justo Hidalgo
25
Bibliografía
• Serialización:
– http://www.oreilly.com/catalog/javarmi
• Activation Framework:
– http://java.sun.com/j2se/1.3/docs/guide/rmi/acti
vation
Sistemas Distribuidos - Nebrija - Justo Hidalgo
26