RMI - Remote Method Invocation

Slides:



Advertisements
Apresentações semelhantes
Projeto e Implementação de Middleware
Advertisements

Sistemas Operacionais II N Aula prática Java Sockets, RPC e RMI Eduardo Bezerra.
Java Remote Method Invocation Java RMI
Sistemas Distribuídos Resolvendo o Problema da Heterogeneidade
Sistemas distribuídos
Marco A. S. Reis EJB Acesso Remoto Marco A. S. Reis
Comunicação entre processos distribuídos
Programa de Pós-Graduação Lato Sensu MBA em Gestão de Software
Exemplo dos Internamentos
RMI-IIOP.
Orientação a Objetos: Encapsulamento e Classificação
CORBA Um Padrão Industrial para Objetos Distribuídos
Comunicação Distribuída
Objetos Distribuídos e Invocação Remota
Walfredo Cirne walfredo.dsc.ufpb.br
Sistemas Distribuídos CORBA
Sistemas Distribuídos Comunicação Objetos Distribuídos e RMI - Parte 2 - Instituto de Informática – UFG Verão 2005 Baseado em: Tanenbaum, Capítulo 2.
Invocação de Métodos Remotos RMI
1 Comunicação Inter-Processos -> RMI -> RPC -> TCP -> UDP (Abstração de passagem de mensagem)
1 Arquitetura CORBA Repositório de Implementação Repositório de Interface cliente programa cliente proxy ORB Core ou invocação dinâmica servidor ORB Core.
Comunicação Entre Objetos Distribuídos
1 Serviços CORBA. Serviços CORBA. Funcionalidades que podem ser utilizadas por objetos distribuídos. Naming Service (Serviço de Nomes) Event and Notification.
Comunicação Inter-Processos
9 Controle de fluxo Seqüenciadores. Jumps. Escapes. Exceções.
PROGRAMAÇÃO DISTRIBUÍDA EM JAVA Verão/2001
Classes e objetos P. O. O. Prof. Grace.
Estrutura de Dados em Java
Paradigmas de Linguagens de Programação Paradima da Programação Orientada à Objetos Professor: Armando Hage Belém-2008.
Objetos Distribuídos para WEB Prof. Paulo Fernando da Silva FURB – Universidade Regional de Blumenau Pós-Graduação em Desenvolvimento WEB.
Middleware e Sistemas Distribuídos
Concorrência em Java Threads em Java.
Departamento de Estatística e Informática
Um Arquivo Seguro e Tolerante a Faltas para Corba utilizando Fragmentação e Fragmentação e Dispersão com Redundância Cristina Silva Luis Rodrigues FCUL.
Arquitetura CORBA e Objetos Distribuídos
CORBA e Desenvolvimento Baseado em Componentes
Chamada Remota de Procedimentos
Desenvolvimento de Aplicações CORBA
Sistemas Distribuídos Carlos A. G. Ferraz DI/UFPE Aula 07.
Remote Method Invocation RMI
Concorrência e Java RMI
1 Mobilidade de Código com μcode Projeto Giga Alexandre Lages
Objetos Distribuídos e invocação remota
Objetos Distribuídos Nazareno Andrade.
T. D. S. I. PARA WEB Prof. Emmanuel Nolêto. Java RMI.
Troca de Mensagens Assíncronas n Canais de comunicação são filas ilimitadas de mensagens. n Processos inserem elementos nessa flia através de comandos.
Tecgraf PUC-Rio maio de 2011 Principais conceitos de CORBA.
TMV Gestão de Redes e de Sistemas Distribuídos ???? Sumário  Arquitectura de Gestão SNMP  Arquitectura de Gestão OSI/TMN  Novas Arquitecturas.
Concorrência e thread Petrônio Júnior(pglj) Márcio Neves(mmn2)
Listas Simplesmente Encadeadas
Wagner Santos C. de Jesus
SessionBeans Marco Antonio Arquiteto de Software.
Integrações de Aplicações Empresariais Prof. Paulo Fernando da Silva UNC – Universidade do Contestado Pós-Graduação em Sistemas de Informação Aplicados.
COMUNICAÇÃO.
Java Kickstart, day 2 Semelhanças com linguagem C.
T. D. S. I. PARA WEB Prof. Emmanuel Nolêto
Objetos Distribuídos para WEB Prof. Paulo Fernando da Silva FURB – Universidade Regional de Blumenau Pós-Graduação em Desenvolvimento WEB.
GESTOR: TIC/TIC-E&P/GIDSEP versão 1 - julho/2013 Tecgraf PUC-Rio Fevereiro de 2014 IDL.
RMI (Remote Method Invocation) Bruno Edson Plínio Tadeu
RMI Objetos Distribuídos Luiz C. D´oleron SCJP
Copyright 1998, Departamento de Informática da UFPE. Todos os direitos reservados sob a legislação em vigor. Variáveis e métodos estáticos, Passagem de.
Socket em Java.
JR: Flexible Distributed Programming in an Extended Java Elmário Gomes Dutra Jr. Gustavo Romano.
Computação Distribuída João Bosco Mangueira Sobral CORBA Common Object Request Broker.
Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 Principais conceitos de CORBA.
RMI Java Remote Method Invocation em Java. Introdução Java Remote Method Invocation (Java RMI) permite desenvolver sistemas distribuídos baseados em Java.
Sistemas Distribuídos Prof. Marcus Rodrigues
Versão 1 - julho/2013 Tecgraf PUC-Rio Novembro de 2013 IDL.
Arleys Pereira Nunes de Castro - Mestrando : Modelagem computacional (SENAI-MCTI) Especialista : Sistema distribuídos
UNIVERSIDADE FEDERAL DE GOIÁS INSTITUTO DE INFORMÁTICA Sistemas Distribuídos Ciência da Computação 2o. Semestre / 2006 Prof. Fábio M. Costa
UNIVERSIDADE FEDERAL DE GOIÁS INSTITUTO DE INFORMÁTICA Sistemas Distribuídos Ciência da Computação 2o. Semestre / 2006 Prof. Fábio M. Costa
Transcrição da apresentação:

