Notas de Aula - MAC 5759 - Sistemas de Objetos Distribuídos
Aula 11 - 15/4/2001
Registry RMI
- É o servidor de nomes padrão na plataforma Java e Java
RMI.
- Grande limitações
- implementação default não permite que objetos
remotos se registem junto a um servidor registry
- exige que o hostname do registry seja dado explicitamente.
- não dá suporte para nomes hierárquicos, o espaço
de nomes é achatado (flat).
- O pacote java.rmi.registry contém a definição
de uma interface e de uma classe:
- public final class LocateRegistry usada para obter uma referência
para um registry dada a sua localização física e para
criar um registry na JVM local.
- public interface Registry
- void bind(String name, Remote obj) throws RemoteException,
AlreadyBoundException,
AccessException;
Binds a remote
reference to the specified name in this registry
String[] list ();
Returns an array
of the names bound in this registry
Remote lookup (String name) throws RemoteException,
NotBoundException,
AccessException;
Returns the remote
reference bound to the specified name in this registry
void rebind(String name, Remote obj);
Replaces the
binding for the specified name in this registry with the supplied remote
reference
void unbind(String name);
Removes the binding
for the specified name in this registry
- public final class java.rmi.Naming é como o java.rmi.registry
.Registry mas exige que os nomes sejam da forma:
Gerenciadores de Segurança
- java.lang.SecurityManager é a super-classe de java.rmi.RMISecurityManager
- É uma classe que permite aos programadores definir uma política
de segurança (security policy)
- getSecurityManager e setSecurityManager
- Exemplo de uso dentro do código escrito pelo programador da
aplicação:
- SecurityManager security = System.getSecurityManager();
if (security != null) {
security.checkXXX(argument,
. . . );
}
- categorias de permissões: File, Socket, Net, Security, Runtime,
Property, AWT, Reflect, and Serializable
- as classes gerenciando essas categorias são: java.io.FilePermission,
java.net.SocketPermission, java.net.NetPermission, etc.
- Exemplos:
- checkAccept(String host, int port)
Throws a SecurityException
if the calling thread is not permitted to accept a socket connection from
the specified host and port number.
- checkConnect(String host, int port)
Throws a SecurityException
if the calling thread is not allowed to open a socket connection to the specified
host and port number.
- checkCreateClassLoader()
Throws a SecurityException
if the calling thread is not allowed to create a new class loader.
- checkDelete(String file)
Throws a SecurityException
if the calling thread is not allowed to delete the specified file.
- checkExec(String cmd)
Throws a SecurityException
if the calling thread is not allowed to create a subprocess.
- checkMulticast(InetAddress maddr)
Throws a SecurityException
if the calling thread is not allowed to use (join/leave/send/receive) IP
multicast.
- Um método genérico que é chamado em algumas dos
métodos acima e que pode ser usado de várias formas diferentes
por aplicações que queiram definir novos tipos de permissão:
- checkPermission(Permission perm)
Throws a SecurityException if the requested access, specified by the given
permission, is not permitted based on the security policy currently in effect.
- Permission é um tipo que encapsula uma permissão. O
construtor recebe um string com o nome da permissão.
- Para usar RMI é obrigatório definir um SecurityManager.
O java.rmi.RMISecurityManager redefine uma série de métodos
do SecurityManager default para limitar o que o código carregado de
fora pode fazer.
Seriação de Objetos (Object Serialization)
- Para mover objetos de uma JVM para outra é necessário
- seriar o estado do objeto na máquina origem e enviar o estado
para a máquina destino
- carregar o bytecode da classe do objeto na máquina destino
- reiniciar o objeto na máquina destino de-seriando o estado
na nova instância do objeto
- A classes que desejam que suas instâncias possam ser movidas
de um lugar para outro precisam implementar a interface java.io.Serializable
.
- A interface não possui métodos nem campos, ela serve
apenas para indicar semântica.
- Todas as subclasses de uma classe seriável passam a ser seriáveis.
- Em Java, o estado seriado é apenas o valor dos campos dos objetos
(que podem ser outros objetos).
- O estado não inlclui a pilha de chamadas de métodos.
Assim, Java serve para implementar migração fraca.
- Outros ambientes/linguagens como Emerald, permite migração
forte de objetos, copiando o estado da pilha.
- No momento da de-seriação, o estado dos objetos são
restaurados automaticamente pela JVM quando da chamada dos construtores sem
argumentos.
- Classes que querem ter um tratamento especializado da seriação
e de-seriação podem implementar os métodos seguinte.
- private void writeObject(java.io.ObjectOutputStream out)
throws IOException;
private void readObject(java.io.ObjectInputStream in)
throws IOException, ClassNotFoundException;
- Um exemplo de uso do ObjectOutputStream:
- FileOutputStream ostream = new FileOutputStream("t.tmp");
ObjectOutputStream p = new ObjectOutputStream(ostream);
p.writeInt(12345);
p.writeObject("Today");
p.writeObject(new Date());
p.flush();
ostream.close();
Ativação automática de objetos RMI
- Até Java 1.2, a única forma de ter um objeto RMI era
criá-lo e deixá-lo executando prá sempre.
- Java 1.3 introduziu a ativação automática de objetos
RMI
- um novo executável: rmid; é um daemon responsável
por ativar objetos
- objetos ativáveis tem que herdar de java.rmi.activation.Activatable
- é necessário criar também uma classe de Setup
que registra o objeto com o registry e com o rmid
- o cliente simplesmente obtém uma referência para o objeto
através do registry e o chama
- o rmid se encarrega de ativar o objeto após carregar o bytecode
Próxima Aula
Aula Anterior
Página de MAC 5759
Página do Fabio
Página do DCC