Invocação Remota MC704
Aplicações distribuídas Aplicação distribuída: conjunto de processos que cooperam entre si para prover um serviço ou realizar uma computação normalmente processos precisam invocar operações em processos remotos para realizar o serviço/computação
Modelos de programação RPC - Chamada de procedimento remoto Extensão de chamada de procedimento local RMI - Invocação de método remoto Extensão de invocação de método local Programação baseada em eventos
Middleware Software que fornece uma abstração de mais alto nível que os serviços básicos do sistema operacional ou de rede Isola aplicação de detalhes como protocolos de comunicação, sistema operacional, hardware; às vezes, isola até de linguagem de programação.
Interface Aplicação é dividida em módulos que se comunicam. A interface de um módulo define os meios de acesso ao módulo Enquanto interface não muda, acesso pode ser feito da mesma maneira, mesmo que a implementação do módulo mude IDLs - linguagens de definição de interfaces
Comunicação entre objetos distribuídos O modelo: Conjunto de objetos interagindo Referências a objetos Exceções Coleta de lixo
RMI - projeto Semântica da invocação Talvez Falhas não são consideradas Pelo menos uma vez Reenvio de req, sem filtro de duplicata, servidor reexecuta serviço No máximo uma vez Reenvio de req, filtro de duplicata, servidor retransmite resposta
RMI - implementação Proxy - criado para cada objeto remoto referenciado Implementa transparência Local para o invocador, oculta detalhes da comunicação remota Despachante - um para cada classe que implementa um objeto remoto no servidor Recebe mensagem de requisição e seleciona o método apropriado no Esqueleto
RMI - implementação Esqueleto - implementa os métodos da interface remota Desempacota requisição, chama método local, espera completar, envia resposta. Proxy, Despachante e Esqueleto são gerados pelo compilador RMI java a partir de um objeto remoto
RMIRegistry Uma instância para cada computador servidor que tenha objetos remotos Argumento na forma //nomecomputador:porta/nomeobjeto void rebind (String name, Remote obj) Usado para servidor registrar (vincular) objeto pelo nome. void bind (String name, Remote obj) Mesmo que acima. Se nome já está sendo usado, levanta exceção. void unbind (String name, Remote obj) Remove vínculo. Remote lookup(string name) Usado por clientes para procurar objeto pelo nome. Uma referência remota é retornada. String [] list() Retorna um array de strings com os nomes registrados.
Interfaces remotas package examples.rmishape; import java.rmi.*; import java.util.vector; public interface Shape extends Remote { int getversion() throws RemoteException; GraphicalObject getallstate() throws RemoteException; package examples.rmishape; import java.rmi.*; import java.util.vector; public interface ShapeList extends Remote { Shape newshape(graphicalobject g) throws RemoteException; Vector allshapes()throws RemoteException; int getversion() throws RemoteException;
Classe ShapeListServer package examples.rmishape; import java.rmi.*; //import java.rmi.server.unicastremoteobject; public class ShapeListServer { public static void main(string args[]){ System.setSecurityManager(new RMISecurityManager()); System.out.println("Main OK"); try { ShapeList ashapelist = new ShapeListServant(); System.out.println("After create"); Naming.rebind("ShapeList", ashapelist); System.out.println("ShapeList server ready"); catch(exception e) { System.out.println("ShapeList server main " + e.getmessage());
Classe ShapeListServant package examples.rmishape; import java.rmi.*; import java.rmi.server.unicastremoteobject; import java.util.vector; public class ShapeListServant extends UnicastRemoteObject implements ShapeList{ private Vector thelist; private int version; public ShapeListServant()throws RemoteException{ thelist = new Vector(); version = 0; public Shape newshape(graphicalobject g) throws RemoteException{ version++; Shape s = new ShapeServant( g, version); thelist.addelement(s); return s; public Vector allshapes()throws RemoteException{ return thelist; public int getversion() throws RemoteException{ return version;
Cliente para ShapeList package examples.rmishape; import java.rmi.*; import java.rmi.server.*; import java.util.vector; import java.awt.rectangle; import java.awt.color; public class ShapeListClient{ public static void main(string args[]) { String option = "Read"; String shapetype = "Rectangle"; if(args.length > 0) option = args[0]; // read or write if(args.length > 1) shapetype = args[1]; // specify Circle, Line etc System.out.println("option = " + option + "shape = " + shapetype); if(system.getsecuritymanager() == null) { System.setSecurityManager(new RMISecurityManager()); else System.out.println("Already has a security manager, so cant set RMI SM"); ShapeList ashapelist = null; try { ashapelist = (ShapeList) Naming.lookup("//Jean.torriano.net/ShapeList"); System.out.println("Found server"); Vector slist = ashapelist.allshapes(); System.out.println("Got vector"); if(option.equals("read")){ for(int i=0; i<slist.size(); i++){ GraphicalObject g = ((Shape)sList.elementAt(i)).getAllState(); g.print(); else { GraphicalObject g = new GraphicalObject(shapeType, new Rectangle(50,50,300,400), Color.red,Color.blue, false); System.out.println("Created graphical object"); ashapelist.newshape(g); System.out.println("Stored shape"); catch(remoteexception e) { System.out.println("allShapes: " + e.getmessage()); catch(exception e) {System.out.println("Lookup: " + e.getmessage());
Tutorial http://java.sun.com/docs/books/tutorial/rmi/