Java RMI João Gabriel (jggxm) RPC (Remote Procedure Call) Tecnologia (Protocolo) de comunicação entre processos Permite que um processo invoque um método de outro processo que esteja em seu espaço de endereçamento, mesmo que este esteja em outro host na rede Torna mais fácil a implementação de aplicações distribuídas, pois abstrai o código referente à parte de comunicação RMI (Remote Method Invocation) Permite a chamada de métodos em objetos que estão em outra máquina virtual (geralmente em outro host) com a mesma sintaxe da invocação local Implementação do RPC para Java É exclusivo para aplicações em Java. É tipicamente cliente-servidor. Conceitos Objeto Remoto: É um objeto que pode receber invocações remotas. Referência a objeto remoto: Para que um objeto possa invocar métodos de um objeto remoto, ele deve ter acesso à referência do mesmo. Conceitos (Continuação) Interface Remota: Todo objeto remoto possui uma interface que especifica quais dos métodos podem ser invocados remotamente. Exceções: Podem ocorrer por problemas decorrentes da distribuição ou na execução do método. Considerações As chamadas remotas têm um tempo de resposta maior do que as chamadas locais. As chamadas remotas são vulneráveis e possuem falhas complexas. mais mais Arquitetura Stub: É uma classe gerada pelo compilador rmic no lado do cliente e implementa a mesma interface remota do lado do servidor. Não implementa os métodos diretamente e sim traduz a invocação dos métodos para o servidor. Arquitetura(Continuação) Stub(Continuação): Inicia a conexão com a JVM remota. Serializa os parâmetros para a JVM remota (Marshaling). Desserializa os resultados ou exceções de retorno. Entrega ao cliente o resultado ou exceção. Arquitetura(Continuação) Skeleton: É gerado pelo compilador rmic e fica do lado do servidor. Implementa a interface remota. Desserializa(Unmarshaling) os parâmetros para o método remoto. Invoca o método no objeto remoto. Serializa o valor de retorno ou exceção e envia para o cliente. Arquitetura(Continuação) Arquitetura(Continuação) Seria impraticável se para cada invocação de método remoto fosse necessário incluir a máquina e a porta de destino. O RMI oferece um serviço de nomes (RMI Registry) que fornece informações sobre a localização de objetos remotos. Arquitetura(Continuação) Implementação Inicialmente defina a interface remota. Escreva o código do servidor que implementa a interface. Escreva o código do cliente. Execute o servidor Execute o(s) cliente(s). Exemplo Peguem o exemplo clicando no link http://www.cin.ufpe.br/~jggxm/infra-software/ Exercício Crie um programa que permite imprimir uma mensagem na tela de um computador remoto utilizando RMI Concorrência No nosso exemplo podemos perceber que caso dois clientes estejam acessando o mesmo objeto Produto, se um resolver alterar seu preço enquanto outro remove o mesmo poderá haver uma inconsistência. Como resolver? Concorrência(Continuação) Basta colocarmos o modificador synchronized em cada método da classe do objeto remoto onde pode haver a geração de inconsistência. Esse modificador faz com que um objeto que está sendo acessado só possa ser acessado novamente quando a tarefa que está sendo realizada sobre ele seja concluida. Vantagens do RMI Modelagem fácil e natural de sistemas distribuídos, abstraindo a parte de rede Sintaxe da chamada de método local é igual à sintaxe da chamada de método remoto Rápida difusão com a plataforma Java. Desvantagens do RMI Para cada máquina onde estão os objetos remotos deve haver um servidor de nomes para os mesmos serem registrados. Como RMI usa comunicação síncrona, o cliente não pode fazer outra tarefa enquanto espera a resposta do servidor. São necessárias configurações adicionais no firewall, causando restrições de acesso e desempenho. RMI x CORBA (Vantagens) RMI é similar a CORBA, porém mais simples pois não precisa lidar com diferentes linguagens de programação. Como tudo é implementado em Java, não necessita de IDL, pois as interfaces são definidas usando as próprias interfaces de Java. RMI x CORBA (Vantagens) RMI permite que objetos possam ser passados por valor facilmente. Com RMI objetos podem ser transferidos de servidores remotos para o cliente em tempo de execução de forma segura. RMI x CORBA (Desvantagens) RMI é limitado a Java. Muitas vezes é necessário implementar partes do sistema em C++ por questões de eficiência e a integração com Java não é simples. RMI x CORBA (Desvantagens) Desempenho de RMI é menor em alguns casos. A arquitetura de CORBA como um todo é mais abrangente. Referências http://www.ucb.br/prg/professores/fgoulart/gsi_r mi.pdf http://www.dimap.ufrn.br/~thais/SD20071/RPCRMI.pdf http://www.inf.pucrs.br/~celso/SistemasDistribui dos/JavaRMI/RMI.pdf https://dspace.ist.utl.pt/bitstream/2295/54860/1/0 4_-_RMI.pdf#search=%22invoke%20rmi%22 http://www.inf.ufsc.br/~mario/ine6502ch2.pdf