RMI - Remote Method Invocation 8/28/2003 José Alves Marques

Invocação de Métodos em Objectos Remotos Um sistema de objectos distribuídos é uma extensão ao conceito de RPC Um objecto invoca um método noutro objecto localizado remotamente. Num sistema de objectos o RPC designa-se normalmente Remote Method Invocation ou RMI A IDL é uma linguagem orientada aos objectos tipicamente baseada no C++ ou Java. 8/28/2003 José Alves Marques

Invocação de Objectos Remotos Objecto remoto Interface Remota Dados m1 m2 m3 m4 m5 m6 Código dos métodos 8/28/2003 José Alves Marques

Diferenças Relevantes Granularidade Os servidores nos sistemas cliente servidor são normalmente processos que disponibilizam interfaces para programas com alguma complexidade Num sistema de objectos pode-se conceptualmente considerar objectos de granularidade muito fina Invocação dinâmica Nos sistemas cliente servidor a ligação é forte (tightly coupled) estabelecido em tempo de compilação da IDL, fazendo com que os clientes não possam invocar serviços para os quais não tenham os stubs Nos sistemas de objectos a noção de desenvolvimento incremental tem privilegiado mecanismos que permitem um objecto invocar dinamicamente outros de que obtém a interface em tempo de execução 8/28/2003 José Alves Marques

CORBA Tem origem no Object Management Group (OMG) criado em 1989 Modelo Conceptual é uma síntese entre o modelo cliente –servidor e as arquitecturas de objectos A proposta original do Corba - Object Management Architecture foi publicada em 1990 e continha: Object Request Broker (ORB) Novo paradigma: consiste num serviço que auxilia a invocação de objectos remotos O papel do ORB é localizar o objecto, activá-lo se necessário, enviar o pedido do cliente ao objecto Serviços de suporte ao ciclo de vida dos objectos Serviços básicos como nomes, acontecimentos assíncronos, persistência, etc. 8/28/2003 José Alves Marques

CORBA CORBA 2.0 publicado em 1996 Os principais elementos da plataforma são: IDL – linguagem object oriented com suporte para herança Arquitectura –define o ambiente de suporte aos objectos, à invocação, ao ciclo de vida GIOP – General Inter Orb Protocol – protocolo de invocação remota entre Orb de fabricantes diferentes IIOP - Internet Inter Orb Protocol – implementação do GIOP para a Internet sobre protocolos TCP/IP Actualmente Actividade de normalização reduzida Vários produtos disponíveis Visigenic/Visibroker IONA 8/28/2003 José Alves Marques

