Java/RMI: diferenças entre revisões

[edição não verificada][edição não verificada]
Conteúdo apagado Conteúdo adicionado
Conteúdo retirado do [http://knol.google.com/k/andr%C3%A9-luiz-alves-moraes/java-rmi/n6m12v5sl0jh/1# Knol]; Autor: André Luiz Alves Moraes; Licença original: Creative Commons Attribution 3.0
 
Sem resumo de edição
Linha 1:
1- ==Introdução==
 
A tecnologia '''Java RMI''' (Remote Method Invocation) consiste em uma biblioteca capaz de permitir que um programa rodando em uma dada máquina efetue chamadas à objetos instanciados em outra máquina.
Apesar de ser desenvolvida focando principalmente a chamada de procedimentos à objetos localizados em máquinas distintas ela também pode ser utilizada para efetuar a comunicação entre dois processos rodando na mesma máquina (desde que ambos utilizem a JVM), muito embora tecnologias como XPCOM e outras possam disponibilizar perforanceperformance e integração melhores.
 
2- ==Tenologias semelhantes==
 
2- Tenologias semelhantes
Existem duas outras tecnologias que se assemelham muito com a RMI: CORBA e .NET Remoting (que no .NET 3.0 foi incorporada pela WCF).
A tecnologia .NET Remoting é pode ser vista como a resposta Microsoft à tecnologia RMI, e possui quase as mesmas características.
Já a tecnologia CORBA é divulgada à mais tempo e possui a vantagem de possuir bibliotecas em diversas linguagens, assim um objeto corbaCORBA pode ser utilizado em vários programas escritos em linguagens diferentes (a tecnologia RMI foi feita exclusivamente para a plataforma Java).
 
3- ==Um exemplo rápido==
 
3- Um exemplo rápido
Para demonstrar a facilidade da linguagem, vou criar um exemplo bem simples que irá utilizar a tecnologia RMI.
Um pequeno aplicativo para postar mensagens em um fórum e listar as mesmas.
 
Primeiro devemos criar uma interface que será utilizada para exibir aos usuários dos serviço as operações.
 
<source lang=java>
package rmiknolexample;
 
Linha 29 ⟶ 33:
public String[] readPosts(int beginAt) throws RemoteException;
}
</source>
 
 
Depois devemos criar uma classe que irá implementar a interface e disponibilizar a funcionalidade.
 
<source lang=java>
package rmiknolexample;
 
Linha 70 ⟶ 75:
return copy;
}
</source>
 
Feito isso vamos implementar a classe que irá disponibilizar o serviço ao usuário.
 
<source lang=java>
Feito isso vamos implementar a classe que irá disponibilizar o serviço ao usuário
 
package rmiknolexample;
 
Linha 100 ⟶ 106:
}
}
</source>
 
 
Na classe acima observe a linha:
 
<source lang=java>
Naming.rebind("forumService", forumObj);
</source>
 
Ela é responsável por associar um nome ao seu objeto. É através deste nome que os computadores e processos remotos irão encontrar e utilizar o seu objeto. Este nome é único para um dado host, ou seja, mesmo se duas aplicações criarem objetos distintos (até mesmo de classes distintas) o mesmo nome não poderá ser utilizado.
 
Por último vamos implementar a classe que irá utilizar o serviço disponibilizado.
 
<source lang=java>
package rmiknolexample;
 
Linha 147 ⟶ 156:
}
}
</source>
 
 
A linha:
 
<source lang=java>
IForum forumObj = (IForum)Naming.lookup("rmi://localhost/forumService");
</source>
 
Efetua uma consulta no host informado (neste caso o localhost) e solicita o objeto associado ao nome: forumService.
Linha 157 ⟶ 168:
O resto do código fala por si só, e graças ao RMI as chamadas são idênticas á chamadas locais. Melhorando um pouco o design da aplicação é possível criar um objeto local ou então um remoto dependendo da ocasião.
 
Para facilitar o teste, a classe abaixo foi criada apenas para permitir rodar o serviço através da linha de comando: "java -jar arquivoJar.jar "
 
<source lang=java>
package rmiknolexample;
 
Linha 179 ⟶ 191:
}
}
</source>
 
pronto!
Linha 187 ⟶ 200:
Observação importante: neste caso o teste é apenas local mas quando utiliza-se um ambiente com diversas máquinas é muito importante iniciar a aplicação servidor com a opção: -Djava.rmi.server.hostname=<nome_ou_ip_do_host>. Caso não seja feito o objeto pode ser exportado com o host errado e a aplicação cliente pode tentar disparar o procedimento em um endereço diferente do solicitado.
 
Existem diversas outras características da tecnologia RMI que não foram abordadas, como por exemplo a capacidade de baixar o código de uma determinada classe de modo transparente. Assim mesmo que o contexto local não reconheça uma classe esta será trasnferidatransferida do servidor e poderá ser utilizada pela aplicação.
 
==Referências==
 
*[http://java.sun.com/javase/technologies/core/basic/rmi/index.jsp Informações sobre RMI - Sun]
Para mais informações sobre a tecnologia rmi, viste: Remote Method Invocation Home[1]