Implementação de um Sistema de Objetos Remoto baseado em Java RMI Ricardo Couto Antunes da Rocha INF/UFG
Declaração da Interface do Objeto Remoto Declaração de uma interface Java, com os métodos que são exportados pelo objeto remoto Interface deve estender a interface Remote Todos os métodos devem declarar que podem lançar a exceção RemoteException O método recebe como como parâmetro ou ou retorna algum algum objeto objeto de de classe definida pelo pelo programador? Se Se sim, sim, então então o programador deve deve refletir as as seguintes questões: 1. 1. Se Se deve deve ser ser transmitida uma uma cópia cópia do do objeto (passagem por por valor), então então o objeto objeto deve deve ser ser serializável (classe implementar a interface Serializable) 2.Se 2.Se deve deve ser ser transmitida uma uma referência para para o objeto objeto (passagem por por referência), então então o método deve deve aceitar/retorna uma uma interface remota e não não um um objeto. Observe que que quem quem transmite o objeto objeto deve deve fazê-lo adequadamente.
Implementação da Classe Servente e seus Métodos (1) A classe que implementa um objeto remoto, chamado objeto Servente, precisa implementar a interface remota criada anteriormente. A classe precisa estender a classe UnicastRemoteObject. Assim, a implementação herdada pela classe pai contém o código necessário para tornar o objeto ativo no middleware Java RMI. Na verdade, isso não é estritamente necessário. Caso a classe não herde de UnicastRemoteObject, o código do servidor deverá exportar o objeto no Java RMI, invocando o método UnicastRemoteObject.exportObject(...) Como a superclasse possui alguns construtores, a sua classe necessariamente deverá criar um construtor que invoca um dos construtores da classe UnicastRemoteObject
Implementação da Classe Servente e seus Métodos (2) É necessário implementar os métodos da classe servente. A priori, os métodos são implementados como qualquer método de classe, deixando totalmente transparente para o programador o fato do objeto ser remoto. O programador não deve lançar a exceção RemoteException. Ela será lançada pelo serviço de RMI, quando necessário. A exceção ocorre quando o método precisar retornar um objeto remoto. Neste caso, dependendo da implementação, o objeto precisará ser registrado no sistema de RMI. Não é necessário registrar o objeto no rmiregistry, pois a referência remota do objeto retornado será entregue diretamente de um objeto remoto invocado para o cliente.
Colocação do Serviço no Ar Para colocar o serviço no ar é necessário criar o objeto remoto propriamente dito Caso a classe estenda de UnicastRemoteObject, então o objeto já estará automaticamente ativo no serviço de RMI. Do contrário, deverá ser ativado explicitamente no serviço usando a chamada mencionada anteriormente. Por fim, o objeto precisa ser registrado no serviço rmiregistry, por meio de uma chamada bind.
Implementação da Classe Servente e seus Métodos (1) A classe que implementa um objeto remoto, chamado objeto Servente, precisa implementar a interface remota criada anteriormente. A classe precisa estender a classe UnicastRemoteObject. Assim, a implementação herdada pela classe pai contém o código necessário para tornar o objeto ativo no middleware Java RMI. Na verdade, isso não é estritamente necessário. Caso a classe não herde de UnicastRemoteObject, o código do servidor deverá exportar o objeto no Java RMI, invocando o método UnicastRemoteObject.exportObject(...) Como a superclasse possui alguns construtores, a sua classe necessariamente deverá criar um construtor que invoca um dos construtores da classe UnicastRemoteObject
Registro do Objeto Remoto no Registry Uma das informações mantidas na referência remota do objeto é o endereço IP da estação onde o objeto está. O endereço default utilizado pelo Java é o endereço localhost: 127.0.0.1. Este endereço não pode ser utilizado caso seja necessário o acesso de outras estações ao objeto remoto. Neste caso, é necessário atribuir à variável de ambiente da JVM java.rmi.server.hostname o endereço IP da estação.
Configuração do Codebase do Servidor (1) No código servidor ainda é necessário configurar o codebase do seu objeto remoto O codebase é uma URL na qual os clientes e o rmiregistry carregarão dinamicamente as classes do servidor à medida em que elas forem necessárias Para fazê-lo, basta configurar a variável de ambiente Java java.rmi.server.codebase para a respectiva URL Exemplo: http://192.168.7.14/meuservidor Então, é necessário iniciar o servidor codebase.
Configuração do Codebase do Servidor (2) Para a URL de exemplo http://192.168.7.14/meuservidor, precisaremos de um servidor de codebase que atenda aos seguinte requisitos Seja um servidor HTTP Esteja na máquina 192.168.7.14, que por sua vez deve ser a estação onde está o seu objeto remoto Todas as classes do seu servidor devem ser baixadas a partir da concatenação do seu caminho completo com a URL Neste caso, o seu servidor web deve estar de tal forma configurado, que a classe br.ufg.sd.aluno deve estar disponível na URL http://192.168.7.14/meuservidor/br/ufg/sd/aluno.class
Inicialização do Serviço RMIRegistry Se a configuração do servidor de codebase foi feita corretamente, então iniciar o serviço é trivial Digite rmiregistry na linha de comando Qualquer problema que ocorrer será causado por uma das seguintes causas Configuração incorreta do codebase Uso incorreto do bind/rebind ou uso de IP incorreto da estação com rmiregistry Bloqueio no acesso ao rmiregistry pelo firewall O diretório do rmiregistry (mesmo de todos os programas que vem com a instalação do Java) não está no PATH do seu SO.
Distribuição de Código para os Clientes Para desenvolver qualquer cliente para acessar o objeto remoto, você precisará incluir no CLASSPATH do programa os seguintes arquivos Java 1.A interface remota 2.Todas as classes (criadas por você) referenciadas na interface remota Você pode criar um.jar com essas classes e incluir no CLASSPATH do projeto que será criado.
Implementação do Cliente Se todos os passos anteriores forem realizados corretamente, iniciar um cliente é bem simples 1. Declare um objeto que referenciará a interface remota declarada 2. Obtenha uma referência para o serviço rmiregistry onde o objeto remoto foi registrado 3. Obtenha uma referência para o objeto remoto invocando o lookup do RMI Registry, passando como parâmetro o nome utilizado no registro do objeto. É possível que um cliente funcione ainda que você cometa erros na definição do codebase e no registro remoto, caso o seu cliente e servidor estejam na mesma estação e/ou no mesmo projeto Java ou CLASSPATH. Neste caso, para saber se tudo está correto, o ideal é criar um cliente em um projeto Java separado e preferencialmente em uma máquina diferente.