Modelo de Objectos Um objecto CORBA implementa uma interface descrita na IDL CORBA Um objecto CORBA pode ser invocado remotamente através de uma referência remota Os objectos CORBA residem no servidor, os clientes podem ser objectos ou programas que enviam as mensagens correctas para os objectos Os objectos remotos são transferidos por referência. Ou seja permanecem no servidor e apenas é enviada uma referência que permite invocá-los Os objectos não têm de ser implementados numa linguagem Object Oriented podem ser em Cobol, C, etc. 8/28/2003 José Alves Marques

CORBA IDL A interface é escrita em OMG IDL A interface é object-oriented com sintaxe muito semelhante ao C++ A herança é suportada Especifica um nome de uma interface e um conjunto de métodos que os clientes podem invocar Descreve os parâmetros e o respectivo sentido in, out, inout Os métodos podem ter excepções 8/28/2003 José Alves Marques

IDL Corba - Exemplo 8/28/2003 José Alves Marques struct Rectangle{ long width,height; long x, y; }; struct GraphicalObject { string type; Rectangle enclosing; boolean isFilled; interface Shape { long getVersion(); GraphicalObject getAllstate(); //returns state of the GraphicalObject typedef sequence <Shape, 100>All; interface ShapeList { exception FullException {}; Shape newShape(in GraphicalObject g) raises (FullException); All allShapes(); //returns sequence of remote object references 8/28/2003 José Alves Marques

IDL CORBA - herança module Accounts { interface Account readonly attribute string number; readonly attribute float balance; exception InsufficientFunds (string detail); float debit (in float amount) raises (insufficientFunds); float credit (in float amount); } interface InterestAccount : Account readonly attribute float rate; 8/28/2003 José Alves Marques

Passagem de Parâmetros Todos os parâmetros cujo tipo é especificado pelo nome de uma interface é uma referência a um objecto CORBA e são passados como referências a objectos remotos. Os argumentos do tipo primitivo ou estruturas são passados por valor. Na chegada um novo objecto é criado no processo receptor (pode ser no cliente ou no servidor) 8/28/2003 José Alves Marques

Referências Remotas Para invocar uma operação remota é necessário que o objecto invocador tenha uma referência remota para o objecto As referências remotas podem ser passadas como argumentos ou como resultados de invocações remotas Analogia com o binding handle dos RPC IDL interface type name Protocol and address details Object key interface repository identifier IIOP host domain name port number adapter name object name IOR 8/28/2003 José Alves Marques

Arquitectura client or dynamic skeleton server Request Reply Implementation repository interface Client program Proxy for A ORB core client or dynamic skeleton object adapter server skeleton Servant A Request Reply Or dynamic invocation 8/28/2003 José Alves Marques

Elementos da Arquitectura ORB – núcleo – run-time da invocação remota, conjunto de funções residentes quer no cliente quer no servidor O ORB tem funções para ser inicializado e parado Operações para converter as referências remotas em cadeias de caracteres Operações para fornecer a lista de argumentos em pedidos que usem invocação dinâmica Servidor Object adapters - rotina de despacho que recebe as mensagens e invoca os stubs apropriado O nome do objecto adapter faz parte da referência remota e permite a sua invocação Cria referências remotas para os objectos Corba Despacha cada RMI via um skeleton para o método apropriado Activa o objecto Skeletons Funções de adaptação que fazem a conversão dos parâmetros de entrada e saída e o tratamento das excepções Client proxies Para as linguagens Object oriented Efectua a conversão dos parâmetros de entrada e de saída 8/28/2003 José Alves Marques

Elementos da Arquitectura Implementation repository Armazena a tabela que relaciona os object adapters e os pathnames dos ficheiros que contem a implementação dos objectos É responsável por activar servidores a pedido Localizar servidores que estão em execução Quando um servidor se inicia regista o nome do object adapter e da sua implementação. O nome do object adapter é usado para referenciar os servidores quando são registados ou quando são activados 8/28/2003 José Alves Marques

Elementos da Arquitectura Interface repository Dá informação sobre as interfaces registadas Para uma interface pode dar a informação dos métodos e dos respectivos parâmetros O compilador de IDL atribui um número único a cada tipo IDL que compila Esta facilidade permite a reflexão em CORBA. Se um cliente recebe uma referência remota para um novo objecto CORBA de que não tem um proxy, pode ir buscar esta informação ao Interface repository 8/28/2003 José Alves Marques

Invocação A inovação do método tem por omissão uma semântica at-most-once A heterogeneidade é resolvida com a conversão para CDR – Common Data Representation Inclui 15 tipos básicos Receiver makes it right index in sequence of bytes notes on representation 0-3 4-7 8-11 12-15 16-19 20-23 24-27 5 “Smit” “h____” 6 “Lond” “on____” 1934 4 bytes length of string “Smith” London unsigned long 8/28/2003 José Alves Marques

CORBA CDR index in sequence of bytes notes on representation 0-3 4-7 8-11 12-15 16-19 20-23 24-27 5 “Smit” “h____” 6 “Lond” “on____” 1934 4 bytes length of string “Smith” London unsigned long Struct Pessoa { string Nome; string Lugar; unsigned long Ano; }; Representa a struct Person com os valores: {‘Smith’, ‘London’, 1934} 8/28/2003 José Alves Marques

CORBA – Invocação Dinâmica O CORBA não permite que novas classes sejam carregadas dinamicamente Para dinamicamente invocar um objecto em tempo de execução existe a invocação dinâmica O cliente não precisa de ter os proxies As invocações remotas são construídas dinamicamente Novos servidores podem ser usados por clientes já existentes Funcionamento O Cliente usa o Interface Repository para obter a informação sobre os métodos e argumentos. Cria a mensagem de acordo com a especificação da interface O Cliente selecciona uma interface e envia o pedido para o respectivo objecto. 8/28/2003 José Alves Marques

Java RMI 8/28/2003 José Alves Marques

RMI / IIOP Remote Method Invocation: mecanismo de chamada remota a métodos Java Utilizado para RPCs entre objectos Java distribuídos Mantém a semântica de uma chamada local, para objectos distantes Efectua automaticamente o empacotamento e desempacotamento dos parâmetros Envia as mensagens de pedido e resposta Faz o agulhamento para encontrar o objecto e o método pretendido 8/28/2003 José Alves Marques

Java RMI O RMI Java pressupõe que se utiliza um ambiente Java de linguagem única, pelo que não se colocam alguns dos problemas que o CORBA pretende resolver. Apesar do ambiente uniforme um objecto tem conhecimento que invoca um método remoto porque tem de tratar RemoteExceptions A interface do objecto remoto por sua vez tem de ser uma extensão da interface Remote 8/28/2003 José Alves Marques

Java RMI No Java RMI os parâmetros de um método assumem-se como entradas (input) e o resultado do método como parâmetro de saída (output) Quando o parâmetro é um objecto remoto é sempre passado como uma referência para um objecto remoto Quando o parâmetro é um objecto local é serializado e passado por valor. Quando um objecto é passado por valor uma nova instância é criada remotamente Os objectos susceptíveis de serem passados por valor têm de implementar a interface Serializable. Todos os tipos primitivos e objectos remotos são serializáveis. Quando um objecto é serializado a informação sobre a sua classe é registada com a localização da classe (URL) permitindo o seu carregamento dinâmico. Quando um objecto é passado por valor se o receptor não tiver a classe respectiva o seu código é descarregado automaticamente. 8/28/2003 José Alves Marques

Remote interfaces de Shape e ShapeList import java.rmi*; import java.util.Vector; public interface Shape extends Remote { int getVersion() throws RemoteException; GraphicalObject getAllState() throws RemoteException; } public interface ShapeList extends Remote { Shape newShape(GraphicalObject g) throws RemoteException; Vector allShapes() throws RemoteException; 8/28/2003 José Alves Marques

JNDI Java Naming and Directory Interface Mecanismo de nomes do J2EE Utilizado para associar nomes a recursos e objectos de forma portável Identificação, localização, partilha Mapeia nomes em referências para objectos Uma instancia do registry deve executar-se em todos servidores que têm objectos remotos. Os clientes tem de dirigir as suas pesquisas para o servidor pretendido 8/28/2003 José Alves Marques

Funções do registry void rebind (Sting name, Remote obj) This method is used by a server to register the identifier of a remote object by name. void bind (String name, Remote obj) This method can alternatively be used by a server to register a remote object by name, but if the name is already bound to a remote object reference an exception is thrown. void unbind (Sting name, remote obj) This method removes a binding. Remote lookup (String name) This method is used by clients to look up a remote object by name. A remote object reference is returned. String [ ] list ( ) This method returns an array of Strings containing the names bound in the registry. 8/28/2003 José Alves Marques

classe ShapeListServer com o método main import java.rmi.*; public class ShapeListServer{ public static void main(String args[]){ System.setSecurityManager(new RMISecurityManager()); try{ ShapeList aShapeList = new ShapeListServant(); Naming.rebind(“Shape List”, aShapeList ); System.out.println(“ShapeList server ready” ); }catch(Exception e) {System.out.println(“ShapeList server main” + e.getMessage());} } 8/28/2003 José Alves Marques

Server em Java O main tem de criar um gestor de segurança para permitir controlar as classe que são carregadas a partir de outros sites. No exemplo anterior é um gestor já existente A implementação dos métodos da interface remota é uma classe servant No exemplo seguinte o método newShape pode ser chamado uma factory porque permite ao cliente criar objectos remotos. 8/28/2003 José Alves Marques

Classe ShapeListServant implementa a interface ShapeList import java.rmi.*; import java.rmi.server.UnicastRemoteObject; Import java.util.Vector; public class ShapeListServant extends UnicastRemoteObject implements ShapeList { private Vector theList; //contains the list of Shapes private int version; public ShapeListServant()throws RemoteException{...} public Shape newShape(GraphicalObject g) throws RemoteException { version++; Shape s = new ShapeServant( g, version); theList.addElement(s); return s; } public Vector allShape()throws RemoteException{...} public int getVersion() throws RemoteException{...} 8/28/2003 José Alves Marques

Classes que suportam o Java RMI RemoteObject RemoteServer Activatable UnicastRemoteObject <servant class> 8/28/2003 José Alves Marques

Cliente da classe ShapeList import java.rmi.*; import java.rmi.server.*; import java.util.Vector; public class ShapeListClient{ public static void main(String args[]){ System.setSecurityManager(new RMISecurityManager()); ShapeList aShapeList = null; try{ aShapeList = (ShapeList)Naming.lookup(“//bruno.ShapeList”); Vector sList = aShapeList.allShapes(); }catch/RemoteException e) {System.out.println(e.getMessage()); }catch(Exception e){System.out.println(“Client:”+e.getMessage());} } 8/28/2003 José Alves Marques

Java RMI – mecanismo de Reflexão A reflexão é usada para passar informação nas mensagens de invocação sobre o método que se pretende executar É conseguido com a classe Method na package de reflection Cada instância de Method representa as características de um método (classe, tipo dos argumentos, valor de retorno, e excepções) Uma instância de Method pode ser invocada num objecto de uma classe apropriada pelo método invoke O método invoke requer dois parâmetros O primeiro é o objecto a invocar O segundo é um vector de Object contendo os argumentos 8/28/2003 José Alves Marques

Arquitectura J2EE 8/28/2003 José Alves Marques

8/28/2003 José Alves Marques

Comparação – IDL 8/28/2003 José Alves Marques DCOM - IDL CORBA - IDL Java/RMI - Interface definition [ uuid(7371a240-2e51-11d0-b4c1-444553540000), version(1.0) ] library SimpleStocks { importlib("stdole32.tlb"); [ uuid(BC4C0AB0-5A45-11d2-99C5-00A02414C655), dual ] interface IStockMarket : IDispatch { HRESULT get_price([in] BSTR p1, [out, retval] float * rtn); } [ uuid(BC4C0AB3-5A45-11d2-99C5-00A02414C655), ] coclass StockMarket { interface IStockMarket; }; }; module SimpleStocks { interface StockMarket { float get_price( in string symbol ); }; }; package SimpleStocks; import java.rmi.*; import java.util.*; public interface StockMarket extends java.rmi.Remote { float get_price( String symbol ) throws RemoteException; } 8/28/2003 José Alves Marques

8/28/2003 José Alves Marques DCOM - Client implementation CORBA - Client implementation Java/RMI - Client implementation // // // StockMarketClient // // import simplestocks.*; public class StockMarketClient { public static void main(String[] args) { try { IStockMarket market = (IStockMarket)new simplestocks.StockMarket(); System.out.println( "The price of MY COMPANY is " + market.get_price("MY_COMPANY") ); } catch (com.ms.com.ComFailException e) { System.out.println( "COM Exception:" ); System.out.println( e.getHResult() ); System.out.println( e.getMessage() ); } } } // // // StockMarketClient // // import org.omg.CORBA.*; import org.omg.CosNaming.*; import SimpleStocks.*; public class StockMarketClient { public static void main(String[] args) { try { ORB orb = ORB.init(); NamingContext root = NamingContextHelper.narrow( orb.resolve_initial_references("NameService") ); NameComponent[] name = new NameComponent[1] ; name[0] = new NameComponent("NASDAQ",""); StockMarket market = StockMarketHelper.narrow(root.resolve(name)); System.out.println("Price of MY COMPANY is " + market.get_price("MY_COMPANY")); } catch( SystemException e ) { System.err.println( e ); } } } // // // StockMarketClient // // import java.rmi.*; import java.rmi.registry.*; import SimpleStocks.*; public class StockMarketClient { public static void main(String[] args)throws Exception { if(System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } StockMarket market = (StockMarket)Naming.lookup("rmi://localhost/NASDAQ"); System.out.println( "The price of MY COMPANY is " + market.get_price("MY_COMPANY") ); } } 8/28/2003 José Alves Marques

8/28/2003 José Alves Marques DCOM - Server implementation CORBA - Server implementation Java/RMI - Server implementation // // // StockMarketServer // // import com.ms.com.*; import simplestocks.*; public class StockMarket implements IStockMarket { private static final String CLSID = "BC4C0AB3-5A45-11d2-99C5-00A02414C655"; public float get_price( String symbol ) { float price = 0; for( int i = 0; i < symbol.length(); i++ ) { price += (int) symbol.charAt(i); } price /= 5; return price; } } // // // StockMarketServer // // import org.omg.CORBA.*; import SimpleStocks.*; public class StockMarketImpl extends _StockMarketImplBase { public float get_price( String symbol ) { float price = 0; for(int i = 0; i < symbol.length(); i++) { price += (int) symbol.charAt( i ); } price /= 5; return price; } public StockMarketImpl( String name ) { super( name ); } } // // // StockMarketServer // // package SimpleStocks; import java.rmi.*; import java.rmi.server.UnicastRemoteObject; public class StockMarketImpl extends UnicastRemoteObject implements StockMarket { public float get_price( String symbol ) { float price = 0; for( int i = 0; i < symbol.length(); i++ ) { price += (int) symbol.charAt( i ); } price /= 5; return price; } public StockMarketImpl( String name ) throws RemoteException { try { Naming.rebind( name, this ); } catch( Exception e ) { System.out.println( e ); } } } 8/28/2003 José Alves Marques

8/28/2003 José Alves Marques CORBA - Server Main Java/RMI - Server Main // // // StockMarketServer Main // // import org.omg.CORBA.*; import org.omg.CosNaming.*; import SimpleStocks.*; public class StockMarketServer { public static void main(String[] args) { try { ORB orb = ORB.init(); BOA boa = orb.BOA_init(); StockMarketImpl stockMarketImpl = new StockMarketImpl("NASDAQ"); boa.obj_is_ready( stockMarketImpl ); org.omg.CORBA.Object object = orb.resolve_initial_references("NameService"); NamingContext root = NamingContextHelper.narrow( object ) ; NameComponent[] name = new NameComponent[1]; name[0] = new NameComponent("NASDAQ", ""); root.rebind(name, stockMarketImpl); boa.impl_is_ready(); } catch( Exception e ) { e.printStackTrace(); } } } // // // StockMarketServer Main // // import java.rmi.*; import java.rmi.server.UnicastRemoteObject; import SimpleStocks.*; public class StockMarketServer { public static void main(String[] args) throws Exception { if(System.getSecurityManager() == null) { System.setSecurityManager(new RMISecurityManager()); } StockMarketImpl stockMarketImpl = new StockMarketImpl("NASDAQ"); } } 8/28/2003 José Alves Marques