Você está na página 1de 15

Invocao Remota

MC704

Aplicaes distribudas
Aplicao distribuda: conjunto de processos que cooperam entre si para prover um servio ou realizar uma computao
normalmente processos precisam invocar operaes em processos remotos para realizar o servio/computao

Modelos de programao
RPC - Chamada de procedimento remoto
Extenso de chamada de procedimento local

RMI - Invocao de mtodo remoto


Extenso de invocao de mtodo local

Programao baseada em eventos

Middleware
Software que fornece uma abstrao de mais alto nvel que os servios bsicos do sistema operacional ou de rede
Isola aplicao de detalhes como protocolos de comunicao, sistema operacional, hardware; s vezes, isola at de linguagem de programao.

Interface
Aplicao dividida em mdulos que se comunicam.
A interface de um mdulo define os meios de acesso ao mdulo Enquanto interface no muda, acesso pode ser feito da mesma maneira, mesmo que a implementao do mdulo mude IDLs - linguagens de definio de interfaces

Comunicao entre objetos distribudos


O modelo: Conjunto de objetos interagindo
Referncias a objetos Excees Coleta de lixo

RMI - projeto
Semntica da invocao
Talvez
Falhas no so consideradas

Pelo menos uma vez


Reenvio de req, sem filtro de duplicata, servidor reexecuta servio

No mximo uma vez


Reenvio de req, filtro de duplicata, servidor retransmite resposta

RMI - implementao
Proxy - criado para cada objeto remoto referenciado
Implementa transparncia
Local para o invocador, oculta detalhes da comunicao remota

Despachante - um para cada classe que implementa um objeto remoto no servidor


Recebe mensagem de requisio e seleciona o mtodo apropriado no Esqueleto

RMI - implementao
Esqueleto - implementa os mtodos da interface remota
Desempacota requisio, chama mtodo local, espera completar, envia resposta.

Proxy, Despachante e Esqueleto so gerados pelo compilador RMI java a partir de um objeto remoto

RMIRegistry
Uma instncia 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 exceo. void unbind (String name, Remote obj) Remove vnculo. Remote lookup(String name) Usado por clientes para procurar objeto pelo nome. Uma referncia 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/

Você também pode gostar