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